// PD_TRACE_DECLARE_FUNCTION ( SDB__CLSSYNCMAG__WAKE, "_clsSyncManager::_wake" ) void _clsSyncManager::_wake( CLS_WAKE_PLAN &plan ) { PD_TRACE_ENTRY ( SDB__CLSSYNCMAG__WAKE ) ; SDB_ASSERT( plan.size() <= CLS_REPLSET_MAX_NODE_SIZE - 1, "plan size should <= CLS_REPLSET_MAX_NODE_SIZE - 1" ) ; _clsSyncSession session ; UINT32 sub = 0 ; CLS_WAKE_PLAN::reverse_iterator ritr = plan.rbegin(); while ( ritr != plan.rend() ) { DPS_LSN lsn ; lsn.offset = *ritr ; _mtxs[sub].get() ; _checkList[sub] = lsn.offset ; while ( SDB_OK == _syncList[sub].root( session ) ) { if ( 0 < lsn.compareOffset( session.endLsn ) ) { session.eduCB->getEvent().signal ( SDB_OK ) ; _syncList[sub].pop( session ) ; } else { break ; } } _mtxs[sub].release() ; ++ritr ; ++sub ; } PD_TRACE_EXIT ( SDB__CLSSYNCMAG__WAKE ) ; }
// PD_TRACE_DECLARE_FUNCTION ( SDB__CLSSYNCMAG_ATLEASTONE, "_clsSyncManager::atLeastOne" ) BOOLEAN _clsSyncManager::atLeastOne( const DPS_LSN_OFFSET &offset ) { BOOLEAN res = FALSE ; PD_TRACE_ENTRY( SDB__CLSSYNCMAG_ATLEASTONE ) ; DPS_LSN lsn ; lsn.offset = offset ; ossScopedRWLock lock( &_info->mtx, SHARED ) ; for ( UINT32 i = 0; i < _validSync ; i++ ) { if ( 0 > lsn.compareOffset( _notifyList[i].offset ) ) { res = TRUE ; break ; } } PD_TRACE_EXIT( SDB__CLSSYNCMAG_ATLEASTONE ) ; return res ; }
// PD_TRACE_DECLARE_FUNCTION ( SDB__CLSSYNCMAG__COMPLETE, "_clsSyncManager::_complete" ) void _clsSyncManager::_complete( const MsgRouteID &id, const DPS_LSN_OFFSET &offset ) { PD_TRACE_ENTRY ( SDB__CLSSYNCMAG__COMPLETE ) ; DPS_LSN lsn ; lsn.offset = offset ; ossScopedRWLock lock( &_info->mtx, SHARED ) ; for ( UINT32 i = 0; i < _validSync ; i++ ) { if ( _notifyList[i].id.value == id.value ) { INT32 result = lsn.compareOffset( _notifyList[i].offset ) ; if ( 0 == result ) { ++_notifyList[i].sameReqTimes ; } else { _notifyList[i].sameReqTimes = 0 ; } if ( result > 0 ) { _notifyList[i].offset = offset ; } break ; } } { CLS_WAKE_PLAN plan ; _createWakePlan( lsn.offset, plan ) ; _wake( plan ) ; } PD_TRACE_EXIT ( SDB__CLSSYNCMAG__COMPLETE ) ; return ; }
// PD_TRACE_DECLARE_FUNCTION ( SDB__DPSRPCMGR__SEARCH, "_dpsReplicaLogMgr::_search" ) INT32 _dpsReplicaLogMgr::_search ( const DPS_LSN &lsn, _dpsMessageBlock *mb, BOOLEAN onlyHeader ) { INT32 rc = SDB_OK ; PD_TRACE_ENTRY ( SDB__DPSRPCMGR__SEARCH ); dpsLogRecordHeader head ; UINT32 offset = 0 ; UINT32 len = 0 ; UINT32 pageSub = 0 ; DPS_LSN beginLSN ; DPS_LSN lastLSN ; BOOLEAN mtxLocked = FALSE ; BOOLEAN pageLocked = FALSE ; pageSub = ( lsn.offset / DPS_DEFAULT_PAGE_SIZE ) % _pageNum ; offset = lsn.offset % DPS_DEFAULT_PAGE_SIZE ; _mtx.get () ; mtxLocked = TRUE ; beginLSN = _getStartLsn() ; if ( beginLSN.invalid() ) { PD_LOG( PDERROR, "begin lsn invalid [offset:%lld] [version:%d]", beginLSN.offset, beginLSN.version ) ; rc = SDB_DPS_LOG_NOT_IN_BUF ; goto error ; } lastLSN = _lsn ; if ( 0 > lsn.compareOffset(beginLSN.offset) ) { PD_LOG( PDDEBUG, "lsn %lld is smaller than membegin %lld", lsn.offset, beginLSN.offset ) ; rc = SDB_DPS_LOG_NOT_IN_BUF ; goto error ; } else if ( 0 <= lsn.compareOffset(lastLSN.offset) ) { rc = SDB_DPS_LSN_OUTOFRANGE ; goto error ; } (&_pages[pageSub])->lock() ; pageLocked = TRUE ; _mtx.release() ; mtxLocked = FALSE ; rc = _parse ( pageSub, offset, sizeof(dpsLogRecordHeader), (CHAR*)&head ) ; if ( rc ) { PD_LOG ( PDERROR, "Failed to parse log record, rc = %d", rc ) ; goto error ; } if ( head._lsn != lsn.offset || head._length < sizeof(dpsLogRecordHeader) ) { PD_LOG ( PDERROR, "Unexpected LSN is read, expects %lld, %d," "actually read %lld, %d", lsn.offset, lsn.version, head._lsn, head._version ) ; rc = SDB_DPS_CORRUPTED_LOG ; goto error ; } if ( onlyHeader ) { len = sizeof( dpsLogRecordHeader ) ; } else { len = head._length ; } if ( mb->idleSize() < len ) { rc = mb->extend ( len - mb->idleSize () ) ; if ( rc ) { PD_LOG ( PDERROR, "Failed to extend mb, rc = %d", rc ) ; goto error ; } } if ( onlyHeader ) { ossMemcpy( mb->writePtr(), (CHAR*)&head, len ) ; } else { rc = _parse ( pageSub, offset, len, mb->writePtr() ) ; } (&_pages[pageSub])->unlock() ; pageLocked = FALSE ; if ( rc ) { PD_LOG ( PDERROR, "Failed to parse entire log, rc = %d", rc ) ; goto error ; } mb->writePtr ( len + mb->length () ) ; done : if ( mtxLocked ) { _mtx.release () ; } if ( pageLocked ) { (&_pages[pageSub])->unlock() ; } PD_TRACE_EXITRC ( SDB__DPSRPCMGR__SEARCH, rc ); return rc ; error : goto done ; }