Пример #1
0
        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();
        }
Пример #2
0
        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();
        }