fdbcli: show status details about # works and # key ranges if blob granules enabled (#7792)

* fdbcli: show status if blob granules is enabled

* fdbcli: show status details for blob granules for # works and # key ranges
This commit is contained in:
Hui Liu 2022-08-05 10:33:57 -07:00 committed by GitHub
parent b2835921ba
commit 29ad2c0654
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 2 deletions

View File

@ -411,6 +411,7 @@ void printStatus(StatusObjectReader statusObj,
outputString += "\nConfiguration:";
std::string outputStringCache = outputString;
bool isOldMemory = false;
bool blobGranuleEnabled{ false };
try {
// Configuration section
// FIXME: Should we suppress this if there are cluster messages implying that the database has no
@ -434,7 +435,6 @@ void printStatus(StatusObjectReader statusObj,
outputString += "unknown";
int intVal = 0;
bool blobGranuleEnabled{ false };
if (statusObjConfig.get("blob_granules_enabled", intVal) && intVal) {
blobGranuleEnabled = true;
}
@ -1110,6 +1110,15 @@ void printStatus(StatusObjectReader statusObj,
outputString += "\n\nCoordination servers:";
outputString += getCoordinatorsInfoString(statusObj);
}
if (blobGranuleEnabled) {
outputString += "\n\nBlob Granules:";
StatusObjectReader statusObjBlobGranules = statusObjCluster["blob_granules"];
auto numWorkers = statusObjBlobGranules["number_of_blob_workers"].get_int();
outputString += "\n Number of Workers - " + format("%d", numWorkers);
auto numKeyRanges = statusObjBlobGranules["number_of_key_ranges"].get_int();
outputString += "\n Number of Key Ranges - " + format("%d", numKeyRanges);
}
}
// client time

View File

@ -2358,6 +2358,40 @@ ACTOR static Future<JsonBuilderObject> clusterSummaryStatisticsFetcher(
return statusObj;
}
ACTOR static Future<JsonBuilderObject> blobWorkerStatusFetcher(
std::vector<BlobWorkerInterface> servers,
std::unordered_map<NetworkAddress, WorkerInterface> addressWorkersMap,
std::set<std::string>* incompleteReason) {
state JsonBuilderObject statusObj;
state int totalRanges = 0;
state std::vector<Future<Optional<TraceEventFields>>> futures;
statusObj["number_of_blob_workers"] = static_cast<int>(servers.size());
try {
for (auto& intf : servers) {
auto workerIntf = addressWorkersMap[intf.address()];
futures.push_back(latestEventOnWorker(workerIntf, "BlobWorkerMetrics"));
}
wait(waitForAll(futures));
for (auto future : futures) {
if (future.get().present()) {
auto latestTrace = future.get().get();
totalRanges += latestTrace.getInt("NumRangesAssigned");
}
}
statusObj["number_of_key_ranges"] = totalRanges;
} catch (Error& e) {
if (e.code() == error_code_actor_cancelled)
throw;
incompleteReason->insert("Unknown blob worker stats");
}
return statusObj;
}
static JsonBuilderObject tlogFetcher(int* logFaultTolerance,
const std::vector<TLogSet>& tLogs,
std::unordered_map<NetworkAddress, WorkerInterface> const& address_workers) {
@ -2985,6 +3019,7 @@ ACTOR Future<StatusReply> clusterGetStatus(
state Optional<DatabaseConfiguration> configuration;
state Optional<LoadConfigurationResult> loadResult;
state std::unordered_map<NetworkAddress, WorkerInterface> address_workers;
if (statusCode != RecoveryStatus::configuration_missing) {
std::pair<Optional<DatabaseConfiguration>, Optional<LoadConfigurationResult>> loadResults =
@ -3038,7 +3073,6 @@ ACTOR Future<StatusReply> clusterGetStatus(
// Start getting storage servers now (using system priority) concurrently. Using sys priority because
// having storage servers in status output is important to give context to error messages in status that
// reference a storage server role ID.
state std::unordered_map<NetworkAddress, WorkerInterface> address_workers;
for (auto const& worker : workers) {
address_workers[worker.interf.address()] = worker.interf;
}
@ -3259,6 +3293,12 @@ ACTOR Future<StatusReply> clusterGetStatus(
statusObj["processes"] = processStatus;
statusObj["clients"] = clientStatusFetcher(clientStatus);
if (configuration.present() && configuration.get().blobGranulesEnabled) {
JsonBuilderObject blobGranuelsStatus =
wait(blobWorkerStatusFetcher(blobWorkers, address_workers, &status_incomplete_reasons));
statusObj["blob_granules"] = blobGranuelsStatus;
}
JsonBuilderArray incompatibleConnectionsArray;
for (auto it : incompatibleConnections) {
incompatibleConnectionsArray.push_back(it.toString());