本文整理汇总了C++中CurOp类的典型用法代码示例。如果您正苦于以下问题:C++ CurOp类的具体用法?C++ CurOp怎么用?C++ CurOp使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CurOp类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: run
void run() {
IndexDescriptor* id = addIndexWithInfo();
// Create a SortPhaseOne.
SortPhaseOne phaseOne;
phaseOne.sorter.reset( new BSONObjExternalSorter(_aFirstSort));
// Add index keys to the phaseOne.
int32_t nKeys = 130;
for( int32_t i = 0; i < nKeys; ++i ) {
phaseOne.sorter->add( BSON( "a" << i ), /* dummy disk loc */ DiskLoc(), false );
}
phaseOne.nkeys = phaseOne.n = nKeys;
phaseOne.sorter->sort( false );
// Set up remaining arguments.
set<DiskLoc> dups;
CurOp* op = cc().curop();
ProgressMeterHolder pm (op->setMessage("BuildBottomUp",
"BuildBottomUp Progress",
nKeys,
nKeys));
pm.finished();
Timer timer;
// The index's root has not yet been set.
ASSERT( id->getHead().isNull() );
// Finish building the index.
buildBottomUpPhases2And3<V1>( true,
id,
*phaseOne.sorter,
false,
dups,
op,
&phaseOne,
pm,
timer,
true );
// The index's root is set after the build is complete.
ASSERT( !id->getHead().isNull() );
// Create a cursor over the index.
scoped_ptr<BtreeCursor> cursor(
BtreeCursor::make( nsdetails( _ns ),
id->getOnDisk(),
BSON( "" << -1 ), // startKey below minimum key.
BSON( "" << nKeys ), // endKey above maximum key.
true, // endKeyInclusive true.
1 // direction forward.
) );
// Check that the keys in the index are the expected ones.
int32_t expectedKey = 0;
for( ; cursor->ok(); cursor->advance(), ++expectedKey ) {
ASSERT_EQUALS( expectedKey, cursor->currKey().firstElement().number() );
}
ASSERT_EQUALS( nKeys, expectedKey );
}
示例2: profile
void profile(OperationContext* txn, const Client& c, int op, CurOp& currentOp) {
// initialize with 1kb to start, to avoid realloc later
// doing this outside the dblock to improve performance
BufBuilder profileBufBuilder(1024);
bool tryAgain = false;
while ( 1 ) {
try {
// NOTE: It's kind of weird that we lock the op's namespace, but have to for now
// since we're sometimes inside the lock already
const string dbname(nsToDatabase(currentOp.getNS()));
scoped_ptr<Lock::DBLock> lk;
// todo: this can be slow, perhaps can re-work
if ( !txn->lockState()->isDbLockedForMode( dbname, MODE_IX ) ) {
lk.reset( new Lock::DBLock( txn->lockState(),
dbname,
tryAgain ? MODE_X : MODE_IX) );
}
Database* db = dbHolder().get(txn, dbname);
if (db != NULL) {
// We want the profiling to happen in a different WUOW from the actual op.
Lock::CollectionLock clk(txn->lockState(), db->getProfilingNS(), MODE_X);
WriteUnitOfWork wunit(txn);
Client::Context cx(txn, currentOp.getNS(), false);
if ( !_profile(txn, c, cx.db(), currentOp, profileBufBuilder ) && lk.get() ) {
if ( tryAgain ) {
// we couldn't profile, but that's ok, we should have logged already
break;
}
// we took an IX lock, so now we try again with an X lock
tryAgain = true;
continue;
}
wunit.commit();
}
else {
mongo::log() << "note: not profiling because db went away - "
<< "probably a close on: " << currentOp.getNS();
}
return;
}
catch (const AssertionException& assertionEx) {
warning() << "Caught Assertion while trying to profile " << opToString(op)
<< " against " << currentOp.getNS()
<< ": " << assertionEx.toString() << endl;
return;
}
}
}
示例3: receivedGetMore
bool receivedGetMore(DbResponse& dbresponse, Message& m, CurOp& curop ) {
bool ok = true;
DbMessage d(m);
const char *ns = d.getns();
int ntoreturn = d.pullInt();
long long cursorid = d.pullInt64();
curop.debug().ns = ns;
curop.debug().ntoreturn = ntoreturn;
curop.debug().cursorid = cursorid;
time_t start = 0;
int pass = 0;
bool exhaust = false;
QueryResult* msgdata;
while( 1 ) {
try {
readlock lk;
Client::Context ctx(ns);
msgdata = processGetMore(ns, ntoreturn, cursorid, curop, pass, exhaust);
}
catch ( AssertionException& e ) {
exhaust = false;
curop.debug().exceptionInfo = e.getInfo();
msgdata = emptyMoreResult(cursorid);
ok = false;
}
if (msgdata == 0) {
exhaust = false;
massert(13073, "shutting down", !inShutdown() );
if( pass == 0 ) {
start = time(0);
}
else {
if( time(0) - start >= 4 ) {
// after about 4 seconds, return. this is a sanity check. pass stops at 1000 normally
// for DEV this helps and also if sleep is highly inaccurate on a platform. we want to
// return occasionally so slave can checkpoint.
pass = 10000;
}
}
pass++;
DEV
sleepmillis(20);
else
sleepmillis(2);
continue;
}
示例4: verify
std::vector<BSONObj> IndexBuilder::killMatchingIndexBuilds(const BSONObj& criteria) {
verify(Lock::somethingWriteLocked());
std::vector<BSONObj> indexes;
CurOp* op = NULL;
while ((op = CurOp::getOp(criteria)) != NULL) {
BSONObj index = op->query();
killCurrentOp.kill(op->opNum());
indexes.push_back(index);
}
if (indexes.size() > 0) {
log() << "halted " << indexes.size() << " index build(s)" << endl;
}
return indexes;
}
示例5: SwitchToThread
void ClientCursor::staticYield(int micros, const StringData& ns) {
bool haveReadLock = Lock::isReadLocked();
killCurrentOp.checkForInterrupt();
{
dbtempreleasecond unlock;
if ( unlock.unlocked() ) {
if ( haveReadLock ) {
// This sleep helps reader threads yield to writer threads.
// Without this, the underlying reader/writer lock implementations
// are not sufficiently writer-greedy.
#ifdef _WIN32
SwitchToThread();
#else
if ( micros == 0 ) {
yieldOrSleepFor1Microsecond();
}
else {
sleepmicros(1);
}
#endif
}
else {
if ( micros == -1 ) {
sleepmicros(Client::recommendedYieldMicros());
}
else if ( micros == 0 ) {
yieldOrSleepFor1Microsecond();
}
else if ( micros > 0 ) {
sleepmicros( micros );
}
}
}
else if ( Listener::getTimeTracker() == 0 ) {
// we aren't running a server, so likely a repair, so don't complain
}
else {
CurOp * c = cc().curop();
while ( c->parent() )
c = c->parent();
warning() << "ClientCursor::staticYield can't unlock b/c of recursive lock"
<< " ns: " << ns
<< " top: " << c->info()
<< endl;
}
}
}
示例6: invariant
void MoveTimingHelper::done(int step) {
invariant(step == ++_nextStep);
invariant(step <= _totalNumSteps);
const std::string s = str::stream() << "step " << step << " of " << _totalNumSteps;
CurOp* op = CurOp::get(_txn);
{
stdx::lock_guard<Client> lk(*_txn->getClient());
op->setMessage_inlock(s.c_str());
}
_b.appendNumber(s, _t.millis());
_t.reset();
}
示例7: profile
void profile( const Client& c , CurOp& currentOp ) {
assertInWriteLock();
Database *db = c.database();
DEV assert( db );
const char *ns = db->profileName.c_str();
// build object
profileBufBuilder.reset();
BSONObjBuilder b(profileBufBuilder);
b.appendDate("ts", jsTime());
currentOp.debug().append( b );
b.append("client", c.clientAddress() );
if ( c.getAuthenticationInfo() )
b.append( "user" , c.getAuthenticationInfo()->getUser( nsToDatabase( ns ) ) );
BSONObj p = b.done();
// write: not replicated
NamespaceDetails *d = db->namespaceIndex.details(ns);
if( d ) {
int len = p.objsize();
Record *r = theDataFileMgr.fast_oplog_insert(d, ns, len);
memcpy(getDur().writingPtr(r->data, len), p.objdata(), len);
}
else {
static time_t last;
if( time(0) > last+10 ) {
log() << "profile: warning ns " << ns << " does not exist" << endl;
last = time(0);
}
}
}
示例8: receivedUpdate
void receivedUpdate(Message& m, CurOp& op) {
DbMessage d(m);
const char *ns = d.getns();
op.debug().ns = ns;
int flags = d.pullInt();
BSONObj query = d.nextJsObj();
verify( d.moreJSObjs() );
verify( query.objsize() < m.header()->dataLen() );
BSONObj toupdate = d.nextJsObj();
uassert( 10055 , "update object too large", toupdate.objsize() <= BSONObjMaxUserSize);
verify( toupdate.objsize() < m.header()->dataLen() );
verify( query.objsize() + toupdate.objsize() < m.header()->dataLen() );
bool upsert = flags & UpdateOption_Upsert;
bool multi = flags & UpdateOption_Multi;
bool broadcast = flags & UpdateOption_Broadcast;
Status status = cc().getAuthorizationManager()->checkAuthForUpdate(ns, upsert);
uassert(16538, status.reason(), status.isOK());
op.debug().query = query;
op.setQuery(query);
PageFaultRetryableSection s;
while ( 1 ) {
try {
Lock::DBWrite lk(ns);
// void ReplSetImpl::relinquish() uses big write lock so
// this is thus synchronized given our lock above.
uassert( 10054 , "not master", isMasterNs( ns ) );
// if this ever moves to outside of lock, need to adjust check Client::Context::_finishInit
if ( ! broadcast && handlePossibleShardedMessage( m , 0 ) )
return;
Client::Context ctx( ns );
UpdateResult res = updateObjects(ns, toupdate, query, upsert, multi, true, op.debug() );
lastError.getSafe()->recordUpdate( res.existing , res.num , res.upserted ); // for getlasterror
break;
}
catch ( PageFaultException& e ) {
e.touch();
}
}
}
示例9: inProgCmd
void inProgCmd( Message &m, DbResponse &dbresponse ) {
BSONObjBuilder b;
if (!cc().getAuthorizationManager()->checkAuthorization(
AuthorizationManager::SERVER_RESOURCE_NAME, ActionType::inprog)) {
b.append("err", "unauthorized");
}
else {
DbMessage d(m);
QueryMessage q(d);
bool all = q.query["$all"].trueValue();
bool allMatching = q.query["$allMatching"].trueValue();
vector<BSONObj> vals;
BSONObjBuilder qb;
for (BSONObjIterator it(q.query); it.more(); ) {
BSONElement e = it.next();
StringData fn(e.fieldName());
if (fn != "$all" && fn != "$allMatching") {
qb.append(e);
}
}
{
Client& me = cc();
scoped_lock bl(Client::clientsMutex);
scoped_ptr<Matcher> m(new Matcher(qb.done()));
for( set<Client*>::iterator i = Client::clients.begin(); i != Client::clients.end(); i++ ) {
Client *c = *i;
verify( c );
CurOp* co = c->curop();
if ( c == &me && !co ) {
continue;
}
verify( co );
if( all || allMatching || co->displayInCurop() ) {
BSONObj info = co->info();
if ( all || m->matches( info )) {
vals.push_back( info );
}
}
}
}
b.append("inprog", vals);
}
replyToQuery(0, m, dbresponse, b.obj());
}
示例10: clientLock
bool GlobalEnvironmentMongoD::killOperation(AtomicUInt opId) {
scoped_lock clientLock(Client::clientsMutex);
bool found = false;
// XXX clean up
{
for( set< Client* >::const_iterator j = Client::clients.begin();
!found && j != Client::clients.end();
++j ) {
for( CurOp *k = ( *j )->curop(); !found && k; k = k->parent() ) {
if ( k->opNum() != opId )
continue;
k->kill();
for( CurOp *l = ( *j )->curop(); l; l = l->parent() ) {
l->kill();
}
found = true;
}
}
}
if ( found ) {
interruptJs( &opId );
}
return found;
}
示例11: receivedUpdate
void receivedUpdate(Message& m, CurOp& op) {
DbMessage d(m);
const char *ns = d.getns();
op.debug().ns = ns;
int flags = d.pullInt();
BSONObj query = d.nextJsObj();
verify(d.moreJSObjs());
verify(query.objsize() < m.header()->dataLen());
const BSONObj updateobj = d.nextJsObj();
uassert(10055, "update object too large", updateobj.objsize() <= BSONObjMaxUserSize);
verify(updateobj.objsize() < m.header()->dataLen());
verify(query.objsize() + updateobj.objsize() < m.header()->dataLen());
op.debug().query = query;
op.debug().updateobj = updateobj;
op.setQuery(query);
const bool upsert = flags & UpdateOption_Upsert;
const bool multi = flags & UpdateOption_Multi;
const bool broadcast = flags & UpdateOption_Broadcast;
Status status = cc().getAuthorizationManager()->checkAuthForUpdate(ns, upsert);
uassert(16538, status.reason(), status.isOK());
OpSettings settings;
settings.setQueryCursorMode(WRITE_LOCK_CURSOR);
settings.setJustOne(!multi);
cc().setOpSettings(settings);
Client::ShardedOperationScope sc;
if (!broadcast && sc.handlePossibleShardedMessage(m, 0)) {
return;
}
LOCK_REASON(lockReason, "update");
try {
Lock::DBRead lk(ns, lockReason);
lockedReceivedUpdate(ns, m, op, updateobj, query, upsert, multi);
}
catch (RetryWithWriteLock &e) {
Lock::DBWrite lk(ns, lockReason);
lockedReceivedUpdate(ns, m, op, updateobj, query, upsert, multi);
}
}
示例12: _killImpl_inclientlock
bool KillCurrentOp::_killImpl_inclientlock(AtomicUInt i, bool* pNotifyFlag /* = NULL */) {
bool found = false;
{
for( set< Client* >::const_iterator j = Client::clients.begin();
!found && j != Client::clients.end();
++j ) {
for( CurOp *k = ( *j )->curop(); !found && k; k = k->parent() ) {
if ( k->opNum() != i )
continue;
k->kill(pNotifyFlag);
for( CurOp *l = ( *j )->curop(); l; l = l->parent() ) {
l->kill();
}
found = true;
}
}
}
if ( found ) {
interruptJs( &i );
}
return found;
}
示例13: Status
Status OperationContextImpl::checkForInterruptNoAssert() const {
if (getGlobalServiceContext()->getKillAllOperations()) {
return Status(ErrorCodes::InterruptedAtShutdown, "interrupted at shutdown");
}
CurOp* curOp = CurOp::get(this);
if (curOp->maxTimeHasExpired()) {
curOp->kill();
return Status(ErrorCodes::ExceededTimeLimit, "operation exceeded time limit");
}
MONGO_FAIL_POINT_BLOCK(checkForInterruptFail, scopedFailPoint) {
if (opShouldFail(this, scopedFailPoint.getData())) {
log() << "set pending kill on "
<< (curOp->parent() ? "nested" : "top-level")
<< " op " << curOp->opNum() << ", for checkForInterruptFail";
curOp->kill();
}
}
if (curOp->killPending()) {
return Status(ErrorCodes::Interrupted, "operation was interrupted");
}
return Status::OK();
}
示例14: receivedDelete
void receivedDelete(Message& m, CurOp& op) {
DbMessage d(m);
const char *ns = d.getns();
Status status = cc().getAuthorizationManager()->checkAuthForDelete(ns);
uassert(16542, status.reason(), status.isOK());
op.debug().ns = ns;
int flags = d.pullInt();
verify(d.moreJSObjs());
BSONObj pattern = d.nextJsObj();
op.debug().query = pattern;
op.setQuery(pattern);
const bool justOne = flags & RemoveOption_JustOne;
const bool broadcast = flags & RemoveOption_Broadcast;
OpSettings settings;
settings.setQueryCursorMode(WRITE_LOCK_CURSOR);
settings.setJustOne(justOne);
cc().setOpSettings(settings);
Client::ShardedOperationScope sc;
if (!broadcast && sc.handlePossibleShardedMessage(m, 0)) {
return;
}
LOCK_REASON(lockReason, "delete");
Lock::DBRead lk(ns, lockReason);
// writelock is used to synchronize stepdowns w/ writes
uassert(10056, "not master", isMasterNs(ns));
Client::Context ctx(ns);
long long n;
scoped_ptr<Client::AlternateTransactionStack> altStack(opNeedsAltTxn(ns) ? new Client::AlternateTransactionStack : NULL);
Client::Transaction transaction(DB_SERIALIZABLE);
n = deleteObjects(ns, pattern, justOne, true);
transaction.commit();
lastError.getSafe()->recordDelete( n );
op.debug().ndeleted = n;
}
示例15: LockMongoFilesShared
void ClientCursor::staticYield( int micros , const StringData& ns , Record * rec ) {
bool haveReadLock = Lock::isReadLocked();
killCurrentOp.checkForInterrupt( false );
{
auto_ptr<LockMongoFilesShared> lk;
if ( rec ) {
// need to lock this else rec->touch won't be safe file could disappear
lk.reset( new LockMongoFilesShared() );
}
dbtempreleasecond unlock;
if ( unlock.unlocked() ) {
if ( haveReadLock ) {
// don't sleep with a read lock
}
else {
if ( micros == -1 )
micros = Client::recommendedYieldMicros();
if ( micros > 0 )
sleepmicros( micros );
}
}
else if ( Listener::getTimeTracker() == 0 ) {
// we aren't running a server, so likely a repair, so don't complain
}
else {
CurOp * c = cc().curop();
while ( c->parent() )
c = c->parent();
warning() << "ClientCursor::yield can't unlock b/c of recursive lock"
<< " ns: " << ns
<< " top: " << c->info()
<< endl;
}
if ( rec )
rec->touch();
lk.reset(0); // need to release this before dbtempreleasecond
}
}