Merge pull request #9479 from sfc-gh-nwijetunga/nim/enforce-metacluster-tenant-mode

Enforce Disabled Tenant Mode in Metacluster
This commit is contained in:
A.J. Beamon 2023-02-24 19:27:57 -08:00 committed by GitHub
commit 1c71056e26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 46 additions and 12 deletions

View File

@ -104,7 +104,7 @@ ACTOR Future<bool> metaclusterCreateCommand(Reference<IDatabase> db, std::vector
return false;
}
Optional<std::string> errorStr = wait(MetaclusterAPI::createMetacluster(db, tokens[2], tenantIdPrefix));
Optional<std::string> errorStr = wait(MetaclusterAPI::createMetacluster(db, tokens[2], tenantIdPrefix, true));
if (errorStr.present()) {
fmt::print("ERROR: {}.\n", errorStr.get());
} else {

View File

@ -64,6 +64,18 @@ def get_cluster_connection_str(cluster_file_path):
@enable_logging()
def metacluster_create(logger, cluster_file, name, tenant_id_prefix):
# creating a metacluster with optional tenant mode should fail
rc, out, err = run_fdbcli_command(cluster_file, "configure tenant_mode=optional_experimental")
if rc != 0:
raise Exception(err)
rc, out, err = run_fdbcli_command(cluster_file, "metacluster create_experimental", name, str(tenant_id_prefix))
if "ERROR" not in out:
raise Exception("Metacluster creation should have failed")
# set the tenant mode to disabled for the metacluster otherwise creation will fail
rc, out, err = run_fdbcli_command(cluster_file, "configure tenant_mode=disabled")
logger.debug('Metacluster tenant mode set to disabled')
if rc != 0:
raise Exception(err)
rc, out, err = run_fdbcli_command(cluster_file, "metacluster create_experimental", name, str(tenant_id_prefix))
if rc != 0:
raise Exception(err)

View File

@ -530,8 +530,19 @@ Future<Void> managementClusterCheckEmpty(Transaction tr) {
return Void();
}
ACTOR template <class Transaction>
Future<TenantMode> getClusterConfiguredTenantMode(Transaction tr) {
state typename transaction_future_type<Transaction, Optional<Value>>::type tenantModeFuture =
tr->get(tenantModeConfKey);
Optional<Value> tenantModeValue = wait(safeThreadFutureToFuture(tenantModeFuture));
return TenantMode::fromValue(tenantModeValue.castTo<ValueRef>());
}
ACTOR template <class DB>
Future<Optional<std::string>> createMetacluster(Reference<DB> db, ClusterName name, int64_t tenantIdPrefix) {
Future<Optional<std::string>> createMetacluster(Reference<DB> db,
ClusterName name,
int64_t tenantIdPrefix,
bool enableTenantModeCheck) {
state Reference<typename DB::TransactionT> tr = db->createTransaction();
state Optional<UID> metaclusterUid;
ASSERT(tenantIdPrefix >= TenantAPI::TENANT_ID_PREFIX_MIN_VALUE &&
@ -545,6 +556,8 @@ Future<Optional<std::string>> createMetacluster(Reference<DB> db, ClusterName na
MetaclusterMetadata::metaclusterRegistration().get(tr);
state Future<Void> metaclusterEmptinessCheck = managementClusterCheckEmpty(tr);
state Future<TenantMode> tenantModeFuture =
enableTenantModeCheck ? getClusterConfiguredTenantMode(tr) : Future<TenantMode>(TenantMode::DISABLED);
Optional<MetaclusterRegistrationEntry> existingRegistration = wait(metaclusterRegistrationFuture);
if (existingRegistration.present()) {
@ -560,6 +573,11 @@ Future<Optional<std::string>> createMetacluster(Reference<DB> db, ClusterName na
}
wait(metaclusterEmptinessCheck);
TenantMode tenantMode = wait(tenantModeFuture);
if (tenantMode != TenantMode::DISABLED) {
return fmt::format("cluster is configured with tenant mode `{}' when tenants should be disabled",
tenantMode);
}
if (!metaclusterUid.present()) {
metaclusterUid = deterministicRandom()->randomUniqueID();

View File

@ -75,7 +75,8 @@ struct MetaclusterManagementConcurrencyWorkload : TestWorkload {
cx.getReference(),
"management_cluster"_sr,
deterministicRandom()->randomInt(TenantAPI::TENANT_ID_PREFIX_MIN_VALUE,
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1))));
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1),
false)));
}
return Void();
}

View File

@ -127,8 +127,8 @@ struct MetaclusterManagementWorkload : TestWorkload {
self->dataDbs[self->dataDbIndex.back()] = makeReference<DataClusterData>(
Database::createSimulatedExtraDatabase(connectionString, cx->defaultTenant));
}
wait(success(
MetaclusterAPI::createMetacluster(cx.getReference(), "management_cluster"_sr, self->tenantIdPrefix)));
wait(success(MetaclusterAPI::createMetacluster(
cx.getReference(), "management_cluster"_sr, self->tenantIdPrefix, false)));
return Void();
}

View File

@ -182,7 +182,8 @@ struct MetaclusterRestoreWorkload : TestWorkload {
self->managementDb,
"management_cluster"_sr,
deterministicRandom()->randomInt(TenantAPI::TENANT_ID_PREFIX_MIN_VALUE,
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1))));
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1),
false)));
ASSERT(g_simulator->extraDatabases.size() > 0);
state std::vector<std::string>::iterator extraDatabasesItr;
@ -538,7 +539,8 @@ struct MetaclusterRestoreWorkload : TestWorkload {
self->managementDb,
"management_cluster"_sr,
deterministicRandom()->randomInt(TenantAPI::TENANT_ID_PREFIX_MIN_VALUE,
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1))));
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1),
false)));
state std::map<ClusterName, DataClusterData>::iterator clusterItr;
for (clusterItr = self->dataDbs.begin(); clusterItr != self->dataDbs.end(); ++clusterItr) {
TraceEvent("MetaclusterRestoreWorkloadProcessDataCluster").detail("FromCluster", clusterItr->first);

View File

@ -80,8 +80,8 @@ struct TenantCapacityLimits : TestWorkload {
MultiVersionApi::api->selectApiVersion(cx->apiVersion.version());
self->managementDb = MultiVersionDatabase::debugCreateFromExistingDatabase(threadSafeHandle);
wait(success(
MetaclusterAPI::createMetacluster(cx.getReference(), "management_cluster"_sr, self->tenantIdPrefix)));
wait(success(MetaclusterAPI::createMetacluster(
cx.getReference(), "management_cluster"_sr, self->tenantIdPrefix, false)));
DataClusterEntry entry;
entry.capacity.numTenantGroups = 1e9;

View File

@ -109,7 +109,8 @@ struct TenantManagementConcurrencyWorkload : TestWorkload {
cx.getReference(),
"management_cluster"_sr,
deterministicRandom()->randomInt(TenantAPI::TENANT_ID_PREFIX_MIN_VALUE,
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1))));
TenantAPI::TENANT_ID_PREFIX_MAX_VALUE + 1),
false)));
state int extraDatabaseIdx;
for (extraDatabaseIdx = 0; extraDatabaseIdx < g_simulator->extraDatabases.size(); ++extraDatabaseIdx) {

View File

@ -237,8 +237,8 @@ struct TenantManagementWorkload : TestWorkload {
if (self->useMetacluster) {
fmt::print("Create metacluster and register data cluster ... \n");
// Configure the metacluster (this changes the tenant mode)
wait(success(
MetaclusterAPI::createMetacluster(cx.getReference(), "management_cluster"_sr, self->tenantIdPrefix)));
wait(success(MetaclusterAPI::createMetacluster(
cx.getReference(), "management_cluster"_sr, self->tenantIdPrefix, false)));
DataClusterEntry entry;
entry.capacity.numTenantGroups = 1e9;