Loading README.md +8 −8 Changes for README.md: 8 added lines, 8 removed lines. Original line number Diff line number Diff line Loading @@ -1046,14 +1046,14 @@ Client-metrics require the CMake argument `-DGKFS_ENABLE_CLIENT_METRICS=ON` (see environment. - `LIBGKFS_PROXY_PID_FILE` - Path to the proxy pid file (when using the GekkoFS proxy). - `LIBGKFS_NUM_REPL` - Number of replicas for data. - Mutation/redistribution is rejected while `LIBGKFS_NUM_REPL` is nonzero until replica-aware placement and recovery are implemented. - Daemons can mirror this safety setting with `GKFS_DAEMON_NUM_REPL`; any nonzero value rejects topology mutation before maintenance starts. - The migration planner and recovery state track replica copy indices and placement generations, but the live daemon executor still rejects replica-tagged migration jobs until it has an explicit remote source-copy read path. - Simple-hash replication supports replica-aware mutation when `GKFS_DAEMON_NUM_REPL` matches `LIBGKFS_NUM_REPL` on all clients/daemons and the new host count is greater than the replica count. - Random Slicing with replication remains rejected because it does not yet define independent deterministic replica placement. - Migration plans carry replica copy indices and placement generations; stale or malformed plans are rejected before I/O, and daemon migration reads the selected remote source copy explicitly. - `LIBGKFS_REPAIR_STATUS_PATH` - Optional path for client-local repair counters and queue status. - `LIBGKFS_REPAIR_JOURNAL_PATH` - Optional path for client-local pending repair tasks. The journal is single-owner: do not share it between client processes. Its `.lock` sidecar records the owning host, Loading docs/sphinx/users/running.md +5 −6 Changes for docs/sphinx/users/running.md: 5 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -368,12 +368,11 @@ The user can enable the data replication feature by setting the replication envi The number of replicas should go from `0` to the `number of servers - 1`. The replication environment variable can be set up for each client independently. Mutation and redistribution are currently rejected while replication is enabled; replica-aware placement during topology changes is not yet supported. Set `GKFS_DAEMON_NUM_REPL` consistently on daemons to make the same rejection explicit at the daemon boundary. The internal planner tracks copy indices and placement generations, but live replica migration remains disabled until daemon-side source-copy reads exist. Simple-hash replication supports mutation when `GKFS_DAEMON_NUM_REPL` matches `LIBGKFS_NUM_REPL` and the new host count is greater than the replica count. Random Slicing with replication remains rejected because independent replica placement is not defined for that strategy. Migration plans validate copy indices and placement generations before I/O. For client-local repair recovery, set `LIBGKFS_REPAIR_JOURNAL_PATH` to a writable journal path. One client process owns a journal at a time. The adjacent `.lock` Loading include/client/rpc/replica.hpp +1 −1 Changes for include/client/rpc/replica.hpp: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -147,7 +147,7 @@ replica_metrics() { inline bool mutation_supported_with_replicas(const int replica_count) { return replica_count == 0; return replica_count >= 0; } inline int Loading include/daemon/malleability/malleable_manager.hpp +2 −0 Changes for include/daemon/malleability/malleable_manager.hpp: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,8 @@ private: // Tracks old hosts_size before expansion/shrink unsigned int old_hosts_size_{0}; gkfs::rpc::host_t old_local_host_id_{0}; std::unique_ptr<gkfs::rpc::Distributor> old_distributor_; std::vector<std::pair<std::string, std::string>> load_hostfile(const std::string& path); Loading src/client/malleability.cpp +0 −20 Changes for src/client/malleability.cpp: 0 added lines, 20 removed lines. Original line number Diff line number Diff line Loading @@ -54,16 +54,6 @@ int mutate_start(int old_server_conf, int new_server_conf, const std::string& new_hosts_file) { LOG(INFO, "{}() Mutate operation enter", __func__); if(const auto error = gkfs::rpc::mutation_error_with_replicas(CTX->get_replicas()); error != 0) { LOG(ERROR, "{}() mutation is not supported when LIBGKFS_NUM_REPL={} is enabled", __func__, CTX->get_replicas()); cerr << "ERR: Mutation is not supported with replication enabled" << endl; return error; } // sanity checks auto hf = std::getenv("LIBGKFS_HOSTS_FILE"); try { Loading Loading @@ -165,16 +155,6 @@ mutate_status_detailed() { int mutate_finalize() { LOG(INFO, "{}() enter", __func__); if(const auto error = gkfs::rpc::mutation_error_with_replicas(CTX->get_replicas()); error != 0) { LOG(ERROR, "{}() mutation finalize is not supported when LIBGKFS_NUM_REPL={} is enabled", __func__, CTX->get_replicas()); cerr << "ERR: Mutation is not supported with replication enabled" << endl; return error; } auto res = gkfs::malleable::rpc::forward_mutate_finalize(); const auto* hf = std::getenv("LIBGKFS_HOSTS_FILE"); if(res == 0 && hf != nullptr) { Loading Loading
README.md +8 −8 Changes for README.md: 8 added lines, 8 removed lines. Original line number Diff line number Diff line Loading @@ -1046,14 +1046,14 @@ Client-metrics require the CMake argument `-DGKFS_ENABLE_CLIENT_METRICS=ON` (see environment. - `LIBGKFS_PROXY_PID_FILE` - Path to the proxy pid file (when using the GekkoFS proxy). - `LIBGKFS_NUM_REPL` - Number of replicas for data. - Mutation/redistribution is rejected while `LIBGKFS_NUM_REPL` is nonzero until replica-aware placement and recovery are implemented. - Daemons can mirror this safety setting with `GKFS_DAEMON_NUM_REPL`; any nonzero value rejects topology mutation before maintenance starts. - The migration planner and recovery state track replica copy indices and placement generations, but the live daemon executor still rejects replica-tagged migration jobs until it has an explicit remote source-copy read path. - Simple-hash replication supports replica-aware mutation when `GKFS_DAEMON_NUM_REPL` matches `LIBGKFS_NUM_REPL` on all clients/daemons and the new host count is greater than the replica count. - Random Slicing with replication remains rejected because it does not yet define independent deterministic replica placement. - Migration plans carry replica copy indices and placement generations; stale or malformed plans are rejected before I/O, and daemon migration reads the selected remote source copy explicitly. - `LIBGKFS_REPAIR_STATUS_PATH` - Optional path for client-local repair counters and queue status. - `LIBGKFS_REPAIR_JOURNAL_PATH` - Optional path for client-local pending repair tasks. The journal is single-owner: do not share it between client processes. Its `.lock` sidecar records the owning host, Loading
docs/sphinx/users/running.md +5 −6 Changes for docs/sphinx/users/running.md: 5 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -368,12 +368,11 @@ The user can enable the data replication feature by setting the replication envi The number of replicas should go from `0` to the `number of servers - 1`. The replication environment variable can be set up for each client independently. Mutation and redistribution are currently rejected while replication is enabled; replica-aware placement during topology changes is not yet supported. Set `GKFS_DAEMON_NUM_REPL` consistently on daemons to make the same rejection explicit at the daemon boundary. The internal planner tracks copy indices and placement generations, but live replica migration remains disabled until daemon-side source-copy reads exist. Simple-hash replication supports mutation when `GKFS_DAEMON_NUM_REPL` matches `LIBGKFS_NUM_REPL` and the new host count is greater than the replica count. Random Slicing with replication remains rejected because independent replica placement is not defined for that strategy. Migration plans validate copy indices and placement generations before I/O. For client-local repair recovery, set `LIBGKFS_REPAIR_JOURNAL_PATH` to a writable journal path. One client process owns a journal at a time. The adjacent `.lock` Loading
include/client/rpc/replica.hpp +1 −1 Changes for include/client/rpc/replica.hpp: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -147,7 +147,7 @@ replica_metrics() { inline bool mutation_supported_with_replicas(const int replica_count) { return replica_count == 0; return replica_count >= 0; } inline int Loading
include/daemon/malleability/malleable_manager.hpp +2 −0 Changes for include/daemon/malleability/malleable_manager.hpp: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -53,6 +53,8 @@ private: // Tracks old hosts_size before expansion/shrink unsigned int old_hosts_size_{0}; gkfs::rpc::host_t old_local_host_id_{0}; std::unique_ptr<gkfs::rpc::Distributor> old_distributor_; std::vector<std::pair<std::string, std::string>> load_hostfile(const std::string& path); Loading
src/client/malleability.cpp +0 −20 Changes for src/client/malleability.cpp: 0 added lines, 20 removed lines. Original line number Diff line number Diff line Loading @@ -54,16 +54,6 @@ int mutate_start(int old_server_conf, int new_server_conf, const std::string& new_hosts_file) { LOG(INFO, "{}() Mutate operation enter", __func__); if(const auto error = gkfs::rpc::mutation_error_with_replicas(CTX->get_replicas()); error != 0) { LOG(ERROR, "{}() mutation is not supported when LIBGKFS_NUM_REPL={} is enabled", __func__, CTX->get_replicas()); cerr << "ERR: Mutation is not supported with replication enabled" << endl; return error; } // sanity checks auto hf = std::getenv("LIBGKFS_HOSTS_FILE"); try { Loading Loading @@ -165,16 +155,6 @@ mutate_status_detailed() { int mutate_finalize() { LOG(INFO, "{}() enter", __func__); if(const auto error = gkfs::rpc::mutation_error_with_replicas(CTX->get_replicas()); error != 0) { LOG(ERROR, "{}() mutation finalize is not supported when LIBGKFS_NUM_REPL={} is enabled", __func__, CTX->get_replicas()); cerr << "ERR: Mutation is not supported with replication enabled" << endl; return error; } auto res = gkfs::malleable::rpc::forward_mutate_finalize(); const auto* hf = std::getenv("LIBGKFS_HOSTS_FILE"); if(res == 0 && hf != nullptr) { Loading