add invalid tenant state and assertion in metacluster consistency
This commit is contained in:
parent
f21fcf67ce
commit
b17c3fecbb
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue