Files
mongo/jstests/sharding/libs/sharding_util.js
Cheahuychou Mao c901cf8903 SERVER-111799 Decrease the number of documents in delete_during_migrate.js (#42054)
GitOrigin-RevId: 31a89753797cf750c9d63c3ea5d82ab5ca346a36
2025-10-01 20:31:36 +00:00

103 lines
3.0 KiB
JavaScript

/**
* Helpers for creating and accessing sharding metadata.
*/
import {findChunksUtil} from "jstests/sharding/libs/find_chunks_util.js";
export function getShards(db) {
return db.adminCommand({listShards: 1}).shards;
}
export function getShardNames(db) {
return getShards(db).map((shard) => shard._id);
}
export function getShardHosts(db) {
return getShards(db).map((shard) => shard.host);
}
/**
* Finds the _id of the primary shard for database 'dbname', e.g., 'test-rs0'
*/
export function getPrimaryShardIdForDatabase(conn, dbname) {
let x = conn.getDB("config").databases.findOne({_id: dbname});
if (x) {
return x.primary;
}
throw Error("couldn't find dbname: " + dbname);
}
export function getPrimaryShardNameForDB(db) {
const config = db.getSiblingDB("config");
const dbdoc = config.databases.findOne({_id: db.getName()});
if (dbdoc) {
return dbdoc.primary;
} else {
throw Error("Database " + db.getName() + " not found in config.databases.");
}
}
export function getShardNamesForCollection(conn, dbName, collName) {
const ns = dbName + "." + collName;
const config = conn.getDB("config");
const collDoc = config.collections.findOne({_id: ns});
if (!collDoc) {
// This is an untracked unsharded collection.
return new Set([getPrimaryShardIdForDatabase(conn, dbName)]);
}
const chunkDocs = findChunksUtil.findChunksByNs(config, ns);
return new Set(chunkDocs.map((doc) => doc.shard));
}
export function getNonPrimaryShardName(db) {
const shardNames = getShardNames(db);
const primary = getPrimaryShardNameForDB(db);
for (let i = 0; i < shardNames.length; ++i) {
if (shardNames[i] !== primary) {
return shardNames[i];
}
}
return null;
}
/**
* Returns an array of chunks such that each shard has a chunk range that roughly equally covers
* [min, max]
*/
export function createChunks(shardNames, shardKey, min, max) {
const chunks = [];
const rangeSize = max - min + 1;
if (rangeSize < shardNames.length) {
throw new Error("[min, max] range is not large enough");
}
const chunkSize = Math.floor(rangeSize / shardNames.length);
for (let i = 0; i < shardNames.length; i++) {
chunks.push({
min: {[shardKey]: min + chunkSize * i},
max: {[shardKey]: min + chunkSize * (i + 1)},
shard: shardNames[i],
});
}
chunks[0].min = {[shardKey]: MinKey};
chunks[chunks.length - 1].max = {[shardKey]: MaxKey};
return chunks;
}
export function isSlowBuild(conn) {
const buildInfo = conn.getDB("admin").getServerBuildInfo();
const rawBuildInfo = buildInfo.rawData();
jsTest.log("buildInfo: " + tojson({rawBuildInfo}));
return (
buildInfo.isAddressSanitizerActive() ||
buildInfo.isThreadSanitizerActive() ||
buildInfo.isDebug() ||
(rawBuildInfo.hasOwnProperty("buildEnvironment") && rawBuildInfo.buildEnvironment.target_os == "windows")
);
}