// PD_TRACE_DECLARE_FUNCTION ( SDB__DMSSU_GETINDEX, "_dmsStorageUnit::getIndex" ) INT32 _dmsStorageUnit::getIndex( const CHAR *pName, const CHAR *pIndexName, _monIndex &resultIndex, dmsMBContext *context ) { INT32 rc = SDB_IXM_NOTEXIST ; BOOLEAN getContext = FALSE ; UINT32 indexID = 0 ; PD_TRACE_ENTRY ( SDB__DMSSU_GETINDEX ) ; SDB_ASSERT( pIndexName, "Index name can't be NULL" ) ; if ( NULL == context ) { SDB_ASSERT( pName, "Collection name can't be NULL" ) ; rc = _pDataSu->getMBContext( &context, pName, SHARED ) ; PD_RC_CHECK( rc, PDERROR, "Get collection[%s] mb context failed, " "rc: %d", pName, rc ) ; getContext = TRUE ; } else { rc = context->mbLock( SHARED ) ; PD_RC_CHECK( rc, PDERROR, "dms mb context lock failed, rc: %d", rc ) ; } for ( indexID = 0 ; indexID < DMS_COLLECTION_MAX_INDEX ; ++indexID ) { if ( DMS_INVALID_EXTENT == context->mb()->_indexExtent[indexID] ) { break ; } ixmIndexCB indexCB ( context->mb()->_indexExtent[indexID], _pIndexSu, NULL ) ; if ( 0 == ossStrcmp( indexCB.getName(), pIndexName ) ) { resultIndex._indexFlag = indexCB.getFlag () ; resultIndex._scanExtLID = indexCB.scanExtLID () ; resultIndex._version = indexCB.version () ; resultIndex._indexDef = indexCB.getDef().copy () ; rc = SDB_OK ; break ; } } done : if ( context && getContext ) { _pDataSu->releaseMBContext( context ) ; } PD_TRACE_EXITRC ( SDB__DMSSU_GETINDEX, rc ) ; return rc ; error : goto done ; }
// PD_TRACE_DECLARE_FUNCTION ( SDB_RTNTRAVERSALQUERY, "rtnTraversalQuery" ) INT32 rtnTraversalQuery ( const CHAR *pCollectionName, const BSONObj &key, const CHAR *pIndexName, INT32 dir, pmdEDUCB *cb, SDB_DMSCB *dmsCB, SDB_RTNCB *rtnCB, SINT64 &contextID, rtnContextData **ppContext, BOOLEAN enablePrefetch ) { INT32 rc = SDB_OK ; PD_TRACE_ENTRY ( SDB_RTNTRAVERSALQUERY ) ; SDB_ASSERT ( pCollectionName, "collection name can't be NULL" ) ; SDB_ASSERT ( pIndexName, "index name can't be NULL" ) ; SDB_ASSERT ( cb, "cb can't be NULL" ) ; SDB_ASSERT ( dmsCB, "dmsCB can't be NULL" ) ; SDB_ASSERT ( rtnCB, "rtnCB can't be NULL" ) ; SDB_ASSERT ( dir == 1 || dir == -1, "dir must be 1 or -1" ) ; dmsStorageUnitID suID = DMS_INVALID_CS ; dmsStorageUnit *su = NULL ; rtnContextData *context = NULL ; const CHAR *pCollectionShortName = NULL ; optAccessPlan *plan = NULL ; dmsMBContext *mbContext = NULL ; rtnPredicateList *predList = NULL ; rtnIXScanner *scanner = NULL ; BSONObj hint ; BSONObj dummy ; rc = rtnResolveCollectionNameAndLock ( pCollectionName, dmsCB, &su, &pCollectionShortName, suID ) ; PD_RC_CHECK ( rc, PDERROR, "Failed to resolve collection name %s", pCollectionName ) ; rc = su->data()->getMBContext( &mbContext, pCollectionShortName, -1 ) ; PD_RC_CHECK( rc, PDERROR, "Failed to get dms mb context, rc: %d", rc ) ; rc = rtnCB->contextNew ( RTN_CONTEXT_DATA, (rtnContext**)&context, contextID, cb ) ; PD_RC_CHECK ( rc, PDERROR, "Failed to create new context, %d", rc ) ; SDB_ASSERT ( context, "context can't be NULL" ) ; try { hint = BSON( "" << pIndexName ) ; } catch ( std::exception &e ) { PD_RC_CHECK ( SDB_SYS, PDERROR, "Failed to construct hint object: %s", e.what() ) ; } plan = SDB_OSS_NEW optAccessPlan( su, pCollectionShortName, dummy, dummy, hint ) ; if ( !plan ) { rc = SDB_OOM ; goto error ; } rc = plan->optimize() ; PD_RC_CHECK( rc, PDERROR, "Plan optimize failed, rc: %d", rc ) ; PD_CHECK ( plan->getScanType() == IXSCAN && !plan->isAutoGen(), SDB_INVALIDARG, error, PDERROR, "Unable to generate access plan by index %s", pIndexName ) ; rc = mbContext->mbLock( SHARED ) ; PD_RC_CHECK( rc, PDERROR, "dms mb context lock failed, rc: %d", rc ) ; { dmsRecordID rid ; if ( -1 == dir ) { rid.resetMax() ; } else { rid.resetMin () ; } ixmIndexCB indexCB ( plan->getIndexCBExtent(), su->index(), NULL ) ; PD_CHECK ( indexCB.isInitialized(), SDB_SYS, error, PDERROR, "unable to get proper index control block" ) ; if ( indexCB.getLogicalID() != plan->getIndexLID() ) { PD_LOG( PDERROR, "Index[extent id: %d] logical id[%d] is not " "expected[%d]", plan->getIndexCBExtent(), indexCB.getLogicalID(), plan->getIndexLID() ) ; rc = SDB_IXM_NOTEXIST ; goto error ; } predList = plan->getPredList() ; SDB_ASSERT ( predList, "predList can't be NULL" ) ; predList->setDirection ( dir ) ; scanner = SDB_OSS_NEW rtnIXScanner ( &indexCB, predList, su, cb ) ; PD_CHECK ( scanner, SDB_OOM, error, PDERROR, "Unable to allocate memory for scanner" ) ; rc = scanner->relocateRID ( key, rid ) ; PD_CHECK ( SDB_OK == rc, rc, error, PDERROR, "Failed to relocate key to the specified location: %s, " "rc = %d", key.toString().c_str(), rc ) ; } mbContext->mbUnlock() ; rc = context->openTraversal( su, mbContext, plan, scanner, cb, dummy, -1, 0 ) ; PD_RC_CHECK( rc, PDERROR, "Open context traversal faield, rc: %d", rc ) ; mbContext = NULL ; plan = NULL ; suID = DMS_INVALID_CS ; scanner = NULL ; su = NULL ; if ( cb->getMonConfigCB()->timestampON ) { context->getMonCB()->recordStartTimestamp() ; } if ( ppContext ) { *ppContext = context ; } if ( enablePrefetch ) { context->enablePrefetch ( cb ) ; } done : PD_TRACE_EXITRC ( SDB_RTNTRAVERSALQUERY, rc ) ; return rc ; error : if ( su && mbContext ) { su->data()->releaseMBContext( mbContext ) ; } if ( plan ) { plan->release() ; } if ( scanner ) { SDB_OSS_DEL scanner ; } if ( DMS_INVALID_CS != suID ) { dmsCB->suUnlock( suID ) ; } if ( -1 != contextID ) { rtnCB->contextDelete ( contextID, cb ) ; contextID = -1 ; } goto done ; }