add invalid tenant state and assertion in metacluster consistency

This commit is contained in:
Jon Fu 2022-10-26 14:37:00 -07:00
parent f21fcf67ce
commit b17c3fecbb
4 changed files with 37 additions and 3 deletions

View File

@ -397,7 +397,7 @@ std::vector<const char*> metaclusterHintGenerator(std::vector<StringRef> const&
"<NAME>", "<max_tenant_groups=<NUM_GROUPS>|connection_string=<CONNECTION_STRING>>"
};
return std::vector<const char*>(opts.begin() + std::min<int>(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<const char*> opts = { "[BEGIN]", "[END]", "[LIMIT]", "[state=<STATE1>,<STATE2>,...]" };
return std::vector<const char*>(opts.begin() + tokens.size() - 2, opts.end());
} else if (tokencmp(tokens[1], "get") && tokens.size() < 4) {

View File

@ -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) {

View File

@ -49,6 +49,7 @@ typedef Standalone<TenantGroupNameRef> 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<TenantGroupNameRef> 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.

View File

@ -71,6 +71,20 @@ private:
ACTOR static Future<Void> loadManagementClusterMetadata(MetaclusterConsistencyCheck* self) {
state Reference<typename DB::TransactionT> managementTr = self->managementDb->createTransaction();
state std::vector<std::pair<TenantName, TenantMapEntry>> tenantList;
state std::vector<std::pair<TenantName, TenantMapEntry>> tenantListReady;
state std::vector<std::pair<TenantName, TenantMapEntry>> tenantListOther;
state std::vector<TenantState> readyFilter;
state std::vector<TenantState> 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<TenantName, TenantMapEntry>(tenantList.begin(), tenantList.end());
for (auto t : self->managementMetadata.clusterTenantTuples.results) {