tools/fault-injection-service/FileSystem/failure_injector_fs.h (102 lines of code) (raw):

/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS,WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ #ifndef __FAILURE_INJECTOR_FS_H #define __FAILURE_INJECTOR_FS_H #define FUSE_USE_VERSION 31 #ifdef HAVE_CONFIG_H #include <config.h> #endif #ifdef linux /* For pread()/pwrite()/utimensat() */ #define _XOPEN_SOURCE 700 #endif #include <fuse3/fuse.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <dirent.h> #include <errno.h> #ifdef __FreeBSD__ #include <sys/socket.h> #include <sys/un.h> #endif #include <sys/time.h> #ifdef HAVE_SETXATTR #include <sys/xattr.h> #endif #include<string> #include"failure_injector.h" #include "run_grpc_service.h" namespace NoiseInjector { namespace FileSystem { class FailureInjectorFs { private: /* Helper function for mknod operation */ static int mknod_wrapper(int dirfd, const char *path, const char *link, int mode, dev_t rdev); public: FailureInjectorFs(FailureInjector *); /* * Following operations correspond with their corresponding * Fuse operations vector. */ static void *fifs_init(struct fuse_conn_info *conn, struct fuse_config *cfg); static int fifs_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi); static int fifs_access(const char *path, int mask); static int fifs_readlink(const char *path, char *buf, size_t size); static int fifs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi, enum fuse_readdir_flags flags); static int fifs_mknod(const char *path, mode_t mode, dev_t rdev); static int fifs_mkdir(const char *path, mode_t mode); static int fifs_unlink(const char *path); static int fifs_rmdir(const char *path); static int fifs_symlink(const char *from, const char *to); static int fifs_rename(const char *from, const char *to, unsigned int flags); static int fifs_link(const char *from, const char *to); static int fifs_chmod(const char *path, mode_t mode, struct fuse_file_info *fi); static int fifs_chown(const char *path, uid_t uid, gid_t gid, struct fuse_file_info *fi); static int fifs_truncate(const char *path, off_t size, struct fuse_file_info *fi); #ifdef HAVE_UTIMENSAT static int fifs_utimens(const char *path, const struct timespec ts[2], struct fuse_file_info *fi); #endif static int fifs_create(const char *path, mode_t mode, struct fuse_file_info *fi); static int fifs_open(const char *path, struct fuse_file_info *fi); static int fifs_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi); static int fifs_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi); static int fifs_statfs(const char *path, struct statvfs *stbuf); static int fifs_release(const char *path, struct fuse_file_info *fi); static int fifs_fsync(const char *path, int isdatasync, struct fuse_file_info *fi); #ifdef HAVE_POSIX_FALLOCATE static int fifs_fallocate(const char *path, int mode, off_t offset, off_t length, struct fuse_file_info *fi); #endif #ifdef HAVE_SETXATTR static int fifs_setxattr(const char *path, const char *name, const char *value, size_t size, int flags); static int fifs_getxattr(const char *path, const char *name, char *value, size_t size); static int fifs_listxattr(const char *path, char *list, size_t size); static int fifs_removexattr(const char *path, const char *name); #endif /* HAVE_SETXATTR */ static off_t fifs_lseek(const char *path, off_t off, int whence, struct fuse_file_info *fi); /* Helper functions to setup/access Fuse operations vector */ static bool CheckForInjectedError(std::string path, std::string op, int *injected_error); static void FillCorruptData(char *buf, size_t size); void load_operations(); const struct fuse_operations *getOperations(); FailureInjector& GetFailureInjector(); private: /* Fuse operations vector */ static struct fuse_operations mFuseOperationsVec; static FailureInjector *mFailureInjector; static RunGrpcService *mGrpcSever; }; } } #endif /* __FAILURE_INJECTOR_FS_H */