bool CatalogManagerReplicaSet::runReadCommand(const std::string& dbname,
                                              const BSONObj& cmdObj,
                                              BSONObjBuilder* result) {
    auto targeter = grid.shardRegistry()->getShard("config")->getTargeter();
    auto target = targeter->findHost(kConfigReadSelector);
    if (!target.isOK()) {
        return Command::appendCommandStatus(*result, target.getStatus());
    }

    auto resultStatus = grid.shardRegistry()->runCommand(target.getValue(), dbname, cmdObj);
    if (!resultStatus.isOK()) {
        return Command::appendCommandStatus(*result, resultStatus.getStatus());
    }

    result->appendElements(resultStatus.getValue());

    return Command::getStatusFromCommandResult(resultStatus.getValue()).isOK();
}
bool CatalogManagerReplicaSet::_runReadCommand(OperationContext* txn,
                                               const std::string& dbname,
                                               const BSONObj& cmdObj,
                                               const ReadPreferenceSetting& settings,
                                               BSONObjBuilder* result) {
    auto targeter = grid.shardRegistry()->getShard(txn, "config")->getTargeter();
    auto target = targeter->findHost(settings);
    if (!target.isOK()) {
        return Command::appendCommandStatus(*result, target.getStatus());
    }

    auto resultStatus = grid.shardRegistry()->runCommandOnConfig(target.getValue(), dbname, cmdObj);
    if (!resultStatus.isOK()) {
        return Command::appendCommandStatus(*result, resultStatus.getStatus());
    }

    result->appendElements(resultStatus.getValue());

    return Command::getStatusFromCommandResult(resultStatus.getValue()).isOK();
}
Exemple #3
0
/* organize fetch bundling for given expression */
static void
bundle(Task *t, Expr *x)
{
    Metric	*m;
    Host	*h;
    int		i;

    if (x->op == CND_FETCH) {
	m = x->metrics;
	for (i = 0; i < x->hdom; i++) {
	    h = findHost(t, m);
	    m->host = h;
	    if (m->conv)	/* initialized Metric */
		bundleMetric(h, m);
	    else		/* uninitialized Metric */
		waitMetric(m);
	    m++;
	}
#if PCP_DEBUG
	if (pmDebug & DBG_TRACE_APPL1) {
 	    fprintf(stderr, "bundle: task " PRINTF_P_PFX "%p nth=%d prev=" PRINTF_P_PFX "%p next=" PRINTF_P_PFX "%p delta=%.3f nrules=%d\n",
 		t, t->nth, t->prev, t->next, t->delta, t->nrules+1);
	    __dumpExpr(1, x);
	    m = x->metrics;
	    for (i = 0; i < x->hdom; i++) {
		__dumpMetric(2, m);
		m++;
	    }
	}
#endif
    }
    else {
	if (x->arg1) {
	    bundle(t, x->arg1);
	    if (x->arg2)
		bundle(t, x->arg2);
	}
    }
}
StatusWith<BSONObj> CatalogManagerReplicaSet::_runConfigServerCommandWithNotMasterRetries(
    const std::string& dbname, const BSONObj& cmdObj) {
    auto targeter = grid.shardRegistry()->getShard("config")->getTargeter();

    for (int i = 0; i < kNotMasterNumRetries; ++i) {
        auto target = targeter->findHost(kConfigWriteSelector);
        if (!target.isOK()) {
            if (ErrorCodes::NotMaster == target.getStatus()) {
                if (i == kNotMasterNumRetries - 1) {
                    // If we're out of retries don't bother sleeping, just return.
                    return target.getStatus();
                }
                sleepmillis(kNotMasterRetryInterval.count());
                continue;
            }
            return target.getStatus();
        }

        auto response = grid.shardRegistry()->runCommand(target.getValue(), dbname, cmdObj);
        if (!response.isOK()) {
            return response.getStatus();
        }

        Status commandStatus = Command::getStatusFromCommandResult(response.getValue());
        if (ErrorCodes::NotMaster == commandStatus) {
            if (i == kNotMasterNumRetries - 1) {
                // If we're out of retries don't bother sleeping, just return.
                return commandStatus;
            }
            sleepmillis(kNotMasterRetryInterval.count());
            continue;
        }

        return response.getValue();
    }

    MONGO_UNREACHABLE;
}