Merge pull request #9479 from sfc-gh-nwijetunga/nim/enforce-metacluster-tenant-mode
Enforce Disabled Tenant Mode in Metacluster
This commit is contained in:
commit
1c71056e26
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue