From 0dde10c306de3aed8a6e9906119e5f667b8ecddc Mon Sep 17 00:00:00 2001 From: Ravin Perera <33562092+ravinsp@users.noreply.github.com> Date: Mon, 25 Nov 2019 19:30:15 +0530 Subject: [PATCH] Contract state monitoring and rollback infrastructure. (#61) --- .dockerignore | 4 +- CMakeLists.txt | 28 +- Dockerfile | 7 + README.md | 12 +- cluster-create.sh | 5 +- cluster-start.sh | 1 + examples/echocontract/contract.js | 5 +- libfuse3.so.3 | Bin 0 -> 901528 bytes src/conf.cpp | 31 +- src/conf.hpp | 8 +- src/cons/cons.cpp | 2 - src/cons/statemap_handler.cpp | 177 --- src/cons/statemap_handler.hpp | 11 - src/main.cpp | 7 +- src/proc/proc.cpp | 93 +- src/proc/proc.hpp | 6 +- src/statefs/hasher.cpp | 55 + src/statefs/hasher.hpp | 27 + src/statefs/hashmap_builder.cpp | 334 +++++ src/statefs/hashmap_builder.hpp | 35 + src/statefs/hashtree_builder.cpp | 246 ++++ src/statefs/hashtree_builder.hpp | 48 + src/statefs/state_common.cpp | 60 + src/statefs/state_common.hpp | 60 + src/statefs/state_monitor/fusefs.cpp | 1342 +++++++++++++++++++ src/statefs/state_monitor/fusefs.hpp | 9 + src/statefs/state_monitor/state_monitor.cpp | 519 +++++++ src/statefs/state_monitor/state_monitor.hpp | 77 ++ src/statefs/state_restore.cpp | 200 +++ src/statefs/state_restore.hpp | 28 + src/util.cpp | 9 + src/util.hpp | 6 +- 32 files changed, 3222 insertions(+), 230 deletions(-) create mode 100755 libfuse3.so.3 delete mode 100644 src/cons/statemap_handler.cpp delete mode 100644 src/cons/statemap_handler.hpp create mode 100644 src/statefs/hasher.cpp create mode 100644 src/statefs/hasher.hpp create mode 100644 src/statefs/hashmap_builder.cpp create mode 100644 src/statefs/hashmap_builder.hpp create mode 100644 src/statefs/hashtree_builder.cpp create mode 100644 src/statefs/hashtree_builder.hpp create mode 100644 src/statefs/state_common.cpp create mode 100644 src/statefs/state_common.hpp create mode 100644 src/statefs/state_monitor/fusefs.cpp create mode 100644 src/statefs/state_monitor/fusefs.hpp create mode 100644 src/statefs/state_monitor/state_monitor.cpp create mode 100644 src/statefs/state_monitor/state_monitor.hpp create mode 100644 src/statefs/state_restore.cpp create mode 100644 src/statefs/state_restore.hpp diff --git a/.dockerignore b/.dockerignore index bb73e4aa..dcc16fcd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,4 @@ **/** -!build/hpcore \ No newline at end of file +!build/hpcore +!build/hpstatemon +!libfuse3.so.3 \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 18ef9990..7f7ddbad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,10 +40,19 @@ target_link_libraries(hpsupport ${CMAKE_DL_LIBS} ) +add_library(hpstatefs + src/statefs/hasher.cpp + src/statefs/state_common.cpp + src/statefs/hashmap_builder.cpp + src/statefs/hashtree_builder.cpp + src/statefs/state_restore.cpp +) +target_link_libraries(hpstatefs hpsupport) + add_library(hpproc src/proc/proc.cpp ) -target_link_libraries(hpproc hpsupport) +target_link_libraries(hpproc hpsupport hpstatefs) add_library(hpbill src/bill/corebill.cpp @@ -82,7 +91,6 @@ target_link_libraries(hpusr hpsupport hpsock hpschema) add_library(hpcons src/cons/cons.cpp src/cons/ledger_handler.cpp - src/cons/statemap_handler.cpp ) target_link_libraries(hpcons hpsupport hpproc hpp2p hpusr) @@ -100,6 +108,21 @@ target_link_libraries(hpcore hpcons ) +add_executable(hpstatemon + src/statefs/state_monitor/fusefs.cpp + src/statefs/state_monitor/state_monitor.cpp + src/statefs/hasher.cpp + src/statefs/state_common.cpp +) +target_link_libraries(hpstatemon + hpsupport + libfuse3.so.3 +) + +add_dependencies(hpcore + hpstatemon +) + target_precompile_headers(hpsupport PUBLIC src/pchheader.hpp) target_precompile_headers(hpcore REUSE_FROM hpsupport) target_precompile_headers(hpsock REUSE_FROM hpsupport) @@ -107,6 +130,7 @@ target_precompile_headers(hpschema REUSE_FROM hpsupport) target_precompile_headers(hpp2p REUSE_FROM hpsupport) target_precompile_headers(hpusr REUSE_FROM hpsupport) target_precompile_headers(hpcons REUSE_FROM hpsupport) +target_precompile_headers(hpstatemon REUSE_FROM hpsupport) # Create docker image from hpcore build output with 'make docker' # Requires docker to be runnable without 'sudo' diff --git a/Dockerfile b/Dockerfile index 9d59a341..dfcac61c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,14 @@ # Otherwise, hpcore itself can run on any docker image like ubuntu or debian without NodeJs. FROM node:10.17.0-buster-slim +# Copy fuse shared library and register it. +COPY ./libfuse3.so.3 /usr/local/lib/ +RUN ldconfig +# Install fuse. +RUN apt-get update && apt-get install -y fuse && rm -rf /var/lib/apt/lists/* + # hpcore binary is copied to /hp directory withtin the docker image. WORKDIR /hp COPY ./build/hpcore . +COPY ./build/hpstatemon . ENTRYPOINT ["/hp/hpcore"] \ No newline at end of file diff --git a/README.md b/README.md index 12fd407b..38c646b7 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ A C++ version of hotpocket designed for production envrionments, original protot * RapidJSON - http://rapidjson.org * P2P Protocol - https://google.github.io/flatbuffers/ * TLS - https://www.openssl.org/ +* Fuse filesystem - https://github.com/libfuse/libfuse ## Steps to setup Hot Pocket @@ -68,6 +69,13 @@ Example: When you make a change to `p2pmsg_content_.fbc` defnition file, you nee 3. Run `./config && make` 4. Run `sudo make install` +#### Install libfuse +1. `sudo apt-get install -y meson ninja-build pkg-config` +2. Download [libfuse 3.8](https://github.com/libfuse/libfuse/releases/download/fuse-3.8.0/fuse-3.8.0.tar.xz) and extract. +3. `mkdir build; cd build` +4. `meson .. && ninja` +6. `sudo ninja install` + #### Run ldconfig `sudo ldconfig` @@ -98,4 +106,6 @@ Code is divided into subsystems via namespaces. **sock::** Handles generic web sockets functionality. Mainly acts as a wrapper for boost/beast. -**util::** Contains shared data structures/helper functions used by multiple subsystems. \ No newline at end of file +**util::** Contains shared data structures/helper functions used by multiple subsystems. + +**statefs::** Fuse-based state filesystem monitoring and contract state maintenence subsystem. \ No newline at end of file diff --git a/cluster-create.sh b/cluster-create.sh index 274380d4..47bf3726 100755 --- a/cluster-create.sh +++ b/cluster-create.sh @@ -50,8 +50,9 @@ do binargs: './bin/contract.js', \ peerport: ${peerport}, \ pubport: ${pubport}, \ - roundtime: 1000, - loglevel: 'debug' + roundtime: 1000, \ + loglevel: 'debug', \ + loggers:['console'] \ }, null, 2)" > hp.cfg rm tmp.json diff --git a/cluster-start.sh b/cluster-start.sh index f253960b..977f8b63 100755 --- a/cluster-start.sh +++ b/cluster-start.sh @@ -23,5 +23,6 @@ let pubport=8080+$n # We specify --name for each node so it will be the virtual dns name for each node. docker run --rm -t -i --network=hpnet --name=node${n} \ -p ${pubport}:${pubport} \ + --device /dev/fuse --cap-add SYS_ADMIN --security-opt apparmor:unconfined \ --mount type=bind,source=${clusterloc}/node${n},target=/contract \ hpcore:latest run /contract \ No newline at end of file diff --git a/examples/echocontract/contract.js b/examples/echocontract/contract.js index 87b83456..abe94886 100644 --- a/examples/echocontract/contract.js +++ b/examples/echocontract/contract.js @@ -6,11 +6,10 @@ const fs = require('fs') //console.log("===Sample contract started==="); //console.log("Contract args received from hp: " + input); -let hpargsstr = fs.readFileSync(0, 'utf8'); -let hpargs = JSON.parse(hpargsstr); +let hpargs = JSON.parse( fs.readFileSync(0, 'utf8')); // We just save execution args as an example state file change. -fs.appendFileSync("state/execargs.txt", hpargsstr + "\n"); +fs.appendFileSync("state/exects.txt", "ts:" + hpargs.ts + "\n"); Object.keys(hpargs.usrfd).forEach(function (key, index) { let userfds = hpargs.usrfd[key]; diff --git a/libfuse3.so.3 b/libfuse3.so.3 new file mode 100755 index 0000000000000000000000000000000000000000..e4eedf2a30769e8c3aad9e93fdb8e5346f19bc3d GIT binary patch literal 901528 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
@Ib6s)?P@$i-)h#q*~xljQOpas&X)o<%Ab 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

^tD2sxYom=Hp55h9{SAOb=V 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�?e~gA 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

H!f` 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 G%l|K~H31R; literal 0 HcmV?d00001 diff --git a/src/conf.cpp b/src/conf.cpp index 9bfad565..ed46ca94 100644 --- a/src/conf.cpp +++ b/src/conf.cpp @@ -17,15 +17,6 @@ contract_config cfg; const static char *MODE_PASSIVE = "passive"; const static char *MODE_ACTIVE = "active"; -// provide a safe std::string overload for realpath -std::string realpath(std::string path) -{ - std::array buffer; - ::realpath(path.c_str(), buffer.data()); - buffer[PATH_MAX] = '\0'; - return buffer.data(); -} - /** * Loads and initializes the contract config for execution. Must be called once during application startup. * @return 0 for success. -1 for failure. @@ -91,7 +82,7 @@ int create_contract() boost::filesystem::create_directories(ctx.configdir); boost::filesystem::create_directories(ctx.histdir); boost::filesystem::create_directories(ctx.statedir); - boost::filesystem::create_directories(ctx.statemapdir); + boost::filesystem::create_directories(ctx.statehistdir); //Create config file with default settings. @@ -128,9 +119,16 @@ int create_contract() * Updates the contract context with directory paths based on provided base directory. * This is called after parsing HP command line arg in order to populate the ctx. */ -void set_contract_dir_paths(std::string basedir) +void set_contract_dir_paths(std::string exepath, std::string basedir) { - if (basedir == "") + if (exepath.empty()) + { + // this code branch will never execute the way main is currently coded, but it might change in future + std::cerr << "Executable path must be specified\n"; + exit(1); + } + + if (basedir.empty()) { // this code branch will never execute the way main is currently coded, but it might change in future std::cerr << "a contract directory must be specified\n"; @@ -138,7 +136,10 @@ void set_contract_dir_paths(std::string basedir) } // resolving the path through realpath will remove any trailing slash if present - basedir = realpath(basedir); + basedir = util::realpath(basedir); + + ctx.exedir = boost::filesystem::path(util::realpath(exepath)).parent_path().string(); + ctx.statemonexepath = ctx.exedir + "/" + "hpstatemon"; ctx.contractdir = basedir; ctx.configdir = basedir + "/cfg"; @@ -147,7 +148,7 @@ void set_contract_dir_paths(std::string basedir) ctx.tlscertfile = ctx.configdir + "/tlscert.pem"; ctx.histdir = basedir + "/hist"; ctx.statedir = basedir + "/state"; - ctx.statemapdir = basedir + "/statemap"; + ctx.statehistdir = basedir + "/statehist"; ctx.logdir = basedir + "/log"; } @@ -503,7 +504,7 @@ int validate_contract_dir_paths() ctx.configfile, ctx.histdir, ctx.statedir, - ctx.statemapdir, + ctx.statehistdir, ctx.tlskeyfile, ctx.tlscertfile}; diff --git a/src/conf.hpp b/src/conf.hpp index 9ea265a7..286f6ac1 100644 --- a/src/conf.hpp +++ b/src/conf.hpp @@ -24,11 +24,13 @@ enum OPERATING_MODE struct contract_ctx { std::string command; // The CLI command issued to launch HotPocket + std::string exedir; // Hot Pocket executable dir. + std::string statemonexepath;// State monitor executable file path. std::string contractdir; // Contract base directory full path std::string histdir; // Contract history dir full path - std::string statedir; // Contract state dir full path - std::string statemapdir; // Contract state map dir (.merkel files) full path + std::string statedir; // Contract executing state dir full path (This is the fuse mount point) + std::string statehistdir; // Contract state history dir full path std::string logdir; // Contract log dir full path std::string configdir; // Contract config dir full path std::string configfile; // Full path to the contract config file @@ -90,7 +92,7 @@ int rekey(); int create_contract(); -void set_contract_dir_paths(std::string basedir); +void set_contract_dir_paths(std::string exepath, std::string basedir); //------Internal-use functions for this namespace. diff --git a/src/cons/cons.cpp b/src/cons/cons.cpp index 07c34f86..135255bb 100644 --- a/src/cons/cons.cpp +++ b/src/cons/cons.cpp @@ -12,7 +12,6 @@ #include "../crypto.hpp" #include "../proc/proc.hpp" #include "ledger_handler.hpp" -#include "statemap_handler.hpp" #include "cons.hpp" namespace p2pmsg = fbschema::p2pmsg; @@ -590,7 +589,6 @@ void apply_ledger(const p2p::proposal &cons_prop) extract_user_outputs_from_contract_bufmap(useriobufmap); broadcast_npl_output(nplbufpair.output); - update_state_blockmap(updated_blocks); } /** diff --git a/src/cons/statemap_handler.cpp b/src/cons/statemap_handler.cpp deleted file mode 100644 index 2e161192..00000000 --- a/src/cons/statemap_handler.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include "../pchheader.hpp" -#include "../conf.hpp" -#include "../hplog.hpp" -#include "../proc/proc.hpp" - -namespace cons -{ - -constexpr size_t BLOCK_SIZE = 4 * 1024 * 1024; //this is the logical block size files are decomposed in, it's also the size of the merkle tree -constexpr size_t HASH_SIZE = crypto_generichash_blake2b_BYTES; -constexpr size_t MAX_HASHES = BLOCK_SIZE / HASH_SIZE; -constexpr const char *MERKLE_EXTENSION = ".merkle"; - -struct B2H // blake2b hash is 32 bytes which we store as 4 quad words -{ - uint64_t data[4]; -}; - -// provide some helper functions for working with 32 byte hash type -bool operator==(B2H &lhs, B2H &rhs) -{ - return lhs.data[0] == rhs.data[0] && lhs.data[1] == rhs.data[1] && lhs.data[2] == rhs.data[2] && lhs.data[3] == rhs.data[3]; -} - -// the actual hash function, note that the B2H datatype is always passed by value being only 4 quadwords -B2H hash(const void *ptr, size_t len) -{ - B2H ret; - crypto_generichash_blake2b_state state; - crypto_generichash_blake2b_init(&state, NULL, 0, HASH_SIZE); - crypto_generichash_blake2b_update(&state, - reinterpret_cast(ptr), len); - crypto_generichash_blake2b_final( - &state, - reinterpret_cast(&ret), - HASH_SIZE); - return ret; -} - -/** - * Updates the .merkel block map for the given state file. - * @param filepath Full path of the state file. - * @param hinted_blocks Set of updated file block ids. If empty full merkel block map will be recomputed. - */ -int update_file_blockmap(const std::string &filepath, const std::set &hinted_blocks) -{ - // .merkel file path will be corresponding path in "statemap" directory. - std::string merkle_fn; - const size_t relative_path_len = filepath.length() - conf::ctx.statedir.length(); - merkle_fn.reserve(conf::ctx.statemapdir.length() + relative_path_len + 7); - merkle_fn.append(conf::ctx.statemapdir); - merkle_fn.append(filepath.substr(conf::ctx.statedir.length(), relative_path_len)); - merkle_fn.append(MERKLE_EXTENSION); - - // To benefit from hint mode, the .merkle file must already exist. If not we simply disable hint mode - // because we anyway have to rebuild entire merkle file from scratch. - bool hint_mode = !hinted_blocks.empty(); - if (access(merkle_fn.c_str(), F_OK) == -1) - hint_mode = false; - - // open the target file for which we are building or updating a merkle tree - FILE *f = fopen(filepath.c_str(), "rb"); - if (!f) - { - LOG_ERR << "Failed to open state file: " << filepath << " for reading."; - return -1; - } - - // the merkle tree structure is only 4mb and could technically sit on stack in most cases but - // TODO: ******Why can't we allocate this on the stack? - auto merkle_tree = std::make_unique(MAX_HASHES); - // same with the read buffer - auto read_buffer = std::make_unique(BLOCK_SIZE); - - // this iterator will be used if we are in hint mode - auto hint = hinted_blocks.begin(); - - size_t block_counter = 0; - size_t block_location = 0; - - while (true) - { - // if hint blocks have been specified we'll seek to specific blocks in the file based on hint list. - if (hint_mode) - { - // check if we've run out of elements - if (hint == hinted_blocks.end()) - break; - - // get the next block on their list - block_location = *hint++; - - // seek the file cursor to the block - fseek(f, block_location * BLOCK_SIZE, SEEK_SET); - } - - // read the block - int bytesread = fread(read_buffer.get(), 1, BLOCK_SIZE, f); - if (bytesread <= 0) - break; - - // calculate the block hash - merkle_tree[block_location++] = hash(read_buffer.get(), std::min(BLOCK_SIZE, (size_t)bytesread)); - block_counter++; - } - - fclose(f); - - // now that we've computed all the block hashes we are interested in we have to deal with the .merkle file - - // open the .merkle file - // if we are in hint_mode we will open it in rb+ which will preserve its contents - // otherwise we will truncate it if it already exists, because we will have to overwrite everything anyway - FILE *fm = fopen(merkle_fn.c_str(), (hint_mode ? "rb+" : "wb+")); - if (!fm) - { - LOG_ERR << "Failed to open merkle file: " << filepath << " for writing."; - return -1; - } - - // get the size of the .merkle file - fseek(fm, 0L, SEEK_END); - const size_t len = ftell(fm); - rewind(fm); - - // write the updated hashes - if (hint_mode) - { - // write selectively the updated block hashes - const int fd = fileno(fm); - for (int block : hinted_blocks) - pwrite(fd, &(merkle_tree[block]), HASH_SIZE, HASH_SIZE * block); - } - else - { - // write the whole tree to the file - fwrite(reinterpret_cast(merkle_tree.get()), 1, std::min(BLOCK_SIZE, HASH_SIZE * block_counter), fm); - } - - // compute the root hash - - B2H root_hash; - - if (hint_mode) - { - // if we only updated selective hashes (hint mode) then now we need to compute a hash over the whole merkle file - // so we first need to read it in - rewind(f); - int bytesread = fread(read_buffer.get(), 1, BLOCK_SIZE, f); - if (bytesread <= 0) - fprintf(stderr, "could not read merkle file after writing to it?!\n"); - - // now simply compute the hash of what we just read, that's our root hash - root_hash = hash(read_buffer.get(), std::min(BLOCK_SIZE, (size_t)bytesread)); - } - else - { - // if we've just written out the whole merkle tree we already know it - root_hash = hash(merkle_tree.get(), std::min(BLOCK_SIZE, HASH_SIZE * block_counter)); - } - - fclose(fm); -} - -/** - * Updates the state block map for the files updated as specified by the provided blockmap. - * TODO: This doesn't currently support deleted file tracking. - */ -void update_state_blockmap(const proc::contract_fblockmap_t &updates) -{ - for (const auto &[filepath, blocks] : updates) - { - update_file_blockmap(filepath, blocks); - } -} - -} // namespace cons \ No newline at end of file diff --git a/src/cons/statemap_handler.hpp b/src/cons/statemap_handler.hpp deleted file mode 100644 index 7e295acb..00000000 --- a/src/cons/statemap_handler.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _HP_CONS_STATEMAP_HANDLER_ -#define _HP_CONS_STATEMAP_HANDLER_ - -#include "../proc/proc.hpp" - -namespace cons -{ -void update_state_blockmap(const proc::contract_fblockmap_t &updates); -} - -#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 906beb29..3bccc4b9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,6 +11,7 @@ #include "usr/usr.hpp" #include "p2p/p2p.hpp" #include "cons/cons.hpp" +#include "statefs/state_common.hpp" /** * Parses CLI args and extracts hot pocket command and parameters given. @@ -35,7 +36,7 @@ int parse_cmd(int argc, char **argv) { // We inform the conf subsystem to populate the contract directory context values // based on the directory argument from the command line. - conf::set_contract_dir_paths(argv[2]); + conf::set_contract_dir_paths(argv[0], argv[2]); return 0; } @@ -114,7 +115,7 @@ void std_terminate() noexcept int main(int argc, char **argv) { //seed rand - srand(time(0)); + srand(time(0)); // Register exception handler for std exceptions. std::set_terminate(&std_terminate); @@ -172,6 +173,8 @@ int main(int argc, char **argv) if (p2p::init() != 0 || usr::init() != 0 || cons::init() != 0) return -1; + statefs::init(conf::ctx.statehistdir); + // After initializing primary subsystems, register the SIGINT handler. signal(SIGINT, signal_handler); diff --git a/src/proc/proc.cpp b/src/proc/proc.cpp index 167d6968..907ab697 100644 --- a/src/proc/proc.cpp +++ b/src/proc/proc.cpp @@ -4,6 +4,9 @@ #include "../fbschema/common_helpers.hpp" #include "../fbschema/p2pmsg_container_generated.h" #include "../fbschema/p2pmsg_content_generated.h" +#include "../statefs/hasher.hpp" +#include "../statefs/state_common.hpp" +#include "../statefs/hashtree_builder.hpp" #include "proc.hpp" namespace proc @@ -34,6 +37,9 @@ std::vector hpscfds; // Holds the contract process id (if currently executing). pid_t contract_pid; +// Holds the state monitor process id (if currently executing). +pid_t statemon_pid; + /** * Executes the contract process and passes the specified arguments. * @return 0 on successful process creation. -1 on failure or contract process is already running. @@ -48,6 +54,10 @@ int exec_contract(const contract_exec_args &args) if (feed_inputs(args) != 0) return -1; + // Start the state monitor before starting the contract process. + if (start_state_monitor() != 0) + return -1; + const pid_t pid = fork(); if (pid > 0) { @@ -58,7 +68,7 @@ int exec_contract(const contract_exec_args &args) close_unused_fds(true); // Wait for child process (contract process) to complete execution. - const int presult = await_contract_execution(); + const int presult = await_process_execution(contract_pid); LOG_INFO << "Contract process ended."; contract_pid = 0; @@ -68,6 +78,9 @@ int exec_contract(const contract_exec_args &args) return -1; } + if (stop_state_monitor() != 0) + return -1; + // After contract execution, collect contract outputs. if (fetch_outputs(args) != 0) return -1; @@ -92,11 +105,12 @@ int exec_contract(const contract_exec_args &args) execv_args[conf::cfg.runtime_binexec_args.size()] = NULL; int ret = execv(execv_args[0], execv_args); - LOG_ERR << "Execv failed: " << ret; + LOG_ERR << "Contract process execv failed: " << ret; + exit(1); } else { - LOG_ERR << "fork() failed."; + LOG_ERR << "fork() failed when starting contract process."; return -1; } @@ -104,21 +118,84 @@ int exec_contract(const contract_exec_args &args) } /** - * Blocks the calling thread until the contract process compelted exeution (if running). - * @return 0 if contract process exited normally, exit code of contract process if abnormally exited. + * Blocks the calling thread until the specified process compelted exeution (if running). + * @return 0 if process exited normally or exit code of process if abnormally exited. */ -int await_contract_execution() +int await_process_execution(pid_t pid) { - if (contract_pid > 0) + if (pid > 0) { int scstatus; - waitpid(contract_pid, &scstatus, 0); + waitpid(pid, &scstatus, 0); if (!WIFEXITED(scstatus)) return WEXITSTATUS(scstatus); } return 0; } +/** + * Mounts the fuse file system at the contract state dir by starting the state monitor process. + * State monitor will automatically create a state history checkpoint as well. + */ +int start_state_monitor() +{ + pid_t pid = fork(); + if (pid > 0) + { + // HP process. + statemon_pid = pid; + return 0; + } + else if (pid == 0) + { + // State monitor process. + LOG_DBG << "Starting state monitor..."; + + // Fill process args. + char *execv_args[4]; + execv_args[0] = conf::ctx.statemonexepath.data(); + execv_args[1] = conf::ctx.statehistdir.data(); + execv_args[2] = conf::ctx.statedir.data(); + execv_args[3] = NULL; + + int ret = execv(execv_args[0], execv_args); + LOG_ERR << "State monitor execv failed: " << ret; + exit(1); + } + else if (pid < 0) + { + LOG_ERR << "fork() failed when starting state monitor."; + return -1; + } +} + +/** + * Terminate the state monitor and update the latest state hash tree. + */ +int stop_state_monitor() +{ + kill(statemon_pid, SIGINT); + + // Wait for state monitor process to complete execution after the SIGINT. + const int presult = await_process_execution(statemon_pid); + LOG_DBG << "State monitor stopped."; + + statemon_pid = 0; + + if (presult != 0) + LOG_ERR << "State monitor process exited with non-normal status code: " << presult; + + // Update the hash tree. + hasher::B2H statehash = {0, 0, 0, 0}; + statefs::hashtree_builder htreebuilder(statefs::get_statedir_context()); + if (htreebuilder.generate(statehash) != 0) + return -1; + + LOG_DBG << "State hash: " << std::hex << statehash << std::dec; + + return 0; +} + /** * Writes the contract args (JSON) into the stdin of the contract process. * Args format: diff --git a/src/proc/proc.hpp b/src/proc/proc.hpp index 370cbbf3..194641c1 100644 --- a/src/proc/proc.hpp +++ b/src/proc/proc.hpp @@ -80,7 +80,11 @@ int exec_contract(const contract_exec_args &args); //------Internal-use functions for this namespace. -int await_contract_execution(); +int await_process_execution(pid_t pid); + +int start_state_monitor(); + +int stop_state_monitor(); int write_contract_args(const contract_exec_args &args); diff --git a/src/statefs/hasher.cpp b/src/statefs/hasher.cpp new file mode 100644 index 00000000..18bef6b5 --- /dev/null +++ b/src/statefs/hasher.cpp @@ -0,0 +1,55 @@ +#include "hasher.hpp" + +namespace hasher +{ + +// provide some helper functions for working with 32 byte hash type +bool operator==(const B2H &lhs, const B2H &rhs) +{ + return lhs.data[0] == rhs.data[0] && lhs.data[1] == rhs.data[1] && lhs.data[2] == rhs.data[2] && lhs.data[3] == rhs.data[3]; +} + +bool operator!=(const B2H &lhs, const B2H &rhs) +{ + return lhs.data[0] != rhs.data[0] || lhs.data[1] != rhs.data[1] || lhs.data[2] != rhs.data[2] || lhs.data[3] != rhs.data[3]; +} + +void operator^=(B2H &lhs, const B2H &rhs) +{ + lhs.data[0] ^= rhs.data[0]; + lhs.data[1] ^= rhs.data[1]; + lhs.data[2] ^= rhs.data[2]; + lhs.data[3] ^= rhs.data[3]; +} + +std::ostream &operator<<(std::ostream &output, const B2H &h) +{ + output << h.data[0] << h.data[1] << h.data[2] << h.data[3]; + return output; +} + +std::stringstream &operator<<(std::stringstream &output, const B2H &h) +{ + output << std::hex << h; + return output; +} + +// the actual hash function, note that the B2H datatype is always passed by value being only 4 quadwords +B2H hash(const void *buf1, size_t buf1len, const void *buf2, size_t buf2len) +{ + crypto_generichash_blake2b_state state; + crypto_generichash_blake2b_init(&state, NULL, 0, HASH_SIZE); + + crypto_generichash_blake2b_update(&state, + reinterpret_cast(buf1), buf1len); + crypto_generichash_blake2b_update(&state, + reinterpret_cast(buf2), buf2len); + B2H ret; + crypto_generichash_blake2b_final( + &state, + reinterpret_cast(&ret), + HASH_SIZE); + return ret; +} + +} // namespace hasher \ No newline at end of file diff --git a/src/statefs/hasher.hpp b/src/statefs/hasher.hpp new file mode 100644 index 00000000..04869b48 --- /dev/null +++ b/src/statefs/hasher.hpp @@ -0,0 +1,27 @@ +#ifndef _HASHER_ +#define _HASHER_ + +#include "../pchheader.hpp" + +namespace hasher +{ + +constexpr size_t HASH_SIZE = crypto_generichash_blake2b_BYTES; + +struct B2H // blake2b hash is 32 bytes which we store as 4 quad words +{ + uint64_t data[4]; +}; + +// provide some helper functions for working with 32 byte hash type +bool operator==(const B2H &lhs, const B2H &rhs); +bool operator!=(const B2H &lhs, const B2H &rhs); +void operator^=(B2H &lhs, const B2H &rhs); +std::ostream &operator<<(std::ostream &output, const B2H &h); +std::stringstream &operator<<(std::stringstream &output, const B2H &h); + +B2H hash(const void *buf1, size_t buf1len, const void *buf2, size_t buf2len); + +} // namespace hasher + +#endif \ No newline at end of file diff --git a/src/statefs/hashmap_builder.cpp b/src/statefs/hashmap_builder.cpp new file mode 100644 index 00000000..f2f0b344 --- /dev/null +++ b/src/statefs/hashmap_builder.cpp @@ -0,0 +1,334 @@ +#include "../pchheader.hpp" +#include "../hplog.hpp" +#include "state_common.hpp" +#include "hashmap_builder.hpp" +#include "hasher.hpp" + +namespace statefs +{ + +hashmap_builder::hashmap_builder(const statedir_context &ctx) : ctx(ctx) +{ +} + +int hashmap_builder::generate_hashmap_forfile(hasher::B2H &parentdirhash, const std::string &filepath) +{ + // We attempt to avoid a full rebuild of the block hash map file when possible. + // For this optimisation, both the block hash map (.bhmap) file and the + // delta block index (.bindex) file must exist. + + // If the block index exists, we generate/update the hashmap file with the aid of that. + // Block index file contains the updated blockids. If not, we simply rehash all the blocks. + + std::string relpath = get_relpath(filepath, ctx.datadir); + + // Open the actual data file and calculate the block count. + int orifd = open(filepath.data(), O_RDONLY); + if (orifd == -1) + { + LOG_ERR << errno << ": Open failed " << filepath; + return -1; + } + const off_t filelength = lseek(orifd, 0, SEEK_END); + uint32_t blockcount = ceil((double)filelength / (double)BLOCK_SIZE); + + // Attempt to read the existing block hash map file. + std::string bhmapfile; + std::vector bhmapdata; + if (read_blockhashmap(bhmapdata, bhmapfile, relpath) == -1) + return -1; + + hasher::B2H oldfilehash = {0, 0, 0, 0}; + if (!bhmapdata.empty()) + memcpy(&oldfilehash, bhmapdata.data(), hasher::HASH_SIZE); + + // Attempt to read the delta block index file. + std::map bindex; + uint32_t original_blockcount; + if (get_blockindex(bindex, original_blockcount, relpath) == -1) + return -1; + + // Array to contain the updated block hashes. Slot 0 is for the root hash. + // Allocating hash array on the heap to avoid filling limited stack space. + std::unique_ptr hashes = std::make_unique(1 + blockcount); + const size_t hashes_size = (1 + blockcount) * hasher::HASH_SIZE; + + if (update_hashes(hashes.get(), hashes_size, relpath, orifd, blockcount, original_blockcount, bindex, bhmapdata) == -1) + return -1; + + if (write_blockhashmap(bhmapfile, hashes.get(), hashes_size) == -1) + return -1; + + if (update_hashtree_entry(parentdirhash, !bhmapdata.empty(), oldfilehash, hashes[0], bhmapfile, relpath) == -1) + return -1; + + return 0; +} + +int hashmap_builder::read_blockhashmap(std::vector &bhmapdata, std::string &bhmapfile, const std::string &relpath) +{ + bhmapfile.reserve(ctx.blockhashmapdir.length() + relpath.length() + HASHMAP_EXT_LEN); + bhmapfile.append(ctx.blockhashmapdir).append(relpath).append(HASHMAP_EXT); + + if (boost::filesystem::exists(bhmapfile)) + { + int hmapfd = open(bhmapfile.c_str(), O_RDONLY); + if (hmapfd == -1) + { + LOG_ERR << errno << ": Open failed " << bhmapfile; + return -1; + } + + off_t size = lseek(hmapfd, 0, SEEK_END); + bhmapdata.resize(size); + + if (pread(hmapfd, bhmapdata.data(), size, 0) == -1) + { + LOG_ERR << errno << ": Read failed " << bhmapfile; + return -1; + } + } + else + { + // Create directory tree if not exist so we are able to create the hashmap files. + boost::filesystem::path hmapsubdir = boost::filesystem::path(bhmapfile).parent_path(); + if (created_bhmapsubdirs.count(hmapsubdir.string()) == 0) + { + boost::filesystem::create_directories(hmapsubdir); + created_bhmapsubdirs.emplace(hmapsubdir.string()); + } + } + + return 0; +} + +int hashmap_builder::get_blockindex(std::map &idxmap, uint32_t &totalblockcount, const std::string &filerelpath) +{ + std::string bindexfile; + bindexfile.reserve(ctx.deltadir.length() + filerelpath.length() + BLOCKINDEX_EXT_LEN); + bindexfile.append(ctx.deltadir).append(filerelpath).append(BLOCKINDEX_EXT); + + if (boost::filesystem::exists(bindexfile)) + { + std::ifstream infile(bindexfile, std::ios::binary | std::ios::ate); + std::streamsize idxsize = infile.tellg(); + infile.seekg(0, std::ios::beg); + + // Read the block index file into a vector. + std::vector bindex(idxsize); + if (infile.read(bindex.data(), idxsize)) + { + // First 8 bytes contain the original file length. + off_t orifilelen; + memcpy(&orifilelen, bindex.data(), 8); + totalblockcount = ceil((double)orifilelen / (double)BLOCK_SIZE); + + // Skip the first 8 bytes and loop through index entries. + for (uint32_t idxoffset = 8; idxoffset < bindex.size();) + { + // Read the block no. (4 bytes) of where this block is from in the original file. + uint32_t blockno = 0; + memcpy(&blockno, bindex.data() + idxoffset, 4); + idxoffset += 12; // Skip the cached block offset (8 bytes) + + // Read the block hash (32 bytes). + hasher::B2H hash; + memcpy(&hash, bindex.data() + idxoffset, 32); + idxoffset += 32; + + idxmap.try_emplace(blockno, hash); + } + } + else + { + LOG_ERR << errno << ": Read failed " << bindexfile; + return -1; + } + + infile.close(); + } + + return 0; +} + +int hashmap_builder::update_hashes( + hasher::B2H *hashes, const off_t hashes_size, const std::string &relpath, const int orifd, + const uint32_t blockcount, const uint32_t original_blockcount, const std::map &bindex, const std::vector &bhmapdata) +{ + uint32_t nohint_blockstart = 0; + + // If both existing delta block index and block hash map is available, we can just overlay the + // changed block hashes (mentioned in the delta block index) on top of the old block hashes. + // This would prevent unncessarily hashing lot of blocks. + if (!bhmapdata.empty() && !bindex.empty()) + { + // Load old hashes. + memcpy(hashes, bhmapdata.data(), hashes_size < bhmapdata.size() ? hashes_size : bhmapdata.size()); + + // Refer to the block index and rehash the changed blocks. + for (const auto [blockid, oldhash] : bindex) + { + // If the blockid from the block index is no longer there, that means the current file is + // shorter than the previous version. So we can stop hashing at this point. + if (blockid >= blockcount) + break; + + if (compute_blockhash(hashes[blockid + 1], blockid, orifd, relpath) == -1) + return -1; + } + + // If the current file has more blocks than the previous version, we need to hash those + // additional blocks as well. + if (blockcount > original_blockcount) + nohint_blockstart = original_blockcount; + else + nohint_blockstart = blockcount; // No additional blocks remaining. + } + + //Hash any additional blocks that has to be hashed without the guidance of block index. + for (uint32_t blockid = nohint_blockstart; blockid < blockcount; blockid++) + { + if (compute_blockhash(hashes[blockid + 1], blockid, orifd, relpath) == -1) + return -1; + } + + // Calculate the new file hash: filehash = HASH(filename + XOR(block hashes)) + hasher::B2H filehash{0, 0, 0, 0}; + for (int i = 1; i <= blockcount; i++) + filehash ^= hashes[i]; + + // Rehash the file hash with filename included. + const std::string filename = boost::filesystem::path(relpath.data()).filename().string(); + filehash = hasher::hash(filename.c_str(), filename.length(), &filehash, hasher::HASH_SIZE); + + hashes[0] = filehash; + return 0; +} + +int hashmap_builder::compute_blockhash(hasher::B2H &hash, uint32_t blockid, int filefd, const std::string &relpath) +{ + // Allocating block buffer on the heap to avoid filling limited stack space. + std::unique_ptr blockbuf = std::make_unique(BLOCK_SIZE); + const off_t blockoffset = BLOCK_SIZE * blockid; + size_t bytesread = pread(filefd, blockbuf.get(), BLOCK_SIZE, blockoffset); + if (bytesread == -1) + { + LOG_ERR << errno << ": Read failed " << relpath; + return -1; + } + + hash = hasher::hash(&blockoffset, 8, blockbuf.get(), bytesread); + return 0; +} + +int hashmap_builder::write_blockhashmap(const std::string &bhmapfile, const hasher::B2H *hashes, const off_t hashes_size) +{ + int hmapfd = open(bhmapfile.c_str(), O_RDWR | O_TRUNC | O_CREAT, FILE_PERMS); + if (hmapfd == -1) + { + LOG_ERR << errno << ": Open failed " << bhmapfile; + return -1; + } + + // Write the updated hash list into the block hash map file. + if (pwrite(hmapfd, hashes, hashes_size, 0) == -1) + { + LOG_ERR << errno << ": Write failed " << bhmapfile; + return -1; + } + + if (ftruncate(hmapfd, hashes_size) == -1) + { + LOG_ERR << errno << ": Truncate failed " << bhmapfile; + return -1; + } +} + +int hashmap_builder::update_hashtree_entry(hasher::B2H &parentdirhash, const bool oldbhmap_exists, const hasher::B2H oldfilehash, const hasher::B2H newfilehash, const std::string &bhmapfile, const std::string &relpath) +{ + std::string hardlinkdir(ctx.hashtreedir); + const std::string relpathdir = boost::filesystem::path(relpath).parent_path().string(); + + hardlinkdir.append(relpathdir); + if (relpathdir != "/") + hardlinkdir.append("/"); + + std::stringstream newhlpath; + newhlpath << hardlinkdir << newfilehash << ".rh"; + + if (oldbhmap_exists) + { + // Rename the existing hard link if old block hash map existed. + // We thereby assume the old hard link also existed. + std::stringstream oldhlpath; + oldhlpath << hardlinkdir << oldfilehash << ".rh"; + if (rename(oldhlpath.str().c_str(), newhlpath.str().c_str()) == -1) + return -1; + + // Subtract the old root hash and add the new root hash from the parent dir hash. + parentdirhash ^= oldfilehash; + parentdirhash ^= newfilehash; + } + else + { + // Create a new hard link with new root hash as the name. + if (link(bhmapfile.c_str(), newhlpath.str().c_str()) == -1) + return -1; + + // Add the new root hash to parent hash. + parentdirhash ^= newfilehash; + } + + return 0; +} + +int hashmap_builder::remove_hashmapfile(hasher::B2H &parentdirhash, const std::string &bhmapfile) +{ + if (boost::filesystem::exists(bhmapfile)) + { + int hmapfd = open(bhmapfile.data(), O_RDONLY); + if (hmapfd == -1) + { + LOG_ERR << errno << ": Open failed " << bhmapfile; + return -1; + } + + hasher::B2H filehash; + if (read(hmapfd, &filehash, hasher::HASH_SIZE) == -1) + { + LOG_ERR << errno << ": Read failed " << bhmapfile; + return -1; + } + + // Delete the .bhmap file. + if (remove(bhmapfile.c_str()) == -1) + { + LOG_ERR << errno << ": Delete failed " << bhmapfile; + return -1; + } + + // Delete the hardlink of the .bhmap file. + std::string hardlinkdir(ctx.hashtreedir); + const std::string relpath = get_relpath(bhmapfile, ctx.blockhashmapdir); + const std::string relpathdir = boost::filesystem::path(relpath).parent_path().string(); + + hardlinkdir.append(relpathdir); + if (relpathdir != "/") + hardlinkdir.append("/"); + + std::stringstream hlpath; + hlpath << hardlinkdir << filehash << ".rh"; + if (remove(hlpath.str().c_str()) == -1) + { + LOG_ERR << errno << ": Delete failed for halrd link " << filehash << " of " << bhmapfile; + return -1; + } + + // XOR parent dir hash with file hash so the file hash gets removed from parent dir hash. + parentdirhash ^= filehash; + } + + return 0; +} + +} // namespace statefs \ No newline at end of file diff --git a/src/statefs/hashmap_builder.hpp b/src/statefs/hashmap_builder.hpp new file mode 100644 index 00000000..2aafc441 --- /dev/null +++ b/src/statefs/hashmap_builder.hpp @@ -0,0 +1,35 @@ +#ifndef _STATEFS_HASHMAP_BUILDER_ +#define _STATEFS_HASHMAP_BUILDER_ + +#include "../pchheader.hpp" +#include "hasher.hpp" +#include "state_common.hpp" + +namespace statefs +{ + +class hashmap_builder +{ +private: + const statedir_context ctx; + // List of new block hash map sub directories created during the session. + std::unordered_set created_bhmapsubdirs; + + int read_blockhashmap(std::vector &bhmapdata, std::string &hmapfile, const std::string &relpath); + int get_blockindex(std::map &idxmap, uint32_t &totalblockcount, const std::string &filerelpath); + int update_hashes( + hasher::B2H *hashes, const off_t hashes_size, const std::string &relpath, const int orifd, + const uint32_t blockcount, const uint32_t original_blockcount, const std::map &bindex, const std::vector &bhmapdata); + int compute_blockhash(hasher::B2H &hash, uint32_t blockid, int filefd, const std::string &relpath); + int write_blockhashmap(const std::string &bhmapfile, const hasher::B2H *hashes, const off_t hashes_size); + int update_hashtree_entry(hasher::B2H &parentdirhash, const bool oldbhmap_exists, const hasher::B2H oldfilehash, const hasher::B2H newfilehash, const std::string &bhmapfile, const std::string &relpath); + +public: + hashmap_builder(const statedir_context &ctx); + int generate_hashmap_forfile(hasher::B2H &parentdirhash, const std::string &filepath); + int remove_hashmapfile(hasher::B2H &parentdirhash, const std::string &filepath); +}; + +} // namespace statefs + +#endif diff --git a/src/statefs/hashtree_builder.cpp b/src/statefs/hashtree_builder.cpp new file mode 100644 index 00000000..fd3d1fcd --- /dev/null +++ b/src/statefs/hashtree_builder.cpp @@ -0,0 +1,246 @@ +#include "../pchheader.hpp" +#include "hashtree_builder.hpp" +#include "state_restore.hpp" +#include "state_common.hpp" + +namespace statefs +{ + +hashtree_builder::hashtree_builder(const statedir_context &ctx) : ctx(ctx), hmapbuilder(ctx) +{ +} + +int hashtree_builder::generate(hasher::B2H &roothash) +{ + // Load modified file path hints if available. + populate_hintpaths(IDX_TOUCHEDFILES); + populate_hintpaths(IDX_NEWFILES); + hintmode = !hintpaths.empty(); + + traversel_rootdir = ctx.datadir; + removal_mode = false; + if (update_hashtree(roothash) != 0) + return -1; + + // If there are any remaining hint files directly under this directory, that means + // those files are no longer there. So we need to delete the corresponding .bhmap and rh files + // and adjust the directory hash accordingly. + if (hintmode && !hintpaths.empty()) + { + traversel_rootdir = ctx.blockhashmapdir; + removal_mode = true; + if (update_hashtree(roothash) != 0) + return -1; + } + + return 0; +} + +int hashtree_builder::update_hashtree(hasher::B2H &roothash) +{ + hintpath_map::iterator hintdir_itr = hintpaths.end(); + if (!should_process_dir(hintdir_itr, traversel_rootdir)) + return 0; + + if (update_hashtree_fordir(roothash, traversel_rootdir, hintdir_itr, true) != 0) + return -1; + + return 0; +} + +int hashtree_builder::update_hashtree_fordir(hasher::B2H &parentdirhash, const std::string &dirpath, const hintpath_map::iterator hintdir_itr, const bool isrootlevel) +{ + const std::string htreedirpath = switch_basepath(dirpath, traversel_rootdir, ctx.hashtreedir); + + // Load current dir hash if exist. + const std::string dirhashfile = htreedirpath + "/" + DIRHASH_FNAME; + hasher::B2H dirhash = get_existingdirhash(dirhashfile); + + // Remember the dir hash before we mutate it. + hasher::B2H original_dirhash = dirhash; + + // Iterate files/subdirs inside this dir. + const boost::filesystem::directory_iterator itrend; + for (boost::filesystem::directory_iterator itr(dirpath); itr != itrend; itr++) + { + const bool isdir = boost::filesystem::is_directory(itr->path()); + const std::string pathstr = itr->path().string(); + + if (isdir) + { + hintpath_map::iterator hintsubdir_itr = hintpaths.end(); + if (!should_process_dir(hintsubdir_itr, pathstr)) + continue; + + if (update_hashtree_fordir(dirhash, pathstr, hintsubdir_itr, false) != 0) + return -1; + } + else + { + if (!should_process_file(hintdir_itr, pathstr)) + continue; + + if (process_file(dirhash, pathstr, htreedirpath) != 0) + return -1; + } + } + + // If there are no more files in the hint dir, delete the hint dir entry as well. + if (hintdir_itr != hintpaths.end() && hintdir_itr->second.empty()) + hintpaths.erase(hintdir_itr); + + // In removalmode, we check whether the dir is empty. If so we remove the dir as well. + if (removal_mode && boost::filesystem::is_empty(dirpath)) + { + // We remove the dirs if we are below root level only. + // Otherwise we only remove root dir.hash file. + if (!isrootlevel) + { + boost::filesystem::remove_all(dirpath); + boost::filesystem::remove_all(htreedirpath); + } + else + { + boost::filesystem::remove(dirhashfile); + } + + // Subtract the original dir hash from the parent dir hash. + parentdirhash ^= original_dirhash; + } + else if (dirhash != original_dirhash) + { + // If dir hash has changed, write it back to dir hash file. + if (save_dirhash(dirhashfile, dirhash) == -1) + return -1; + + // Also update the parent dir hash by subtracting the old hash and adding the new hash. + parentdirhash ^= original_dirhash; + parentdirhash ^= dirhash; + } + + return 0; +} + +hasher::B2H hashtree_builder::get_existingdirhash(const std::string &dirhashfile) +{ + // Load current dir hash if exist. + hasher::B2H dirhash{0, 0, 0, 0}; + int dirhashfd = open(dirhashfile.c_str(), O_RDONLY); + if (dirhashfd > 0) + { + read(dirhashfd, &dirhash, hasher::HASH_SIZE); + close(dirhashfd); + } + return dirhash; +} + +int hashtree_builder::save_dirhash(const std::string &dirhashfile, hasher::B2H dirhash) +{ + int dirhashfd = open(dirhashfile.c_str(), O_RDWR | O_TRUNC | O_CREAT, FILE_PERMS); + if (dirhashfd == -1) + return -1; + + if (write(dirhashfd, &dirhash, hasher::HASH_SIZE) == -1) + { + close(dirhashfd); + return -1; + } + + close(dirhashfd); + return 0; +} + +inline bool hashtree_builder::should_process_dir(hintpath_map::iterator &dir_itr, const std::string &dirpath) +{ + return (hintmode ? get_hinteddir_match(dir_itr, dirpath) : true); +} + +bool hashtree_builder::should_process_file(const hintpath_map::iterator hintdir_itr, const std::string filepath) +{ + if (hintmode) + { + if (hintdir_itr == hintpaths.end()) + return false; + + std::string relpath = get_relpath(filepath, traversel_rootdir); + + // If in removal mode, we are traversing .bhmap files. Hence we should truncate .bhmap extension + // before we search for the path in file hints. + if (removal_mode) + relpath = relpath.substr(0, relpath.length() - HASHMAP_EXT_LEN); + + std::unordered_set &hintfiles = hintdir_itr->second; + const auto hintfile_itr = hintfiles.find(relpath); + if (hintfile_itr == hintfiles.end()) + return false; + + // Erase the visiting filepath from hint files. + hintfiles.erase(hintfile_itr); + } + return true; +} + +int hashtree_builder::process_file(hasher::B2H &parentdirhash, const std::string &filepath, const std::string &htreedirpath) +{ + if (!removal_mode) + { + // Create directory tree if not exist so we are able to create the file root hash files (hard links). + if (created_htreesubdirs.count(htreedirpath) == 0) + { + boost::filesystem::create_directories(htreedirpath); + created_htreesubdirs.emplace(htreedirpath); + } + + if (hmapbuilder.generate_hashmap_forfile(parentdirhash, filepath) == -1) + return -1; + } + else + { + if (hmapbuilder.remove_hashmapfile(parentdirhash, filepath) == -1) + return -1; + } + + return 0; +} + +void hashtree_builder::populate_hintpaths(const char *const idxfile) +{ + std::ifstream infile(std::string(ctx.deltadir).append(idxfile)); + if (!infile.fail()) + { + for (std::string relpath; std::getline(infile, relpath);) + { + std::string parentdir = boost::filesystem::path(relpath).parent_path().string(); + hintpaths[parentdir].emplace(relpath); + } + infile.close(); + } +} + +bool hashtree_builder::get_hinteddir_match(hintpath_map::iterator &matchitr, const std::string &dirpath) +{ + // First check whether there's an exact match. If not check for a partial match. + // Exact match will return the iterator. Partial match or not found will return end() iterator. + const std::string relpath = get_relpath(dirpath, traversel_rootdir); + const auto exactmatchitr = hintpaths.find(relpath); + + if (exactmatchitr != hintpaths.end()) + { + matchitr = exactmatchitr; + return true; + } + + for (auto itr = hintpaths.begin(); itr != hintpaths.end(); itr++) + { + if (strncmp(relpath.c_str(), itr->first.c_str(), relpath.length()) == 0) + { + // Partial match found. + matchitr = hintpaths.end(); + return true; + } + } + + return false; // Not found at all. +} + +} // namespace statefs \ No newline at end of file diff --git a/src/statefs/hashtree_builder.hpp b/src/statefs/hashtree_builder.hpp new file mode 100644 index 00000000..f9819a68 --- /dev/null +++ b/src/statefs/hashtree_builder.hpp @@ -0,0 +1,48 @@ +#ifndef _STATEFS_HASHTREE_BUILDER_ +#define _STATEFS_HASHTREE_BUILDER_ + +#include "../pchheader.hpp" +#include "hasher.hpp" +#include "hashmap_builder.hpp" +#include "state_common.hpp" + +namespace statefs +{ + +typedef std::unordered_map> hintpath_map; + +class hashtree_builder +{ +private: + const statedir_context ctx; + hashmap_builder hmapbuilder; + + // Hint path map with parent dir as key and list of file paths under each parent dir. + hintpath_map hintpaths; + bool hintmode; + bool removal_mode; + std::string traversel_rootdir; + + // List of new root hash map sub directories created during the session. + std::unordered_set created_htreesubdirs; + + int update_hashtree(hasher::B2H &roothash); + int update_hashtree_fordir(hasher::B2H &parentdirhash, const std::string &relpath, const hintpath_map::iterator hintdir_itr, const bool isrootlevel); + + hasher::B2H get_existingdirhash(const std::string &dirhashfile); + int save_dirhash(const std::string &dirhashfile, hasher::B2H dirhash); + bool should_process_dir(hintpath_map::iterator &hintsubdir_itr, const std::string &dirpath); + bool should_process_file(const hintpath_map::iterator hintdir_itr, const std::string filepath); + int process_file(hasher::B2H &parentdirhash, const std::string &filepath, const std::string &htreedirpath); + int update_hashtree_entry(hasher::B2H &parentdirhash, const bool oldbhmap_exists, const hasher::B2H oldfilehash, const hasher::B2H newfilehash, const std::string &bhmapfile, const std::string &relpath); + void populate_hintpaths(const char *const idxfile); + bool get_hinteddir_match(hintpath_map::iterator &matchitr, const std::string &dirpath); + +public: + hashtree_builder(const statedir_context &ctx); + int generate(hasher::B2H &roothash); +}; + +} // namespace statefs + +#endif diff --git a/src/statefs/state_common.cpp b/src/statefs/state_common.cpp new file mode 100644 index 00000000..a55bbc0a --- /dev/null +++ b/src/statefs/state_common.cpp @@ -0,0 +1,60 @@ +#include +#include +#include "state_common.hpp" + +namespace statefs +{ + +std::string statehistdir; + +void init(const std::string &statehist_dir_root) +{ + statehistdir = realpath(statehist_dir_root.c_str(), NULL); + + // Initialize 0 state (current state) directory. + get_statedir_context(0, true); +} + +std::string get_statedir_root(const int16_t checkpointid) +{ + return statehistdir + "/" + std::to_string(checkpointid); +} + +statedir_context get_statedir_context(const int16_t checkpointid, const bool createdirs) +{ + statedir_context ctx; + ctx.rootdir = get_statedir_root(checkpointid); + ctx.datadir = ctx.rootdir + DATA_DIR; + ctx.blockhashmapdir = ctx.rootdir + BHMAP_DIR; + ctx.hashtreedir = ctx.rootdir + HTREE_DIR; + ctx.deltadir = ctx.rootdir + DELTA_DIR; + + if (createdirs) + { + if (!boost::filesystem::exists(ctx.datadir)) + boost::filesystem::create_directories(ctx.datadir); + if (!boost::filesystem::exists(ctx.blockhashmapdir)) + boost::filesystem::create_directories(ctx.blockhashmapdir); + if (!boost::filesystem::exists(ctx.hashtreedir)) + boost::filesystem::create_directories(ctx.hashtreedir); + if (!boost::filesystem::exists(ctx.deltadir)) + boost::filesystem::create_directories(ctx.deltadir); + } + + return ctx; +} + +std::string get_relpath(const std::string &fullpath, const std::string &base_path) +{ + std::string relpath = fullpath.substr(base_path.length(), fullpath.length() - base_path.length()); + if (relpath.empty()) + relpath = "/"; + return relpath; +} + +std::string switch_basepath(const std::string &fullpath, const std::string &from_base_path, const std::string &to_base_path) +{ + return to_base_path + get_relpath(fullpath, from_base_path); +} + +} // namespace statefs \ No newline at end of file diff --git a/src/statefs/state_common.hpp b/src/statefs/state_common.hpp new file mode 100644 index 00000000..64dc00ea --- /dev/null +++ b/src/statefs/state_common.hpp @@ -0,0 +1,60 @@ +#ifndef _STATEFS_STATE_COMMON_ +#define _STATEFS_STATE_COMMON_ + +#include +#include +#include "hasher.hpp" + +namespace statefs +{ + +constexpr int16_t MAX_CHECKPOINTS = 5; + +// Cache block size. +constexpr size_t BLOCK_SIZE = 4 * 1024 * 1024; // 4MB + +// Cache block index entry bytes length. +constexpr size_t BLOCKINDEX_ENTRY_SIZE = 44; +constexpr size_t MAX_HASHES = BLOCK_SIZE / hasher::HASH_SIZE; + +// Permissions used when creating block cache and index files. +constexpr int FILE_PERMS = 0644; + +const char *const HASHMAP_EXT = ".bhmap"; +constexpr size_t HASHMAP_EXT_LEN = 6; + +const char *const BLOCKINDEX_EXT = ".bindex"; +constexpr size_t BLOCKINDEX_EXT_LEN = 7; + +const char *const BLOCKCACHE_EXT = ".bcache"; +constexpr size_t BLOCKCACHE_EXT_LEN = 7; + +const char *const IDX_NEWFILES = "/idxnew.idx"; +const char *const IDX_TOUCHEDFILES = "/idxtouched.idx"; +const char *const DIRHASH_FNAME = "dir.hash"; + +const char *const DATA_DIR = "/data"; +const char *const BHMAP_DIR = "/bhmap"; +const char *const HTREE_DIR = "/htree"; +const char *const DELTA_DIR = "/delta"; + +extern std::string statehistdir; + +struct statedir_context +{ + std::string rootdir; + std::string datadir; + std::string blockhashmapdir; + std::string hashtreedir; + std::string deltadir; +}; + +void init(const std::string &statehist_dir_root); +std::string get_statedir_root(const int16_t checkpointid); +statedir_context get_statedir_context(int16_t checkpointid = 0, bool createdirs = false); +std::string get_relpath(const std::string &fullpath, const std::string &base_path); +std::string switch_basepath(const std::string &fullpath, const std::string &from_base_path, const std::string &to_base_path); + +} // namespace statefs + +#endif \ No newline at end of file diff --git a/src/statefs/state_monitor/fusefs.cpp b/src/statefs/state_monitor/fusefs.cpp new file mode 100644 index 00000000..e9e768cf --- /dev/null +++ b/src/statefs/state_monitor/fusefs.cpp @@ -0,0 +1,1342 @@ +/* + * Code copied and adopted from https://github.com/libfuse/libfuse/blob/master/example/passthrough_hp.cc + */ + +#define FUSE_USE_VERSION 35 + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +// C includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// C++ includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "state_monitor.hpp" +#include "../state_common.hpp" + +using namespace std; + +// Uniquely identifies a file in the source directory tree. This could +// be simplified to just ino_t since we require the source directory +// not to contain any mountpoints. This hasn't been done yet in case +// we need to reconsider this constraint (but relaxing this would have +// the drawback that we can no longer re-use inode numbers, and thus +// readdir() would need to do a full lookup() in order to report the +// right inode number). +typedef std::pair SrcId; + +// Define a hash function for SrcId +namespace std +{ +template <> +struct hash +{ + size_t operator()(const SrcId &id) const + { + return hash{}(id.first) ^ hash{}(id.second); + } +}; +} // namespace std + +namespace helpers +{ + +int getfilepath(std::string &filepath, int parentfd, const char *filename) +{ + // Get parent directory path using the parentfd. + char proclnk[32]; + char parentpath[PATH_MAX]; + sprintf(proclnk, "/proc/self/fd/%d", parentfd); + ssize_t parentlen = readlink(proclnk, parentpath, PATH_MAX); + if (parentlen > 0) + { + // Concat parent dir path and filename to get the full path. + filepath.reserve(parentlen + strlen(filename) + 1); + filepath.append(parentpath, parentlen).append("/").append(filename); + return 0; + } + return -1; +} + +} // namespace helpers + +namespace fusefs +{ + +/* We are re-using pointers to our `struct sfs_inode` and `struct + sfs_dirp` elements as inodes and file handles. This means that we + must be able to store pointer a pointer in both a fuse_ino_t + variable and a uint64_t variable (used for file handles). */ +static_assert(sizeof(fuse_ino_t) >= sizeof(void *), + "void* must fit into fuse_ino_t"); +static_assert(sizeof(fuse_ino_t) >= sizeof(uint64_t), + "fuse_ino_t must be at least 64 bits"); + +/* Forward declarations */ +struct Inode; +static Inode &get_inode(fuse_ino_t ino); +static void forget_one(fuse_ino_t ino, uint64_t n); + +// Maps files in the source directory tree to inodes +typedef std::unordered_map InodeMap; + +struct Inode +{ + int fd{-1}; + bool is_symlink{false}; + dev_t src_dev{0}; + ino_t src_ino{0}; + uint64_t nlookup{0}; + std::mutex m; + + // Delete copy constructor and assignments. We could implement + // move if we need it. + Inode() = default; + Inode(const Inode &) = delete; + Inode(Inode &&inode) = delete; + Inode &operator=(Inode &&inode) = delete; + Inode &operator=(const Inode &) = delete; + + ~Inode() + { + if (fd > 0) + close(fd); + } +}; + +struct Fs +{ + // Must be acquired *after* any Inode.m locks. + std::mutex mutex; + InodeMap inodes; // protected by mutex + Inode root; + double timeout; + bool debug; + std::string source; + size_t blocksize; + dev_t src_dev; + bool nosplice; + bool nocache; +}; +static Fs fs{}; +static statefs::state_monitor statemonitor; + +#define FUSE_BUF_COPY_FLAGS \ + (fs.nosplice ? FUSE_BUF_NO_SPLICE : static_cast(0)) + +static Inode &get_inode(fuse_ino_t ino) +{ + if (ino == FUSE_ROOT_ID) + return fs.root; + + Inode *inode = reinterpret_cast(ino); + if (inode->fd == -1) + { + cerr << "INTERNAL ERROR: Unknown inode " << ino << endl; + abort(); + } + return *inode; +} + +static int get_fs_fd(fuse_ino_t ino) +{ + int fd = get_inode(ino).fd; + return fd; +} + +static void sfs_init(void *userdata, fuse_conn_info *conn) +{ + (void)userdata; + if (conn->capable & FUSE_CAP_EXPORT_SUPPORT) + conn->want |= FUSE_CAP_EXPORT_SUPPORT; + + if (fs.timeout && conn->capable & FUSE_CAP_WRITEBACK_CACHE) + conn->want |= FUSE_CAP_WRITEBACK_CACHE; + + if (conn->capable & FUSE_CAP_FLOCK_LOCKS) + conn->want |= FUSE_CAP_FLOCK_LOCKS; + + // Use splicing if supported. Since we are using writeback caching + // and readahead, individual requests should have a decent size so + // that splicing between fd's is well worth it. + if (conn->capable & FUSE_CAP_SPLICE_WRITE && !fs.nosplice) + conn->want |= FUSE_CAP_SPLICE_WRITE; + if (conn->capable & FUSE_CAP_SPLICE_READ && !fs.nosplice) + conn->want |= FUSE_CAP_SPLICE_READ; +} + +static void sfs_getattr(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi) +{ + (void)fi; + Inode &inode = get_inode(ino); + struct stat attr; + auto res = fstatat(inode.fd, "", &attr, + AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW); + if (res == -1) + { + fuse_reply_err(req, errno); + return; + } + fuse_reply_attr(req, &attr, fs.timeout); +} + +#ifdef HAVE_UTIMENSAT +static int utimensat_empty_nofollow(Inode &inode, + const struct timespec *tv) +{ + if (inode.is_symlink) + { + /* Does not work on current kernels, but may in the future: + https://marc.info/?l=linux-kernel&m=154158217810354&w=2 */ + auto res = utimensat(inode.fd, "", tv, AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW); + if (res == -1 && errno == EINVAL) + { + /* Sorry, no race free way to set times on symlink. */ + errno = EPERM; + } + return res; + } + + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", inode.fd); + + return utimensat(AT_FDCWD, procname, tv, 0); +} +#endif + +static void do_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, + int valid, struct fuse_file_info *fi) +{ + Inode &inode = get_inode(ino); + int ifd = inode.fd; + int res; + + if (valid & FUSE_SET_ATTR_MODE) + { + if (fi) + { + res = fchmod(fi->fh, attr->st_mode); + } + else + { + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", ifd); + res = chmod(procname, attr->st_mode); + } + if (res == -1) + goto out_err; + } + if (valid & (FUSE_SET_ATTR_UID | FUSE_SET_ATTR_GID)) + { + uid_t uid = (valid & FUSE_SET_ATTR_UID) ? attr->st_uid : static_cast(-1); + gid_t gid = (valid & FUSE_SET_ATTR_GID) ? attr->st_gid : static_cast(-1); + + res = fchownat(ifd, "", uid, gid, AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW); + if (res == -1) + goto out_err; + } + if (valid & FUSE_SET_ATTR_SIZE) + { + if (fi) + { + res = ftruncate(fi->fh, attr->st_size); + } + else + { + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", ifd); + res = truncate(procname, attr->st_size); + } + if (res == -1) + goto out_err; + } + if (valid & (FUSE_SET_ATTR_ATIME | FUSE_SET_ATTR_MTIME)) + { + struct timespec tv[2]; + + tv[0].tv_sec = 0; + tv[1].tv_sec = 0; + tv[0].tv_nsec = UTIME_OMIT; + tv[1].tv_nsec = UTIME_OMIT; + + if (valid & FUSE_SET_ATTR_ATIME_NOW) + tv[0].tv_nsec = UTIME_NOW; + else if (valid & FUSE_SET_ATTR_ATIME) + tv[0] = attr->st_atim; + + if (valid & FUSE_SET_ATTR_MTIME_NOW) + tv[1].tv_nsec = UTIME_NOW; + else if (valid & FUSE_SET_ATTR_MTIME) + tv[1] = attr->st_mtim; + + if (fi) + res = futimens(fi->fh, tv); + else + { +#ifdef HAVE_UTIMENSAT + res = utimensat_empty_nofollow(inode, tv); +#else + res = -1; + errno = EOPNOTSUPP; +#endif + } + if (res == -1) + goto out_err; + } + return sfs_getattr(req, ino, fi); + +out_err: + fuse_reply_err(req, errno); +} + +static void sfs_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, + int valid, fuse_file_info *fi) +{ + // We use some conditions to detect truncate call. + if (fi != NULL && fi->fh > 0 && attr->st_size > 0) + statemonitor.ontruncate(fi->fh, attr->st_size); + + (void)ino; + do_setattr(req, ino, attr, valid, fi); +} + +static int do_lookup(fuse_ino_t parent, const char *name, + fuse_entry_param *e) +{ + if (fs.debug) + cerr << "DEBUG: lookup(): name=" << name + << ", parent=" << parent << endl; + memset(e, 0, sizeof(*e)); + e->attr_timeout = fs.timeout; + e->entry_timeout = fs.timeout; + + auto newfd = openat(get_fs_fd(parent), name, O_PATH | O_NOFOLLOW); + if (newfd == -1) + return errno; + + auto res = fstatat(newfd, "", &e->attr, AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW); + if (res == -1) + { + auto saveerr = errno; + close(newfd); + if (fs.debug) + cerr << "DEBUG: lookup(): fstatat failed" << endl; + return saveerr; + } + + if (e->attr.st_dev != fs.src_dev) + { + cerr << "WARNING: Mountpoints in the source directory tree will be hidden." << endl; + return ENOTSUP; + } + else if (e->attr.st_ino == FUSE_ROOT_ID) + { + cerr << "ERROR: Source directory tree must not include inode " + << FUSE_ROOT_ID << endl; + return EIO; + } + + SrcId id{e->attr.st_ino, e->attr.st_dev}; + unique_lock fs_lock{fs.mutex}; + Inode *inode_p; + try + { + inode_p = &fs.inodes[id]; + } + catch (std::bad_alloc &) + { + return ENOMEM; + } + e->ino = reinterpret_cast(inode_p); + Inode &inode{*inode_p}; + + if (inode.fd != -1) + { // found existing inode + fs_lock.unlock(); + if (fs.debug) + cerr << "DEBUG: lookup(): inode " << e->attr.st_ino + << " (userspace) already known." << endl; + lock_guard g{inode.m}; + inode.nlookup++; + close(newfd); + } + else + { // no existing inode + /* This is just here to make Helgrind happy. It violates the + lock ordering requirement (inode.m must be acquired before + fs.mutex), but this is of no consequence because at this + point no other thread has access to the inode mutex */ + lock_guard g{inode.m}; + inode.src_ino = e->attr.st_ino; + inode.src_dev = e->attr.st_dev; + inode.is_symlink = S_ISLNK(e->attr.st_mode); + inode.nlookup = 1; + inode.fd = newfd; + fs_lock.unlock(); + + if (fs.debug) + cerr << "DEBUG: lookup(): created userspace inode " << e->attr.st_ino + << endl; + } + + return 0; +} + +static void sfs_lookup(fuse_req_t req, fuse_ino_t parent, const char *name) +{ + fuse_entry_param e{}; + auto err = do_lookup(parent, name, &e); + if (err == ENOENT) + { + e.attr_timeout = fs.timeout; + e.entry_timeout = fs.timeout; + e.ino = e.attr.st_ino = 0; + fuse_reply_entry(req, &e); + } + else if (err) + { + if (err == ENFILE || err == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, err); + } + else + { + fuse_reply_entry(req, &e); + } +} + +static void mknod_symlink(fuse_req_t req, fuse_ino_t parent, + const char *name, mode_t mode, dev_t rdev, + const char *link) +{ + int res; + Inode &inode_p = get_inode(parent); + auto saverr = ENOMEM; + + if (S_ISDIR(mode)) + res = mkdirat(inode_p.fd, name, mode); + else if (S_ISLNK(mode)) + res = symlinkat(link, inode_p.fd, name); + else + res = mknodat(inode_p.fd, name, mode, rdev); + saverr = errno; + if (res == -1) + goto out; + + fuse_entry_param e; + saverr = do_lookup(parent, name, &e); + if (saverr) + goto out; + + fuse_reply_entry(req, &e); + return; + +out: + if (saverr == ENFILE || saverr == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, saverr); +} + +static void sfs_mknod(fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode, dev_t rdev) +{ + mknod_symlink(req, parent, name, mode, rdev, nullptr); +} + +static void sfs_mkdir(fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode) +{ + mknod_symlink(req, parent, name, S_IFDIR | mode, 0, nullptr); +} + +static void sfs_symlink(fuse_req_t req, const char *link, fuse_ino_t parent, + const char *name) +{ + mknod_symlink(req, parent, name, S_IFLNK, 0, link); +} + +static int linkat_empty_nofollow(Inode &inode, int dfd, const char *name) +{ + if (inode.is_symlink) + { + auto res = linkat(inode.fd, "", dfd, name, AT_EMPTY_PATH); + if (res == -1 && (errno == ENOENT || errno == EINVAL)) + { + /* Sorry, no race free way to hard-link a symlink. */ + errno = EOPNOTSUPP; + } + return res; + } + + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", inode.fd); + return linkat(AT_FDCWD, procname, dfd, name, AT_SYMLINK_FOLLOW); +} + +static void sfs_link(fuse_req_t req, fuse_ino_t ino, fuse_ino_t parent, + const char *name) +{ + Inode &inode = get_inode(ino); + Inode &inode_p = get_inode(parent); + fuse_entry_param e{}; + + e.attr_timeout = fs.timeout; + e.entry_timeout = fs.timeout; + + auto res = linkat_empty_nofollow(inode, inode_p.fd, name); + if (res == -1) + { + fuse_reply_err(req, errno); + return; + } + + res = fstatat(inode.fd, "", &e.attr, AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW); + if (res == -1) + { + fuse_reply_err(req, errno); + return; + } + e.ino = reinterpret_cast(&inode); + { + lock_guard g{inode.m}; + inode.nlookup++; + } + + fuse_reply_entry(req, &e); + return; +} + +static void sfs_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name) +{ + Inode &inode_p = get_inode(parent); + lock_guard g{inode_p.m}; + auto res = unlinkat(inode_p.fd, name, AT_REMOVEDIR); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +static void sfs_rename(fuse_req_t req, fuse_ino_t parent, const char *name, + fuse_ino_t newparent, const char *newname, + unsigned int flags) +{ + Inode &inode_p = get_inode(parent); + Inode &inode_np = get_inode(newparent); + if (flags) + { + fuse_reply_err(req, EINVAL); + return; + } + + std::string oldfilepath, newfilepath; + if (helpers::getfilepath(oldfilepath, inode_p.fd, name) == 0 && + helpers::getfilepath(newfilepath, inode_np.fd, newname) == 0) + { + statemonitor.onrename(oldfilepath, newfilepath); + } + + auto res = renameat(inode_p.fd, name, inode_np.fd, newname); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +static void sfs_unlink(fuse_req_t req, fuse_ino_t parent, const char *name) +{ + Inode &inode_p = get_inode(parent); + + std::string filepath; + if (helpers::getfilepath(filepath, inode_p.fd, name) == 0) + statemonitor.ondelete(filepath); + + auto res = unlinkat(inode_p.fd, name, 0); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +static void forget_one(fuse_ino_t ino, uint64_t n) +{ + Inode &inode = get_inode(ino); + unique_lock l{inode.m}; + + if (n > inode.nlookup) + { + cerr << "INTERNAL ERROR: Negative lookup count for inode " + << inode.src_ino << endl; + abort(); + } + inode.nlookup -= n; + if (!inode.nlookup) + { + if (fs.debug) + cerr << "DEBUG: forget: cleaning up inode " << inode.src_ino << endl; + { + lock_guard g_fs{fs.mutex}; + l.unlock(); + fs.inodes.erase({inode.src_ino, inode.src_dev}); + } + } + else if (fs.debug) + cerr << "DEBUG: forget: inode " << inode.src_ino + << " lookup count now " << inode.nlookup << endl; +} + +static void sfs_forget(fuse_req_t req, fuse_ino_t ino, uint64_t nlookup) +{ + forget_one(ino, nlookup); + fuse_reply_none(req); +} + +static void sfs_forget_multi(fuse_req_t req, size_t count, + fuse_forget_data *forgets) +{ + for (int i = 0; i < count; i++) + forget_one(forgets[i].ino, forgets[i].nlookup); + fuse_reply_none(req); +} + +static void sfs_readlink(fuse_req_t req, fuse_ino_t ino) +{ + Inode &inode = get_inode(ino); + char buf[PATH_MAX + 1]; + auto res = readlinkat(inode.fd, "", buf, sizeof(buf)); + if (res == -1) + fuse_reply_err(req, errno); + else if (res == sizeof(buf)) + fuse_reply_err(req, ENAMETOOLONG); + else + { + buf[res] = '\0'; + fuse_reply_readlink(req, buf); + } +} + +struct DirHandle +{ + DIR *dp{nullptr}; + off_t offset; + + DirHandle() = default; + DirHandle(const DirHandle &) = delete; + DirHandle &operator=(const DirHandle &) = delete; + + ~DirHandle() + { + if (dp) + closedir(dp); + } +}; + +static DirHandle *get_dir_handle(fuse_file_info *fi) +{ + return reinterpret_cast(fi->fh); +} + +static void sfs_opendir(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi) +{ + Inode &inode = get_inode(ino); + auto d = new (nothrow) DirHandle; + if (d == nullptr) + { + fuse_reply_err(req, ENOMEM); + return; + } + + // Make Helgrind happy - it can't know that there's an implicit + // synchronization due to the fact that other threads cannot + // access d until we've called fuse_reply_*. + lock_guard g{inode.m}; + + auto fd = openat(inode.fd, ".", O_RDONLY); + if (fd == -1) + goto out_errno; + + // On success, dir stream takes ownership of fd, so we + // do not have to close it. + d->dp = fdopendir(fd); + if (d->dp == nullptr) + goto out_errno; + + d->offset = 0; + + fi->fh = reinterpret_cast(d); + if (fs.timeout) + { + fi->keep_cache = 1; + fi->cache_readdir = 1; + } + fuse_reply_open(req, fi); + return; + +out_errno: + auto error = errno; + delete d; + if (error == ENFILE || error == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, error); +} + +static bool is_dot_or_dotdot(const char *name) +{ + return name[0] == '.' && + (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')); +} + +static void do_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, + off_t offset, fuse_file_info *fi, int plus) +{ + auto d = get_dir_handle(fi); + Inode &inode = get_inode(ino); + lock_guard g{inode.m}; + char *p; + auto rem = size; + int err = 0, count = 0; + + if (fs.debug) + cerr << "DEBUG: readdir(): started with offset " + << offset << endl; + + auto buf = new (nothrow) char[size]; + if (!buf) + { + fuse_reply_err(req, ENOMEM); + return; + } + p = buf; + + if (offset != d->offset) + { + if (fs.debug) + cerr << "DEBUG: readdir(): seeking to " << offset << endl; + seekdir(d->dp, offset); + d->offset = offset; + } + + while (1) + { + struct dirent *entry; + errno = 0; + entry = readdir(d->dp); + if (!entry) + { + if (errno) + { + err = errno; + if (fs.debug) + warn("DEBUG: readdir(): readdir failed with"); + goto error; + } + break; // End of stream + } + d->offset = entry->d_off; + if (is_dot_or_dotdot(entry->d_name)) + continue; + + fuse_entry_param e{}; + size_t entsize; + if (plus) + { + err = do_lookup(ino, entry->d_name, &e); + if (err) + goto error; + entsize = fuse_add_direntry_plus(req, p, rem, entry->d_name, &e, entry->d_off); + + if (entsize > rem) + { + if (fs.debug) + cerr << "DEBUG: readdir(): buffer full, returning data. " << endl; + forget_one(e.ino, 1); + break; + } + } + else + { + e.attr.st_ino = entry->d_ino; + e.attr.st_mode = entry->d_type << 12; + entsize = fuse_add_direntry(req, p, rem, entry->d_name, &e.attr, entry->d_off); + + if (entsize > rem) + { + if (fs.debug) + cerr << "DEBUG: readdir(): buffer full, returning data. " << endl; + break; + } + } + + p += entsize; + rem -= entsize; + count++; + if (fs.debug) + { + cerr << "DEBUG: readdir(): added to buffer: " << entry->d_name + << ", ino " << e.attr.st_ino << ", offset " << entry->d_off << endl; + } + } + err = 0; +error: + + // If there's an error, we can only signal it if we haven't stored + // any entries yet - otherwise we'd end up with wrong lookup + // counts for the entries that are already in the buffer. So we + // return what we've collected until that point. + if (err && rem == size) + { + if (err == ENFILE || err == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, err); + } + else + { + if (fs.debug) + cerr << "DEBUG: readdir(): returning " << count + << " entries, curr offset " << d->offset << endl; + fuse_reply_buf(req, buf, size - rem); + } + delete[] buf; + return; +} + +static void sfs_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, + off_t offset, fuse_file_info *fi) +{ + // operation logging is done in readdir to reduce code duplication + do_readdir(req, ino, size, offset, fi, 0); +} + +static void sfs_readdirplus(fuse_req_t req, fuse_ino_t ino, size_t size, + off_t offset, fuse_file_info *fi) +{ + // operation logging is done in readdir to reduce code duplication + do_readdir(req, ino, size, offset, fi, 1); +} + +static void sfs_releasedir(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi) +{ + (void)ino; + auto d = get_dir_handle(fi); + delete d; + fuse_reply_err(req, 0); +} + +static void sfs_create(fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode, fuse_file_info *fi) +{ + Inode &inode_p = get_inode(parent); + + auto fd = openat(inode_p.fd, name, + (fi->flags | O_CREAT) & ~O_NOFOLLOW, mode); + if (fd == -1) + { + auto err = errno; + if (err == ENFILE || err == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, err); + return; + } + + fi->fh = fd; + fuse_entry_param e; + auto err = do_lookup(parent, name, &e); + if (err) + { + if (err == ENFILE || err == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, err); + } + else + { + statemonitor.oncreate(fd); + fuse_reply_create(req, &e, fi); + } +} + +static void sfs_fsyncdir(fuse_req_t req, fuse_ino_t ino, int datasync, + fuse_file_info *fi) +{ + (void)ino; + int res; + int fd = dirfd(get_dir_handle(fi)->dp); + if (datasync) + res = fdatasync(fd); + else + res = fsync(fd); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +static void sfs_open(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi) +{ + Inode &inode = get_inode(ino); + + /* With writeback cache, kernel may send read requests even + when userspace opened write-only */ + if (fs.timeout && (fi->flags & O_ACCMODE) == O_WRONLY) + { + fi->flags &= ~O_ACCMODE; + fi->flags |= O_RDWR; + } + + /* With writeback cache, O_APPEND is handled by the kernel. This + breaks atomicity (since the file may change in the underlying + filesystem, so that the kernel's idea of the end of the file + isn't accurate anymore). However, no process should modify the + file in the underlying filesystem once it has been read, so + this is not a problem. */ + if (fs.timeout && fi->flags & O_APPEND) + fi->flags &= ~O_APPEND; + + /* Unfortunately we cannot use inode.fd, because this was opened + with O_PATH (so it doesn't allow read/write access). */ + char buf[64]; + sprintf(buf, "/proc/self/fd/%i", inode.fd); + + statemonitor.onopen(inode.fd, fi->flags); + + auto fd = open(buf, fi->flags & ~O_NOFOLLOW); + if (fd == -1) + { + auto err = errno; + if (err == ENFILE || err == EMFILE) + cerr << "ERROR: Reached maximum number of file descriptors." << endl; + fuse_reply_err(req, err); + return; + } + + fi->keep_cache = (fs.timeout != 0); + fi->fh = fd; + + fuse_reply_open(req, fi); +} + +static void sfs_release(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi) +{ + (void)ino; + close(fi->fh); + statemonitor.onclose(fi->fh); + fuse_reply_err(req, 0); +} + +static void sfs_flush(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi) +{ + (void)ino; + auto res = close(dup(fi->fh)); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +static void sfs_fsync(fuse_req_t req, fuse_ino_t ino, int datasync, + fuse_file_info *fi) +{ + (void)ino; + int res; + if (datasync) + res = fdatasync(fi->fh); + else + res = fsync(fi->fh); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +static void do_read(fuse_req_t req, size_t size, off_t off, fuse_file_info *fi) +{ + + fuse_bufvec buf = FUSE_BUFVEC_INIT(size); + buf.buf[0].flags = static_cast( + FUSE_BUF_IS_FD | FUSE_BUF_FD_SEEK); + buf.buf[0].fd = fi->fh; + buf.buf[0].pos = off; + + fuse_reply_data(req, &buf, FUSE_BUF_COPY_FLAGS); +} + +static void sfs_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, + fuse_file_info *fi) +{ + (void)ino; + do_read(req, size, off, fi); +} + +static void do_write_buf(fuse_req_t req, size_t size, off_t off, + fuse_bufvec *in_buf, fuse_file_info *fi) +{ + fuse_bufvec out_buf = FUSE_BUFVEC_INIT(size); + out_buf.buf[0].flags = static_cast( + FUSE_BUF_IS_FD | FUSE_BUF_FD_SEEK); + out_buf.buf[0].fd = fi->fh; + out_buf.buf[0].pos = off; + + auto res = fuse_buf_copy(&out_buf, in_buf, FUSE_BUF_COPY_FLAGS); + if (res < 0) + fuse_reply_err(req, -res); + else + fuse_reply_write(req, (size_t)res); +} + +static void sfs_write_buf(fuse_req_t req, fuse_ino_t ino, fuse_bufvec *in_buf, + off_t off, fuse_file_info *fi) +{ + (void)ino; + auto size{fuse_buf_size(in_buf)}; + + statemonitor.onwrite(fi->fh, off, size); + + do_write_buf(req, size, off, in_buf, fi); +} + +static void sfs_statfs(fuse_req_t req, fuse_ino_t ino) +{ + struct statvfs stbuf; + + auto res = fstatvfs(get_fs_fd(ino), &stbuf); + if (res == -1) + fuse_reply_err(req, errno); + else + fuse_reply_statfs(req, &stbuf); +} + +#ifdef HAVE_POSIX_FALLOCATE +static void sfs_fallocate(fuse_req_t req, fuse_ino_t ino, int mode, + off_t offset, off_t length, fuse_file_info *fi) +{ + (void)ino; + if (mode) + { + fuse_reply_err(req, EOPNOTSUPP); + return; + } + + auto err = posix_fallocate(fi->fh, offset, length); + fuse_reply_err(req, err); +} +#endif + +static void sfs_flock(fuse_req_t req, fuse_ino_t ino, fuse_file_info *fi, + int op) +{ + (void)ino; + auto res = flock(fi->fh, op); + fuse_reply_err(req, res == -1 ? errno : 0); +} + +#ifdef HAVE_SETXATTR +static void sfs_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name, + size_t size) +{ + char *value = nullptr; + Inode &inode = get_inode(ino); + ssize_t ret; + int saverr; + + if (inode.is_symlink) + { + /* Sorry, no race free way to getxattr on symlink. */ + saverr = ENOTSUP; + goto out; + } + + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", inode.fd); + + if (size) + { + value = new (nothrow) char[size]; + if (value == nullptr) + { + saverr = ENOMEM; + goto out; + } + + ret = getxattr(procname, name, value, size); + if (ret == -1) + goto out_err; + saverr = 0; + if (ret == 0) + goto out; + + fuse_reply_buf(req, value, ret); + } + else + { + ret = getxattr(procname, name, nullptr, 0); + if (ret == -1) + goto out_err; + + fuse_reply_xattr(req, ret); + } +out_free: + delete[] value; + return; + +out_err: + saverr = errno; +out: + fuse_reply_err(req, saverr); + goto out_free; +} + +static void sfs_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size) +{ + char *value = nullptr; + Inode &inode = get_inode(ino); + ssize_t ret; + int saverr; + + if (inode.is_symlink) + { + /* Sorry, no race free way to listxattr on symlink. */ + saverr = ENOTSUP; + goto out; + } + + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", inode.fd); + + if (size) + { + value = new (nothrow) char[size]; + if (value == nullptr) + { + saverr = ENOMEM; + goto out; + } + + ret = listxattr(procname, value, size); + if (ret == -1) + goto out_err; + saverr = 0; + if (ret == 0) + goto out; + + fuse_reply_buf(req, value, ret); + } + else + { + ret = listxattr(procname, nullptr, 0); + if (ret == -1) + goto out_err; + + fuse_reply_xattr(req, ret); + } +out_free: + delete[] value; + return; +out_err: + saverr = errno; +out: + fuse_reply_err(req, saverr); + goto out_free; +} + +static void sfs_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, + const char *value, size_t size, int flags) +{ + Inode &inode = get_inode(ino); + ssize_t ret; + int saverr; + + if (inode.is_symlink) + { + /* Sorry, no race free way to setxattr on symlink. */ + saverr = ENOTSUP; + goto out; + } + + char procname[64]; + sprintf(procname, "/proc/self/fd/%i", inode.fd); + + ret = setxattr(procname, name, value, size, flags); + saverr = ret == -1 ? errno : 0; + +out: + fuse_reply_err(req, saverr); +} + +static void sfs_removexattr(fuse_req_t req, fuse_ino_t ino, const char *name) +{ + char procname[64]; + Inode &inode = get_inode(ino); + ssize_t ret; + int saverr; + + if (inode.is_symlink) + { + /* Sorry, no race free way to setxattr on symlink. */ + saverr = ENOTSUP; + goto out; + } + + sprintf(procname, "/proc/self/fd/%i", inode.fd); + ret = removexattr(procname, name); + saverr = ret == -1 ? errno : 0; + +out: + fuse_reply_err(req, saverr); +} +#endif + +static void assign_operations(fuse_lowlevel_ops &sfs_oper) +{ + sfs_oper.init = sfs_init; + sfs_oper.lookup = sfs_lookup; + sfs_oper.mkdir = sfs_mkdir; + sfs_oper.mknod = sfs_mknod; + sfs_oper.symlink = sfs_symlink; + sfs_oper.link = sfs_link; + sfs_oper.unlink = sfs_unlink; + sfs_oper.rmdir = sfs_rmdir; + sfs_oper.rename = sfs_rename; + sfs_oper.forget = sfs_forget; + sfs_oper.forget_multi = sfs_forget_multi; + sfs_oper.getattr = sfs_getattr; + sfs_oper.setattr = sfs_setattr; + sfs_oper.readlink = sfs_readlink; + sfs_oper.opendir = sfs_opendir; + sfs_oper.readdir = sfs_readdir; + sfs_oper.readdirplus = sfs_readdirplus; + sfs_oper.releasedir = sfs_releasedir; + sfs_oper.fsyncdir = sfs_fsyncdir; + sfs_oper.create = sfs_create; + sfs_oper.open = sfs_open; + sfs_oper.release = sfs_release; + sfs_oper.flush = sfs_flush; + sfs_oper.fsync = sfs_fsync; + sfs_oper.read = sfs_read; + sfs_oper.write_buf = sfs_write_buf; + sfs_oper.statfs = sfs_statfs; +#ifdef HAVE_POSIX_FALLOCATE + sfs_oper.fallocate = sfs_fallocate; +#endif + sfs_oper.flock = sfs_flock; +#ifdef HAVE_SETXATTR + sfs_oper.setxattr = sfs_setxattr; + sfs_oper.getxattr = sfs_getxattr; + sfs_oper.listxattr = sfs_listxattr; + sfs_oper.removexattr = sfs_removexattr; +#endif +} + +void maximize_fd_limit() +{ + struct rlimit lim + { + }; + auto res = getrlimit(RLIMIT_NOFILE, &lim); + if (res != 0) + { + warn("WARNING: getrlimit() failed with"); + return; + } + lim.rlim_cur = lim.rlim_max; + res = setrlimit(RLIMIT_NOFILE, &lim); + if (res != 0) + warn("WARNING: setrlimit() failed with"); +} + +int start(const char *arg0, const char *statehistdir, const char *fusemntdir) +{ + // We need an fd for every entry in our the filesystem that the + // kernel knows about. This is way more than most processes need, + // so try to get rid of any resource softlimit. + maximize_fd_limit(); + + // We consider this as the first run of the history dir is empty. + const bool firstrun = boost::filesystem::is_empty(statehistdir); + + statefs::init(statehistdir); + statemonitor.ctx = statefs::get_statedir_context(); + fs.source = statemonitor.ctx.datadir; + + // Create a checkpoint from the second run onwards. + if (!firstrun) + statemonitor.create_checkpoint(); + + // Initialize filesystem root + fs.root.fd = -1; + fs.root.nlookup = 9999; + fs.root.is_symlink = false; + fs.timeout = 86400.0; + + struct stat stat; + auto ret = lstat(fs.source.c_str(), &stat); + if (ret == -1) + err(1, "ERROR: failed to stat source (\"%s\")", fs.source.c_str()); + if (!S_ISDIR(stat.st_mode)) + errx(1, "ERROR: source is not a directory"); + fs.src_dev = stat.st_dev; + + fs.root.fd = open(fs.source.c_str(), O_PATH); + if (fs.root.fd == -1) + err(1, "ERROR: open(\"%s\", O_PATH)", fs.source.c_str()); + + // Initialize fuse + fuse_args args = FUSE_ARGS_INIT(0, nullptr); + if (fuse_opt_add_arg(&args, arg0) || + fuse_opt_add_arg(&args, "-o") || + fuse_opt_add_arg(&args, "default_permissions,fsname=hpstatefs") + /*|| fuse_opt_add_arg(&args, "-odebug")*/) + errx(3, "ERROR: Out of memory"); + + fuse_lowlevel_ops sfs_oper{}; + assign_operations(sfs_oper); + auto se = fuse_session_new(&args, &sfs_oper, sizeof(sfs_oper), &fs); + if (se == nullptr) + goto err_out1; + + if (fuse_set_signal_handlers(se) != 0) + goto err_out2; + + // Don't apply umask, use modes exactly as specified + umask(0); + + // Mount and run main loop + struct fuse_loop_config loop_config; + loop_config.clone_fd = 0; + loop_config.max_idle_threads = 10; + if (fuse_session_mount(se, fusemntdir) != 0) + goto err_out3; + + ret = fuse_session_loop_mt(se, &loop_config); + + fuse_session_unmount(se); + +err_out3: + fuse_remove_signal_handlers(se); +err_out2: + fuse_session_destroy(se); +err_out1: + fuse_opt_free_args(&args); + + return ret ? 1 : 0; +} + +} // namespace fusefs + +int main(int argc, char *argv[]) +{ + if (argc != 3) + { + std::cerr << "Incorrect arguments.\n"; + exit(1); + } + + fusefs::start(argv[0], argv[1], argv[2]); +} \ No newline at end of file diff --git a/src/statefs/state_monitor/fusefs.hpp b/src/statefs/state_monitor/fusefs.hpp new file mode 100644 index 00000000..762ca856 --- /dev/null +++ b/src/statefs/state_monitor/fusefs.hpp @@ -0,0 +1,9 @@ +#ifndef _FUSE_FS_ +#define _FUSE_FS_ + +namespace fusefs +{ +int start(const char *arg0, const char *source, const char *mountpoint, const char *deltadir); +} + +#endif \ No newline at end of file diff --git a/src/statefs/state_monitor/state_monitor.cpp b/src/statefs/state_monitor/state_monitor.cpp new file mode 100644 index 00000000..46d57736 --- /dev/null +++ b/src/statefs/state_monitor/state_monitor.cpp @@ -0,0 +1,519 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../hasher.hpp" +#include "../state_common.hpp" +#include "state_monitor.hpp" + +namespace statefs +{ + +void state_monitor::create_checkpoint() +{ + // Shift -1 and below checkpoints by 1 more. + // If MAX oldest checkpoint is there, remove it and work our way upwards. + int16_t oldest_chkpnt = (MAX_CHECKPOINTS + 1) * -1; // +1 because we maintain one extra checkpoint in case of rollbacks. + for (int16_t chkpnt = oldest_chkpnt; chkpnt <= -1; chkpnt++) + { + std::string dir = get_statedir_root(chkpnt); + + if (boost::filesystem::exists(dir)) + { + if (chkpnt == oldest_chkpnt) + { + boost::filesystem::remove_all(dir); + } + else + { + std::string dirshift = get_statedir_root(chkpnt - 1); + boost::filesystem::rename(dir, dirshift); + } + } + + if (chkpnt == -1) + { + statedir_context ctx = get_statedir_context(0, true); + + // Shift 0-state delta dir to -1. + std::string delta_1 = dir + DELTA_DIR; + boost::filesystem::create_directories(delta_1); + + boost::filesystem::rename(ctx.deltadir, delta_1); + boost::filesystem::create_directories(ctx.deltadir); + } + } + + return; +} + +void state_monitor::oncreate(const int fd) +{ + std::lock_guard lock(monitor_mutex); + + std::string filepath; + if (extract_filepath(filepath, fd) == 0) + oncreate_filepath(filepath); +} + +void state_monitor::onopen(const int inodefd, const int flags) +{ + std::lock_guard lock(monitor_mutex); + + std::string filepath; + if (extract_filepath(filepath, inodefd) == 0) + { + state_file_info *fi; + if (get_tracked_fileinfo(&fi, filepath) == 0) + { + // Check whether fd is open in truncate mode. If so cache the entire file immediately. + if (flags & O_TRUNC) + cache_blocks(*fi, 0, fi->original_length); + } + } +} + +void state_monitor::onwrite(const int fd, const off_t offset, const size_t length) +{ + std::lock_guard lock(monitor_mutex); + + std::string filepath; + if (get_fd_filepath(filepath, fd) == 0) + { + state_file_info *fi; + if (get_tracked_fileinfo(&fi, filepath) == 0) + cache_blocks(*fi, offset, length); + } +} + +void state_monitor::onrename(const std::string &oldfilepath, const std::string &newfilepath) +{ + std::lock_guard lock(monitor_mutex); + + ondelete_filepath(oldfilepath); + oncreate_filepath(newfilepath); +} + +void state_monitor::ondelete(const std::string &filepath) +{ + std::lock_guard lock(monitor_mutex); + ondelete_filepath(filepath); +} + +void state_monitor::ontruncate(const int fd, const off_t newsize) +{ + std::lock_guard lock(monitor_mutex); + + std::string filepath; + if (get_fd_filepath(filepath, fd) == 0) + { + // If truncated size is less than the original, cache the entire file. + state_file_info *fi; + if (get_tracked_fileinfo(&fi, filepath) == 0 && newsize < fi->original_length) + cache_blocks(*fi, 0, fi->original_length); + } +} + +void state_monitor::onclose(const int fd) +{ + std::lock_guard lock(monitor_mutex); + + auto pitr = fdpathmap.find(fd); + if (pitr != fdpathmap.end()) + { + // Close any block cache/index fds we have opened for this file. + auto fitr = fileinfomap.find(pitr->second); // pitr->second is the filepath string. + if (fitr != fileinfomap.end()) + close_cachingfds(fitr->second); // fitr->second is the fileinfo struct. + + fdpathmap.erase(pitr); + } +} + +/** + * Extracts the full physical file path for a given fd. + * @param filepath String to assign the extracted file path. + * @param fd The file descriptor to find the filepath. + * @return 0 on successful file path extraction. -1 on failure. + */ +int state_monitor::extract_filepath(std::string &filepath, const int fd) +{ + char proclnk[32]; + sprintf(proclnk, "/proc/self/fd/%d", fd); + + filepath.resize(PATH_MAX); + ssize_t len = readlink(proclnk, filepath.data(), PATH_MAX); + if (len > 0) + { + filepath.resize(len); + return 0; + } + return -1; +} + +/** + * Find the full physical file path for a given fd using the fd map. + * @param filepath String to assign the extracted file path. + * @param fd The file descriptor to find the filepath. + * @return 0 on successful file path extraction. -1 on failure. + */ +int state_monitor::get_fd_filepath(std::string &filepath, const int fd) +{ + // Return path from the map if found. + const auto itr = fdpathmap.find(fd); + if (itr != fdpathmap.end()) + { + filepath = itr->second; + return 0; + } + + // Extract the file path and populate the fd-->filepath map. + if (extract_filepath(filepath, fd) == 0) + { + fdpathmap[fd] = filepath; + return 0; + } + + return -1; +} + +void state_monitor::oncreate_filepath(const std::string &filepath) +{ + // Check whether we are already tracking this file path. + // Only way this could happen is deleting an existing file and creating a new file with same name. + if (fileinfomap.count(filepath) == 0) + { + // Add an entry for the new file in the file info map. This information will be used to ignore + // future operations (eg. write/delete) done to this file. + state_file_info fi; + fi.isnew = true; + fi.filepath = filepath; + fileinfomap[filepath] = std::move(fi); + + // Add to the list of new files added during this session. + write_newfileentry(filepath); + } +} + +void state_monitor::ondelete_filepath(const std::string &filepath) +{ + state_file_info *fi; + if (get_tracked_fileinfo(&fi, filepath) == 0) + { + if (fi->isnew) + { + // If this is a new file, just remove from existing index entries. + // No need to cache the file blocks. + remove_newfileentry(fi->filepath); + fileinfomap.erase(filepath); + } + else + { + // If not a new file, cache the entire file. + cache_blocks(*fi, 0, fi->original_length); + } + } +} + +/** + * Finds the tracked state file information for the given filepath. + * @param fi Reference pointer to assign the state file info struct. + * @param filepath Full physical path of the file. + * @return 0 on successful find. -1 on failure. + */ +int state_monitor::get_tracked_fileinfo(state_file_info **fi, const std::string &filepath) +{ + // Return from filepath-->fileinfo map if found. + const auto itr = fileinfomap.find(filepath); + if (itr != fileinfomap.end()) + { + *fi = &itr->second; + return 0; + } + + // Initialize a new state file info struct for the given filepath. + state_file_info &fileinfo = fileinfomap[filepath]; + + // We use stat() to find out the length of the file. + struct stat stat_buf; + if (stat(filepath.c_str(), &stat_buf) != 0) + { + std::cerr << errno << ": Error occured in stat() of " << filepath << "\n"; + return -1; + } + + fileinfo.original_length = stat_buf.st_size; + fileinfo.filepath = filepath; + *fi = &fileinfo; + return 0; +} + +/** + * Caches the specified bytes range of the given file. + * @param fi The file info struct pointing to the file to be cached. + * @param offset The start byte position for caching. + * @param length How many bytes to cache. + * @return 0 on successful execution. -1 on failure. + */ +int state_monitor::cache_blocks(state_file_info &fi, const off_t offset, const size_t length) +{ + // No caching required if this is a new file created during this session. + if (fi.isnew) + return 0; + + uint32_t original_blockcount = ceil((double)fi.original_length / (double)BLOCK_SIZE); + + // Check whether we have already cached the entire file. + if (original_blockcount == fi.cached_blockids.size()) + return 0; + + // Initialize fds and indexes required for caching. + if (prepare_caching(fi) != 0) + return -1; + + // Return if incoming write is outside any of the original blocks. + if (offset > original_blockcount * BLOCK_SIZE) + return 0; + + uint32_t startblock = offset / BLOCK_SIZE; + uint32_t endblock = (offset + length) / BLOCK_SIZE; + + // std::cout << "Cache blocks: '" << fi.filepath << "' [" << offset << "," << length << "] " << startblock << "," << endblock << "\n"; + + // If this is the first time we are caching this file, write an entry to the touched file index. + if (fi.cached_blockids.empty() && write_touchedfileentry(fi.filepath) != 0) + return -1; + + for (uint32_t i = startblock; i <= endblock; i++) + { + // Skip if we have already cached this block. + if (fi.cached_blockids.count(i) > 0) + continue; + + // Read the block being replaced and send to cache file. + // Allocating block buffer on the heap to avoid filling limited stack space. + std::unique_ptr blockbuf = std::make_unique(BLOCK_SIZE); + off_t blockoffset = BLOCK_SIZE * i; + size_t bytesread = pread(fi.readfd, blockbuf.get(), BLOCK_SIZE, BLOCK_SIZE * i); + if (bytesread < 0) + { + std::cerr << errno << ": Read failed " << fi.filepath << "\n"; + return -1; + } + + // No more bytes to read in this file. + if (bytesread == 0) + return 0; + + if (write(fi.cachefd, blockbuf.get(), bytesread) < 0) + { + std::cerr << errno << ": Write to block cache failed. " << fi.filepath << "\n"; + return -1; + } + + // Append an entry (44 bytes) into the block cache index. We maintain this index to + // help random block access for external use cases. We currently do not sort this index here. + // Whoever is using the index must sort it if required. + // Entry format: [blocknum(4 bytes) | cacheoffset(8 bytes) | blockhash(32 bytes)] + + char entrybuf[BLOCKINDEX_ENTRY_SIZE]; + hasher::B2H hash = hasher::hash(&blockoffset, 8, blockbuf.get(), bytesread); + + // Original file block id. + memcpy(entrybuf, &i, 4); + // Position of the block within the cache file. + off_t cacheoffset = fi.cached_blockids.size() * BLOCK_SIZE; + memcpy(entrybuf + 4, &cacheoffset, 8); + // The block hash. + memcpy(entrybuf + 12, hash.data, 32); + if (write(fi.indexfd, entrybuf, BLOCKINDEX_ENTRY_SIZE) < 0) + { + std::cerr << errno << ": Write to block index failed. " << fi.filepath << "\n"; + return -1; + } + + // Mark the block as cached. + fi.cached_blockids.emplace(i); + } + + return 0; +} + +/** + * Initializes fds and indexes required for caching. + * @param fi The state file info struct pointing to the file being cached. + * @return 0 on succesful initialization. -1 on failure. + */ +int state_monitor::prepare_caching(state_file_info &fi) +{ + // If readfd is greater than 0 then we take it as caching being already initialized. + if (fi.readfd > 0) + return 0; + + // Open up the file using a read-only fd. This fd will be used to fetch blocks to be cached. + fi.readfd = open(fi.filepath.c_str(), O_RDONLY); + if (fi.readfd < 0) + { + std::cerr << errno << ": Open failed " << fi.filepath << "\n"; + return -1; + } + + // Get the path of the file relative to the state dir. We maintain this same reative path for the + // corresponding cache and index files in the cache dir. + std::string relpath = get_relpath(fi.filepath, ctx.datadir); + + std::string tmppath; + tmppath.reserve(ctx.deltadir.length() + relpath.length() + BLOCKCACHE_EXT_LEN); + tmppath.append(ctx.deltadir).append(relpath).append(BLOCKCACHE_EXT); + + // Create directory tree if not exist so we are able to create the cache and index files. + boost::filesystem::path cachesubdir = boost::filesystem::path(tmppath).parent_path(); + if (created_cachesubdirs.count(cachesubdir.string()) == 0) + { + boost::filesystem::create_directories(cachesubdir); + created_cachesubdirs.emplace(cachesubdir.string()); + } + + // Create and open the block cache file. + fi.cachefd = open(tmppath.c_str(), O_WRONLY | O_APPEND | O_CREAT, FILE_PERMS); + if (fi.cachefd <= 0) + { + std::cerr << errno << ": Open failed " << tmppath << "\n"; + return -1; + } + + // Create and open the block index file. + tmppath.replace(tmppath.length() - BLOCKCACHE_EXT_LEN, BLOCKINDEX_EXT_LEN, BLOCKINDEX_EXT); + fi.indexfd = open(tmppath.c_str(), O_WRONLY | O_APPEND | O_CREAT, FILE_PERMS); + if (fi.indexfd <= 0) + { + std::cerr << errno << ": Open failed " << tmppath << "\n"; + return -1; + } + + // Write first entry (8 bytes) to the index file. First entry is the length of the original file. + // This will be helpful when restoring/rolling back a file. + if (write(fi.indexfd, &fi.original_length, 8) == -1) + { + std::cerr << errno << ": Error writing to index file " << tmppath << "\n"; + return -1; + } + + return 0; +} + +/** + * Closes any open caching fds for a given file. + */ +void state_monitor::close_cachingfds(state_file_info &fi) +{ + if (fi.readfd > 0) + close(fi.readfd); + + if (fi.cachefd > 0) + close(fi.cachefd); + + if (fi.indexfd > 0) + close(fi.indexfd); + + fi.readfd = 0; + fi.cachefd = 0; + fi.indexfd = 0; +} + +/** + * Inserts a file into the modified files list of this session. + * This index is used to restore modified files during restore. + */ +int state_monitor::write_touchedfileentry(std::string_view filepath) +{ + if (touchedfileindexfd <= 0) + { + std::string indexfile = ctx.deltadir + "/idxtouched.idx"; + touchedfileindexfd = open(indexfile.c_str(), O_WRONLY | O_APPEND | O_CREAT, FILE_PERMS); + if (touchedfileindexfd <= 0) + { + std::cerr << errno << ": Open failed " << indexfile << "\n"; + return -1; + } + } + + // Write the relative file path line to the index. + filepath = filepath.substr(ctx.datadir.length(), filepath.length() - ctx.datadir.length()); + write(touchedfileindexfd, filepath.data(), filepath.length()); + write(touchedfileindexfd, "\n", 1); + return 0; +} + +/** + * Inserts a file into the list of new files created during this session. + * This index is used in deleting new files during restore. + */ +int state_monitor::write_newfileentry(std::string_view filepath) +{ + std::string indexfile = ctx.deltadir + "/idxnew.idx"; + int fd = open(indexfile.c_str(), O_WRONLY | O_APPEND | O_CREAT, FILE_PERMS); + if (fd <= 0) + { + std::cerr << errno << ": Open failed " << indexfile << "\n"; + return -1; + } + + // Write the relative file path line to the index. + filepath = filepath.substr(ctx.datadir.length(), filepath.length() - ctx.datadir.length()); + write(fd, filepath.data(), filepath.length()); + write(fd, "\n", 1); + close(fd); + return 0; +} + +/** + * Scans and removes the given filepath from the new files index. + */ +void state_monitor::remove_newfileentry(std::string_view filepath) +{ + filepath = filepath.substr(ctx.datadir.length(), filepath.length() - ctx.datadir.length()); + + // We create a copy of the new file index and transfer lines from first file + // to the second file except the line matching the given filepath. + + std::string indexfile = ctx.deltadir + "/idxnew.idx"; + std::string indexfile_tmp = ctx.deltadir + "/idxnew.idx.tmp"; + + std::ifstream infile(indexfile); + std::ofstream outfile(indexfile_tmp); + + bool linestransferred = false; + for (std::string line; std::getline(infile, line);) + { + if (line != filepath) // Skip the file being removed. + { + outfile << line << "\n"; + linestransferred = true; + } + } + + infile.close(); + outfile.close(); + + // Remove the old index. + std::remove(indexfile.c_str()); + + // If no lines transferred, delete the temp file as well. + if (linestransferred) + std::rename(indexfile_tmp.c_str(), indexfile.c_str()); + else + std::remove(indexfile_tmp.c_str()); +} + +} // namespace statefs \ No newline at end of file diff --git a/src/statefs/state_monitor/state_monitor.hpp b/src/statefs/state_monitor/state_monitor.hpp new file mode 100644 index 00000000..7958bdc8 --- /dev/null +++ b/src/statefs/state_monitor/state_monitor.hpp @@ -0,0 +1,77 @@ +#ifndef _STATEFS_STATE_MONITOR_ +#define _STATEFS_STATE_MONITOR_ + +#include +#include +#include +#include +#include +#include +#include "../state_common.hpp" + +namespace statefs +{ + +// Holds information about an original file in state that we are tracking. +struct state_file_info +{ + bool isnew; + off_t original_length; + std::unordered_set cached_blockids; + std::string filepath; + int readfd; + int cachefd; + int indexfd; +}; + +// Invoked by fuse file system for relevent file system calls. +class state_monitor +{ +private: + // Map of fd-->filepath + std::unordered_map fdpathmap; + + // Map of filepath-->fileinfo + std::unordered_map fileinfomap; + + // Complete list of modified files during the session. + std::unordered_set touchedfiles; + + // List of new cache sub directories created during the session. + std::unordered_set created_cachesubdirs; + + // Mutex to synchronize parallel file system calls into our custom state tracking logic. + std::mutex monitor_mutex; + + // Holds the fd used to write into modified files index. This will be kept open for the entire + // life of the state monitor. + int touchedfileindexfd = 0; + + int extract_filepath(std::string &filepath, const int fd); + int get_fd_filepath(std::string &filepath, const int fd); + void oncreate_filepath(const std::string &filepath); + void ondelete_filepath(const std::string &filepath); + int get_tracked_fileinfo(state_file_info **fileinfo, const std::string &filepath); + + int cache_blocks(state_file_info &fi, const off_t offset, const size_t length); + int prepare_caching(state_file_info &fi); + void close_cachingfds(state_file_info &fi); + int write_touchedfileentry(std::string_view filepath); + int write_newfileentry(std::string_view filepath); + void remove_newfileentry(std::string_view filepath); + +public: + statedir_context ctx; + void create_checkpoint(); + void oncreate(const int fd); + void onopen(const int inodefd, const int flags); + void onwrite(const int fd, const off_t offset, const size_t length); + void onrename(const std::string &oldfilepath, const std::string &newfilepath); + void ondelete(const std::string &filepath); + void ontruncate(const int fd, const off_t newsize); + void onclose(const int fd); +}; + +} // namespace statefs + +#endif \ No newline at end of file diff --git a/src/statefs/state_restore.cpp b/src/statefs/state_restore.cpp new file mode 100644 index 00000000..f856a085 --- /dev/null +++ b/src/statefs/state_restore.cpp @@ -0,0 +1,200 @@ +#include "../pchheader.hpp" +#include "../hplog.hpp" +#include "hasher.hpp" +#include "state_restore.hpp" +#include "hashtree_builder.hpp" +#include "state_common.hpp" + +namespace statefs +{ + +// Look at new files added and delete them if still exist. +void state_restore::delete_newfiles() +{ + std::string indexfile(ctx.deltadir); + indexfile.append(IDX_NEWFILES); + + std::ifstream infile(indexfile); + for (std::string file; std::getline(infile, file);) + { + std::string filepath(ctx.datadir); + filepath.append(file); + + std::remove(filepath.c_str()); + } + + infile.close(); +} + +// Look at touched files and restore them. +int state_restore::restore_touchedfiles() +{ + std::unordered_set processed; + + std::string indexfile(ctx.deltadir); + indexfile.append(IDX_TOUCHEDFILES); + + std::ifstream infile(indexfile); + for (std::string file; std::getline(infile, file);) + { + // Skip if already processed. + if (processed.count(file) > 0) + continue; + + std::vector bindex; + if (read_blockindex(bindex, file) != 0) + return -1; + + if (restore_blocks(file, bindex) != 0) + return -1; + + // Add to processed file list. + processed.emplace(file); + } + + infile.close(); + return 0; +} + +// Read the delta block index. +int state_restore::read_blockindex(std::vector &buffer, std::string_view file) +{ + std::string bindexfile(ctx.deltadir); + bindexfile.append(file).append(BLOCKINDEX_EXT); + std::ifstream infile(bindexfile, std::ios::binary | std::ios::ate); + std::streamsize idxsize = infile.tellg(); + infile.seekg(0, std::ios::beg); + + buffer.resize(idxsize); + if (!infile.read(buffer.data(), idxsize)) + { + LOG_ERR << errno << ": Read failed " << bindexfile; + return -1; + } + + return 0; +} + +// Restore blocks mentioned in the delta block index. +int state_restore::restore_blocks(std::string_view file, const std::vector &bindex) +{ + int bcachefd = 0, orifilefd = 0; + const char *idxptr = bindex.data(); + + // First 8 bytes of the index contains the supposed length of the original file. + off_t originallen = 0; + memcpy(&originallen, idxptr, 8); + + // Open block cache file. + { + std::string bcachefile(ctx.deltadir); + bcachefile.append(file).append(BLOCKCACHE_EXT); + bcachefd = open(bcachefile.c_str(), O_RDONLY); + if (bcachefd <= 0) + { + LOG_ERR << errno << ": Open failed " << bcachefile; + return -1; + } + } + + // Create or Open original file. + { + std::string originalfile(ctx.datadir); + originalfile.append(file); + + // Create directory tree if not exist so we are able to create the file. + boost::filesystem::path filedir = boost::filesystem::path(originalfile).parent_path(); + if (created_dirs.count(filedir.string()) == 0) + { + boost::filesystem::create_directories(filedir); + created_dirs.emplace(filedir.string()); + } + + orifilefd = open(originalfile.c_str(), O_WRONLY | O_CREAT, FILE_PERMS); + if (orifilefd <= 0) + { + LOG_ERR << errno << ": Open failed " << originalfile; + return -1; + } + } + + // Restore the blocks as specified in block index. + for (uint32_t idxoffset = 8; idxoffset < bindex.size();) + { + // Find the block no. of where this block is from in the original file. + uint32_t blockno = 0; + memcpy(&blockno, idxptr + idxoffset, 4); + idxoffset += 4; + off_t orifileoffset = blockno * BLOCK_SIZE; + + // Find the offset where the block is located in the block cache file. + off_t bcacheoffset; + memcpy(&bcacheoffset, idxptr + idxoffset, 8); + idxoffset += 40; // Skip the hash(32) + + // Transfer the cached block to the target file. + copy_file_range(bcachefd, &bcacheoffset, orifilefd, &orifileoffset, BLOCK_SIZE, 0); + } + + // If the target file is bigger than the original size, truncate it to the original size. + off_t currentlen = lseek(orifilefd, 0, SEEK_END); + if (currentlen > originallen) + ftruncate(orifilefd, originallen); + + close(bcachefd); + close(orifilefd); + + return 0; +} + +// This is called after a rollback so the all checkpoint dirs shift by 1. +void state_restore::rewind_checkpoints() +{ + // Assuming we have restored the current state with current delta, + // we need to shift each history delta by 1 place. + + // Delete the state 0 (current) delta. + boost::filesystem::remove_all(ctx.deltadir); + + int16_t oldest_chkpnt = (MAX_CHECKPOINTS + 1) * -1; // +1 because we maintain one extra checkpoint in case of rollbacks. + for (int16_t chkpnt = -1; chkpnt >= oldest_chkpnt; chkpnt--) + { + std::string dir = get_statedir_root(chkpnt); + + if (boost::filesystem::exists(dir)) + { + if (chkpnt == -1) + { + // Shift -1 state delta dir to 0-state and delete -1 dir. + std::string delta_1 = dir + DELTA_DIR; + boost::filesystem::rename(delta_1, ctx.deltadir); + boost::filesystem::remove_all(dir); + } + else + { + std::string dirshift = get_statedir_root(chkpnt + 1); + boost::filesystem::rename(dir, dirshift); + } + } + } +} + +// Rolls back current state to previous state. +int state_restore::rollback(hasher::B2H &roothash) +{ + ctx = get_statedir_context(); + + delete_newfiles(); + if (restore_touchedfiles() == -1) + return -1; + + // Update hash tree. + hashtree_builder htreebuilder(ctx); + htreebuilder.generate(roothash); + + rewind_checkpoints(); + + return 0; +} + +} // namespace statefs \ No newline at end of file diff --git a/src/statefs/state_restore.hpp b/src/statefs/state_restore.hpp new file mode 100644 index 00000000..1038c441 --- /dev/null +++ b/src/statefs/state_restore.hpp @@ -0,0 +1,28 @@ +#ifndef _STATEFS_STATE_RESTORE_ +#define _STATEFS_STATE_RESTORE_ + +#include "../pchheader.hpp" +#include "hasher.hpp" +#include "state_common.hpp" + +namespace statefs +{ + +class state_restore +{ +private: + statedir_context ctx; + std::unordered_set created_dirs; + void delete_newfiles(); + int restore_touchedfiles(); + int read_blockindex(std::vector &buffer, std::string_view file); + int restore_blocks(std::string_view file, const std::vector &bindex); + void rewind_checkpoints(); + +public: + int rollback(hasher::B2H &roothash); +}; + +} // namespace statefs + +#endif diff --git a/src/util.cpp b/src/util.cpp index 50dffdc3..918cecb9 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -188,4 +188,13 @@ std::string_view getsv(const rapidjson::Value &v) return std::string_view(v.GetString(), v.GetStringLength()); } +// provide a safe std::string overload for realpath +std::string realpath(std::string path) +{ + std::array buffer; + ::realpath(path.c_str(), buffer.data()); + buffer[PATH_MAX] = '\0'; + return buffer.data(); +} + } // namespace util \ No newline at end of file diff --git a/src/util.hpp b/src/util.hpp index 3ebae8d0..f485fcf3 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -11,10 +11,10 @@ namespace util { // Hot Pocket version. Displayed on 'hotpocket version' and written to new contract configs. -constexpr const char* HP_VERSION = "0.1"; +constexpr const char *HP_VERSION = "0.1"; // Minimum compatible contract config version (this will be used to validate contract configs) -constexpr const char* MIN_CONTRACT_VERSION = "0.1"; +constexpr const char *MIN_CONTRACT_VERSION = "0.1"; // Current version of the peer message protocol. constexpr uint8_t PEERMSG_VERSION = 1; @@ -74,6 +74,8 @@ int version_compare(const std::string &x, const std::string &y); std::string_view getsv(const rapidjson::Value &v); +std::string realpath(std::string path); + } // namespace util #endif \ No newline at end of file