virtual void process( Message& m , AbstractMessagingPort* p , LastError * le) { verify( p ); Request r( m , p ); verify( le ); lastError.startRequest( m , le ); try { r.init(); r.process(); // Release connections after non-write op if ( r.expectResponse() ) { LOG(2) << "release thread local connections back to pool" << endl; ShardConnection::releaseMyConnections(); } } catch ( const AssertionException& ex ) { LOG( ex.isUserAssertion() ? 1 : 0 ) << "Assertion failed" << " while processing " << opToString( m.operation() ) << " op" << " for " << r.getns() << causedBy( ex ) << endl; if ( r.expectResponse() ) { m.header()->id = r.id(); replyToQuery( ResultFlag_ErrSet, p , m , buildErrReply( ex ) ); } else { le->raiseError( ex.getCode() , ex.what() ); } } catch ( const DBException& ex ) { log() << "Exception thrown" << " while processing " << opToString( m.operation() ) << " op" << " for " << r.getns() << causedBy( ex ) << endl; if ( r.expectResponse() ) { m.header()->id = r.id(); replyToQuery( ResultFlag_ErrSet, p , m , buildErrReply( ex ) ); } else { le->raiseError( ex.getCode() , ex.what() ); } } // Clear out the last error for GLE unless it's been explicitly disabled if ( r.expectResponse() && !le->disabled ) le->reset(); }
virtual void process( Message& m , AbstractMessagingPort* p , LastError * le) { verify( p ); Request r( m , p ); verify( le ); lastError.startRequest( m , le ); try { r.init(); r.process(); } catch ( const AssertionException& ex ) { LOG( ex.isUserAssertion() ? 1 : 0 ) << "Assertion failed" << " while processing " << opToString( m.operation() ) << " op" << " for " << r.getns() << causedBy( ex ) << endl; if ( r.expectResponse() ) { m.header()->id = r.id(); replyToQuery( ResultFlag_ErrSet, p , m , buildErrReply( ex ) ); } // We *always* populate the last error for now le->raiseError( ex.getCode() , ex.what() ); } catch ( const DBException& ex ) { log() << "Exception thrown" << " while processing " << opToString( m.operation() ) << " op" << " for " << r.getns() << causedBy( ex ) << endl; if ( r.expectResponse() ) { m.header()->id = r.id(); replyToQuery( ResultFlag_ErrSet, p , m , buildErrReply( ex ) ); } // We *always* populate the last error for now le->raiseError( ex.getCode() , ex.what() ); } // Release connections back to pool, if any still cached ShardConnection::releaseMyConnections(); }