INT32 _mongoSession::_setSeesionAttr() { INT32 rc = SDB_OK ; engine::pmdEDUMgr *pmdEDUMgr = _pEDUCB->getEDUMgr() ; const CHAR *cmd = CMD_ADMIN_PREFIX CMD_NAME_SETSESS_ATTR ; MsgOpQuery *set = NULL ; bson::BSONObj obj ; bson::BSONObj emptyObj ; msgBuffer msgSetAttr ; if ( _masterRead ) { goto done ; } msgSetAttr.reverse( sizeof( MsgOpQuery ) ) ; msgSetAttr.advance( sizeof( MsgOpQuery ) - 4 ) ; obj = BSON( FIELD_NAME_PREFERED_INSTANCE << PREFER_REPL_MASTER ) ; set = (MsgOpQuery *)msgSetAttr.data() ; set->header.opCode = MSG_BS_QUERY_REQ ; set->header.TID = 0 ; set->header.routeID.value = 0 ; set->header.requestID = 0 ; set->version = 0 ; set->w = 0 ; set->padding = 0 ; set->flags = 0 ; set->nameLength = ossStrlen(cmd) ; set->numToSkip = 0 ; set->numToReturn = -1 ; msgSetAttr.write( cmd, set->nameLength + 1, TRUE ) ; msgSetAttr.write( obj, TRUE ) ; msgSetAttr.write( emptyObj, TRUE ) ; msgSetAttr.write( emptyObj, TRUE ) ; msgSetAttr.write( emptyObj, TRUE ) ; msgSetAttr.doneLen() ; if ( SDB_OK != ( rc = pmdEDUMgr->activateEDU( _pEDUCB ) ) ) { PD_LOG( PDERROR, "Session[%s] activate edu failed, rc: %d", sessionName(), rc ) ; goto error ; } rc = _processMsg( msgSetAttr.data() ) ; if ( SDB_OK != rc ) { goto error ; } _masterRead = TRUE ; if ( SDB_OK != ( rc = pmdEDUMgr->waitEDU( _pEDUCB ) ) ) { PD_LOG( PDERROR, "Session[%s] wait edu failed, rc: %d", sessionName(), rc ) ; goto error ; } done: return rc ; error: goto done ; }
INT32 _mongoSession::run() { INT32 rc = SDB_OK ; BOOLEAN bigEndian = FALSE ; UINT32 msgSize = 0 ; UINT32 headerLen = sizeof( mongoMsgHeader ) - sizeof( INT32 ) ; INT32 bodyLen = 0 ; engine::pmdEDUMgr *pmdEDUMgr = NULL ; CHAR *pBuff = NULL ; const CHAR *pBody = NULL ; const CHAR *pInMsg = NULL ; engine::monDBCB *mondbcb = engine::pmdGetKRCB()->getMonDBCB() ; if ( !_pEDUCB ) { rc = SDB_SYS ; goto error ; } pmdEDUMgr = _pEDUCB->getEDUMgr() ; bigEndian = checkBigEndian() ; while ( !_pEDUCB->isDisconnected() && !_socket.isClosed() ) { _pEDUCB->resetInterrupt() ; _pEDUCB->resetInfo( engine::EDU_INFO_ERROR ) ; _pEDUCB->resetLsn() ; rc = recvData( (CHAR*)&msgSize, sizeof(UINT32) ) ; if ( rc ) { if ( SDB_APP_FORCED != rc ) { PD_LOG( PDERROR, "Session[%s] failed to recv msg size, " "rc: %d", sessionName(), rc ) ; } break ; } if ( bigEndian ) { } if ( msgSize < headerLen || msgSize > SDB_MAX_MSG_LENGTH ) { PD_LOG( PDERROR, "Session[%s] recv msg size[%d] is less than " "mongoMsgHeader size[%d] or more than max msg size[%d]", sessionName(), msgSize, sizeof( mongoMsgHeader ), SDB_MAX_MSG_LENGTH ) ; rc = SDB_INVALIDARG ; break ; } else { pBuff = getBuff( msgSize + 1 ) ; if ( !pBuff ) { rc = SDB_OOM ; break ; } *(UINT32*)pBuff = msgSize ; rc = recvData( pBuff + sizeof(UINT32), msgSize - sizeof(UINT32) ) ; if ( rc ) { if ( SDB_APP_FORCED != rc ) { PD_LOG( PDERROR, "Session[%s] failed to recv rest msg, rc: %d", sessionName(), rc ) ; } break ; } pBuff[ msgSize ] = 0 ; { _resetBuffers() ; _converter.loadFrom( pBuff, msgSize ) ; rc = _converter.convert( _inBuffer ) ; if ( SDB_OK != rc && SDB_OPTION_NOT_SUPPORT != rc) { goto error ; } _pEDUCB->incEventCount() ; mondbcb->addReceiveNum() ; if ( SDB_OK != ( rc = pmdEDUMgr->activateEDU( _pEDUCB ) ) ) { PD_LOG( PDERROR, "Session[%s] activate edu failed, rc: %d", sessionName(), rc ) ; goto error ; } if ( _preProcessMsg( _converter.getParser(), _resource, _contextBuff ) ) { goto reply ; } pInMsg = _inBuffer.data() ; while ( NULL != pInMsg ) { rc = _processMsg( pInMsg ) ; if ( SDB_OK == rc ) { _authed = TRUE ; } rc = _converter.reConvert( _inBuffer, &_replyHeader ) ; if ( SDB_OK != rc ) { goto reply ; } else { if ( !_inBuffer.empty() ) { _contextBuff.release() ; pInMsg = _inBuffer.data() ; } else { pInMsg = NULL ; } } } reply: _handleResponse( _converter.getOpType(), _contextBuff ) ; pBody = _contextBuff.data() ; bodyLen = _contextBuff.size() ; INT32 rcTmp = _reply( &_replyHeader, pBody, bodyLen ) ; if ( rcTmp ) { PD_LOG( PDERROR, "Session[%s] failed to send response," "rc: %d", sessionName(), rcTmp ) ; goto error ; } pBody = NULL ; bodyLen = 0 ; _contextBuff.release() ; if ( SDB_OK != ( rc = pmdEDUMgr->waitEDU( _pEDUCB ) ) ) { PD_LOG( PDERROR, "Session[%s] wait edu failed, rc: %d", sessionName(), rc ) ; goto error ; } } } } // end while done: disconnect() ; return rc ; error: goto done ; }
INT32 _mongoSession::run() { INT32 rc = SDB_OK ; BOOLEAN bigEndian = FALSE ; UINT32 msgSize = 0 ; UINT32 headerLen = sizeof( mongoMsgHeader ) - sizeof( INT32 ) ; CHAR *pBuff = NULL ; const CHAR *pBody = NULL ; INT32 bodyLen = 0 ; engine::pmdEDUMgr *pmdEDUMgr = NULL ; std::vector< msgBuffer * >::iterator itr ; if ( !_pEDUCB ) { rc = SDB_SYS ; goto error ; } pmdEDUMgr = _pEDUCB->getEDUMgr() ; bigEndian = checkBigEndian() ; while ( !_pEDUCB->isDisconnected() && !_socket.isClosed() ) { _pEDUCB->resetInterrupt() ; _pEDUCB->resetInfo( engine::EDU_INFO_ERROR ) ; _pEDUCB->resetLsn() ; rc = recvData( (CHAR*)&msgSize, sizeof(UINT32) ) ; if ( rc ) { if ( SDB_APP_FORCED != rc ) { PD_LOG( PDERROR, "Session[%s] failed to recv msg size, " "rc: %d", sessionName(), rc ) ; } break ; } if ( bigEndian ) { } if ( msgSize < headerLen || msgSize > SDB_MAX_MSG_LENGTH ) { PD_LOG( PDERROR, "Session[%s] recv msg size[%d] is less than " "mongoMsgHeader size[%d] or more than max msg size[%d]", sessionName(), msgSize, sizeof( mongoMsgHeader ), SDB_MAX_MSG_LENGTH ) ; rc = SDB_INVALIDARG ; break ; } else { pBuff = getBuff( msgSize + 1 ) ; if ( !pBuff ) { rc = SDB_OOM ; break ; } *(UINT32*)pBuff = msgSize ; rc = recvData( pBuff + sizeof(UINT32), msgSize - sizeof(UINT32) ) ; if ( rc ) { if ( SDB_APP_FORCED != rc ) { PD_LOG( PDERROR, "Session failed to recv rest msg, rc: %d", sessionName(), rc ) ; } break ; } pBuff[ msgSize ] = 0 ; { resetBuffers() ; _converter->loadFrom( pBuff, msgSize ) ; rc = _converter->convert( _inBufferVec ) ; if ( SDB_OK != rc ) { if ( SDB_OPTION_NOT_SUPPORT == rc ) { } else { goto error ; } } if ( _preProcessMsg( _converter->getParser(), _resource, _contextBuff ) ) { goto reply ; } itr = _inBufferVec.begin() ; for ( ; itr != _inBufferVec.end() ; ++itr ) { _pEDUCB->incEventCount() ; _needReply = FALSE ; if ( SDB_OK != ( rc = pmdEDUMgr->activateEDU( _pEDUCB ) ) ) { PD_LOG( PDERROR, "Session[%s] activate edu failed, rc: %d", sessionName(), rc ) ; goto error ; } rc = _processMsg( (*itr)->data() ) ; if ( rc ) { if ( SDB_DMS_CS_EXIST == rc && OP_CMD_CREATE == _converter->getOpType()) { _contextBuff.release() ; } else { goto reply ; } } if ( SDB_OK != ( rc = pmdEDUMgr->waitEDU( _pEDUCB ) ) ) { PD_LOG( PDERROR, "Session[%s] wait edu failed, rc: %d", sessionName(), rc ) ; goto error ; } } reply: pBody = _contextBuff.data() ; bodyLen = _contextBuff.size() ; INT32 rcTmp = _reply( &_replyHeader, pBody, bodyLen ) ; if ( rcTmp ) { PD_LOG( PDERROR, "Session[%s] failed to send response, rc: %d", sessionName(), rcTmp ) ; goto error ; } pBody = NULL ; bodyLen = 0 ; } } } // end while done: disconnect() ; return rc ; error: goto done ; }