Commit bfe4152f authored by jan.koester's avatar jan.koester
Browse files

test

parent d9c2aca0
Loading
Loading
Loading
Loading
Loading
+33 −5
Changes for src/backends/cluster.cpp: 33 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -48,13 +48,22 @@ namespace authdb {
        return id;
    }

    // Helper: extract revision from a backend buffer
    static size_t bufferRevision(const std::vector<uint8_t> &buf) {
        if (buf.size() < sizeof(AuthHeader))
            return 0;
        AuthHeader head;
        std::memcpy(&head, buf.data(), sizeof(AuthHeader));
        return head.Revesion;
    }

    void ClusterBackend::fetchFromCluster() {
        if (!g_Cluster || !g_Cluster->isRunning())
            return;

        uint64_t dgid = domainGroupId();

        // Fetch from local store
        // Fetch from local block store (file-backed)
        auto &store = g_Cluster->getStore();
        std::vector<uint8_t> local_data;
        try {
@@ -80,13 +89,32 @@ namespace authdb {
            }
        }

        // Use whichever has more data (the one with actual content beyond the header)
        if (peer_data.size() > local_data.size()) {
            _Buffer = std::move(peer_data);
        // Pick the buffer with the highest revision (most recent writes)
        size_t local_rev = bufferRevision(local_data);
        size_t peer_rev  = bufferRevision(peer_data);
        size_t cur_rev   = bufferRevision(_Buffer);

        // Find the best candidate among local store, peer, and current in-memory
        std::vector<uint8_t> *best = nullptr;
        size_t best_rev = cur_rev;

        if (peer_rev > best_rev && !peer_data.empty()) {
            best = &peer_data;
            best_rev = peer_rev;
        }
        if (local_rev > best_rev && !local_data.empty()) {
            best = &local_data;
            best_rev = local_rev;
        }

        if (best) {
            _Buffer = std::move(*best);
            // Update local cache with the better version
            store.store(dgid, 0, _Buffer.data(), _Buffer.size());
        } else if (!local_data.empty()) {
        } else if (_Buffer.empty() && !local_data.empty()) {
            _Buffer = std::move(local_data);
        } else if (_Buffer.empty() && !peer_data.empty()) {
            _Buffer = std::move(peer_data);
        }
    }