From b17c3fecbbd9a41865ddf3fb270447e6eea9682f Mon Sep 17 00:00:00 2001 From: Jon Fu Date: Wed, 26 Oct 2022 14:37:00 -0700 Subject: [PATCH] add invalid tenant state and assertion in metacluster consistency --- fdbcli/MetaclusterCommands.actor.cpp | 2 +- fdbclient/Tenant.cpp | 4 +++- fdbclient/include/fdbclient/Tenant.h | 12 +++++++++- .../workloads/MetaclusterConsistency.actor.h | 22 +++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/fdbcli/MetaclusterCommands.actor.cpp b/fdbcli/MetaclusterCommands.actor.cpp index 652df4645b..068fe75de5 100644 --- a/fdbcli/MetaclusterCommands.actor.cpp +++ b/fdbcli/MetaclusterCommands.actor.cpp @@ -397,7 +397,7 @@ std::vector metaclusterHintGenerator(std::vector const& "", "|connection_string=>" }; return std::vector(opts.begin() + std::min(1, tokens.size() - 2), opts.end()); - } else if (tokencmp(tokens[1], "list") && tokens.size() < 5) { + } else if (tokencmp(tokens[1], "list") && tokens.size() < 6) { static std::vector opts = { "[BEGIN]", "[END]", "[LIMIT]", "[state=,,...]" }; return std::vector(opts.begin() + tokens.size() - 2, opts.end()); } else if (tokencmp(tokens[1], "get") && tokens.size() < 4) { diff --git a/fdbclient/Tenant.cpp b/fdbclient/Tenant.cpp index e4d27a8be0..8ef4a8b9e3 100644 --- a/fdbclient/Tenant.cpp +++ b/fdbclient/Tenant.cpp @@ -64,6 +64,8 @@ std::string TenantMapEntry::tenantStateToString(TenantState tenantState) { return "renaming to"; case TenantState::ERROR: return "error"; + case TenantState::INVALID: + return "invalid"; default: UNREACHABLE(); } @@ -87,7 +89,7 @@ TenantState TenantMapEntry::stringToTenantState(std::string stateStr) { return TenantState::ERROR; } - UNREACHABLE(); + return TenantState::INVALID; } std::string TenantMapEntry::tenantLockStateToString(TenantLockState tenantState) { diff --git a/fdbclient/include/fdbclient/Tenant.h b/fdbclient/include/fdbclient/Tenant.h index 87e1731e90..0781ed08a2 100644 --- a/fdbclient/include/fdbclient/Tenant.h +++ b/fdbclient/include/fdbclient/Tenant.h @@ -49,6 +49,7 @@ typedef Standalone TenantGroupName; // RENAMING_TO - the tenant is being created as a rename from an existing tenant and is awaiting the rename to complete // on the data cluster // ERROR - the tenant is in an error state +// INVALID - Unrecognized state - likely the result of a failed parsing // // A tenant in any configuration is allowed to be removed. Only tenants in the READY or UPDATING_CONFIGURATION phases // can have their configuration updated. A tenant must not exist or be in the REGISTERING phase to be created. To be @@ -57,7 +58,16 @@ typedef Standalone TenantGroupName; // // If an operation fails and the tenant is left in a non-ready state, re-running the same operation is legal. If // successful, the tenant will return to the READY state. -enum class TenantState { REGISTERING, READY, REMOVING, UPDATING_CONFIGURATION, RENAMING_FROM, RENAMING_TO, ERROR }; +enum class TenantState { + REGISTERING, + READY, + REMOVING, + UPDATING_CONFIGURATION, + RENAMING_FROM, + RENAMING_TO, + ERROR, + INVALID +}; // Represents the lock state the tenant could be in. // Can be used in conjunction with the other tenant states above. diff --git a/fdbserver/include/fdbserver/workloads/MetaclusterConsistency.actor.h b/fdbserver/include/fdbserver/workloads/MetaclusterConsistency.actor.h index 25f3fcae19..55b6aa863a 100644 --- a/fdbserver/include/fdbserver/workloads/MetaclusterConsistency.actor.h +++ b/fdbserver/include/fdbserver/workloads/MetaclusterConsistency.actor.h @@ -71,6 +71,20 @@ private: ACTOR static Future loadManagementClusterMetadata(MetaclusterConsistencyCheck* self) { state Reference managementTr = self->managementDb->createTransaction(); state std::vector> tenantList; + state std::vector> tenantListReady; + state std::vector> tenantListOther; + + state std::vector readyFilter; + state std::vector otherFilter; + + readyFilter.push_back(TenantState::READY); + otherFilter.push_back(TenantState::REGISTERING); + otherFilter.push_back(TenantState::REMOVING); + otherFilter.push_back(TenantState::UPDATING_CONFIGURATION); + otherFilter.push_back(TenantState::RENAMING_FROM); + otherFilter.push_back(TenantState::RENAMING_TO); + otherFilter.push_back(TenantState::ERROR); + otherFilter.push_back(TenantState::INVALID); loop { try { @@ -101,6 +115,12 @@ private: store(tenantList, MetaclusterAPI::listTenantsTransaction( managementTr, ""_sr, "\xff\xff"_sr, metaclusterMaxTenants)) && + store(tenantListReady, + MetaclusterAPI::listTenantsTransaction( + managementTr, ""_sr, "\xff\xff"_sr, metaclusterMaxTenants, readyFilter)) && + store(tenantListOther, + MetaclusterAPI::listTenantsTransaction( + managementTr, ""_sr, "\xff\xff"_sr, metaclusterMaxTenants, otherFilter)) && store(self->managementMetadata.tenantGroups, MetaclusterAPI::ManagementClusterMetadata::tenantMetadata().tenantGroupMap.getRange( managementTr, {}, {}, metaclusterMaxTenants)) && @@ -113,6 +133,8 @@ private: } } + ASSERT(tenantListReady.size() + tenantListOther.size() == tenantList.size()); + self->managementMetadata.tenantMap = std::map(tenantList.begin(), tenantList.end()); for (auto t : self->managementMetadata.clusterTenantTuples.results) {