Loading src/backends/cluster.cpp +33 −5 Changes for src/backends/cluster.cpp: 33 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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); } } Loading Loading
src/backends/cluster.cpp +33 −5 Changes for src/backends/cluster.cpp: 33 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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); } } Loading