Ejemplo n.º 1
0
   // 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 ) ;
   }
Ejemplo n.º 2
0
// 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 ;
}
Ejemplo n.º 3
0
   // 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 ;
   }
Ejemplo n.º 4
0
   // 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 ;
   }