Commit daa9d8ce authored by Ramon Nou's avatar Ramon Nou
Browse files

Complete simple-hash replica-aware topology mutation

parent a8916aee
Loading
Loading
Loading
Loading
Loading
+8 −8
Changes for README.md: 8 added lines, 8 removed lines.
Original line number Diff line number Diff line
@@ -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,
+5 −6
Changes for docs/sphinx/users/running.md: 5 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -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`
+1 −1
Changes for include/client/rpc/replica.hpp: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -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
+2 −0
Changes for include/daemon/malleability/malleable_manager.hpp: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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);
+0 −20
Changes for src/client/malleability.cpp: 0 added lines, 20 removed lines.
Original line number Diff line number Diff line
@@ -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 {
@@ -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