Loading src/cluster.cpp +23 −2 Original line number Diff line number Diff line Loading @@ -1219,12 +1219,33 @@ namespace authdb { auto data = pclient_->retrieve(gid); if (data.empty()) { std::cerr << "[SCRUB] group " << gid << " — retrieve returned empty, skipping" << std::endl; << " — retrieve returned empty, skipping (NOT removing)" << std::endl; result.groups_failed++; continue; } // remove + store ensures correct block placement on all nodes // Validate retrieved data before removing the existing blocks. // A manifest must have at least a valid AuthHeader + magic + count. if (data.size() < sizeof(AuthHeader) + sizeof(uint32_t) + sizeof(uint32_t)) { std::cerr << "[SCRUB] group " << gid << " — retrieved data too small (" << data.size() << " bytes), skipping (NOT removing)" << std::endl; result.groups_failed++; continue; } // Verify AuthHeader is present AuthHeader head; std::memcpy(&head, data.data(), sizeof(AuthHeader)); if (head.start != 0xFE) { std::cerr << "[SCRUB] group " << gid << " — retrieved data has invalid header marker" << ", skipping (NOT removing)" << std::endl; result.groups_failed++; continue; } // Data is valid — safe to remove and re-store for correct placement pclient_->remove(gid); pclient_->store(gid, data.data(), data.size()); result.groups_repaired++; Loading Loading
src/cluster.cpp +23 −2 Original line number Diff line number Diff line Loading @@ -1219,12 +1219,33 @@ namespace authdb { auto data = pclient_->retrieve(gid); if (data.empty()) { std::cerr << "[SCRUB] group " << gid << " — retrieve returned empty, skipping" << std::endl; << " — retrieve returned empty, skipping (NOT removing)" << std::endl; result.groups_failed++; continue; } // remove + store ensures correct block placement on all nodes // Validate retrieved data before removing the existing blocks. // A manifest must have at least a valid AuthHeader + magic + count. if (data.size() < sizeof(AuthHeader) + sizeof(uint32_t) + sizeof(uint32_t)) { std::cerr << "[SCRUB] group " << gid << " — retrieved data too small (" << data.size() << " bytes), skipping (NOT removing)" << std::endl; result.groups_failed++; continue; } // Verify AuthHeader is present AuthHeader head; std::memcpy(&head, data.data(), sizeof(AuthHeader)); if (head.start != 0xFE) { std::cerr << "[SCRUB] group " << gid << " — retrieved data has invalid header marker" << ", skipping (NOT removing)" << std::endl; result.groups_failed++; continue; } // Data is valid — safe to remove and re-store for correct placement pclient_->remove(gid); pclient_->store(gid, data.data(), data.size()); result.groups_repaired++; Loading