コード例 #1
0
ファイル: dpsLogWrapper.cpp プロジェクト: hanjirui/SequoiaDB
   void _dpsLogWrapper::writeData ( dpsMergeInfo & info )
   {
      _buf.writeData( info ) ;

      if ( _vecEventHandler.size() > 0 && info.isNeedNotify() )
      {
         DPS_LSN_OFFSET offset = DPS_INVALID_LSN_OFFSET ;
         pmdEDUCB *cb = info.getEDUCB() ;
         if ( info.hasDummy() )
         {
            offset = info.getDummyBlock().record().head()._lsn ;
            if ( cb )
            {
               cb->insertLsn( offset ) ;
            }

            for( UINT32 i = 0 ; i < _vecEventHandler.size() ; ++i )
            {
               _vecEventHandler[i]->onWriteLog( offset ) ;
            }
         }
         offset = info.getMergeBlock().record().head()._lsn ;
         if ( cb )
         {
            cb->insertLsn( offset ) ;
         }
         for( UINT32 i = 0 ; i < _vecEventHandler.size() ; ++i )
         {
            _vecEventHandler[i]->onWriteLog( offset ) ;
         }
      }
      info.resetInfoEx() ;
   }
コード例 #2
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSRPCMGR_WRITEDATA, "_dpsReplicaLogMgr::writeData" )
   void _dpsReplicaLogMgr::writeData ( dpsMergeInfo & info )
   {
      SDB_ASSERT ( info.getMergeBlock().pageMeta().valid(),
                   "block not prepared" ) ;
      SDB_ASSERT ( _transCB != NULL, "transCB can't be null!" ) ;
      PD_TRACE_ENTRY ( SDB__DPSRPCMGR_WRITEDATA );

      if ( info.hasDummy() )
      {
         _mergeLogs( info.getDummyBlock(), info.getDummyBlock().pageMeta());
         SHARED_UNLOCK_NODES( info.getDummyBlock().pageMeta() );
      }

      _mergeLogs( info.getMergeBlock(), info.getMergeBlock().pageMeta() );
      SHARED_UNLOCK_NODES( info.getMergeBlock().pageMeta() );

      _transCB->saveTransInfoFromLog( info.getMergeBlock().record() ) ;

      PD_TRACE_EXIT ( SDB__DPSRPCMGR_WRITEDATA );
   }
コード例 #3
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSRPCMGR_PREPAGES, "_dpsReplicaLogMgr::preparePages" )
   INT32 _dpsReplicaLogMgr::preparePages ( dpsMergeInfo &info )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSRPCMGR_PREPAGES );
      info.getDummyBlock().clear() ;
      dpsMergeBlock &block = info.getMergeBlock () ;
      block.pageMeta().clear() ;
      dpsLogRecordHeader &head = block.record().head() ;
      UINT32 logFileSz = _logger.getLogFileSz() ;
      BOOLEAN locked = FALSE ;

      if ( _totalSize < head._length )
      {
         PD_LOG ( PDERROR, "dps total memory size[%d] less than block size[%d]",
                  _totalSize, head._length ) ;
         rc = SDB_SYS ;
         SDB_ASSERT ( 0, "system error" ) ;
         goto error ;
      }

      if ( FALSE == _restoreFlag )
      {
         _mtx.get();
         locked = TRUE ;
      }

      if ( block.isRow() && _lsn.offset != head._lsn)
      {
         PD_LOG( PDERROR, "lsn[%lld] of row is not equal to lsn[%lld] of local",
                 head._lsn, _lsn.offset) ;
         rc = SDB_SYS ;
         goto error ;
      }

      if ( DPS_INVALID_LSN_VERSION == _lsn.version )
      {
         ++_lsn.version ;
      }

      if ( !block.isRow() )
      {
      if ( ( _lsn.offset / logFileSz ) !=
            ( _lsn.offset + head._length - 1 ) / logFileSz )
      {
         SDB_ASSERT ( !block.isRow(), "replicated log record should never"
                      " hit this part" ) ;
         UINT32 dummyLogSize = logFileSz - ( _lsn.offset % logFileSz ) ;
         SDB_ASSERT ( dummyLogSize >= sizeof ( dpsLogRecordHeader ),
                      "dummy log size is smaller than log head" ) ;
         SDB_ASSERT ( dummyLogSize % sizeof(SINT32) == 0,
                      "dummy log size is not 4 bytes aligned" ) ;

         dpsLogRecordHeader &dummyhead =
                           info.getDummyBlock().record().head() ;
         dummyhead._length = dummyLogSize ;
         dummyhead._type   = LOG_TYPE_DUMMY ;
         _allocate ( dummyhead._length, info.getDummyBlock().pageMeta() ) ;

         SHARED_LOCK_NODES ( info.getDummyBlock().pageMeta()) ;
         _push2SendQueue ( info.getDummyBlock().pageMeta() ) ;
         dummyhead._lsn = _lsn.offset ;
         dummyhead._version = _lsn.version ;
         dummyhead._preLsn = _currentLsn.offset ;
         _currentLsn = _lsn ;
         _lsn.offset += dummyhead._length ;

         if ( info.isNeedNotify() && _pEventHander )
         {
            _pEventHander->onPrepareLog( info.getCSLID(), info.getCLLID(),
                                         info.getExtentLID(),
                                         dummyhead._lsn ) ;
         }
      }

      if ( ( (_lsn.offset+head._length) / logFileSz ) !=
           ( (_lsn.offset+head._length+
              sizeof(dpsLogRecordHeader)) / logFileSz ) )
      {
         SDB_ASSERT ( !block.isRow(), "replicated log record should never"
                      " hit this part" ) ;
         head._length = logFileSz - _lsn.offset % logFileSz ;
      }
      }
      _allocate( head._length, block.pageMeta() );

      SHARED_LOCK_NODES( block.pageMeta() ) ;
      _push2SendQueue( block.pageMeta() ) ;
      if ( !block.isRow() )
      {
         head._lsn = _lsn.offset;
         head._preLsn = _currentLsn.offset ;
         head._version = _lsn.version ;
      }
      else
      {
         SDB_ASSERT ( _lsn.offset == head._lsn, "row lsn error" ) ;
         _lsn.version = head._version ;
      }
      _currentLsn = _lsn ;
      _lsn.offset += head._length ;

      if ( info.isNeedNotify() && _pEventHander )
      {
         _pEventHander->onPrepareLog( info.getCSLID(), info.getCLLID(),
                                      info.getExtentLID(),
                                      head._lsn ) ;
      }

   done:
      if ( locked )
      {
         _mtx.release();
         locked = FALSE ;
      }
      PD_TRACE_EXITRC ( SDB__DPSRPCMGR_PREPAGES, rc );
      return rc;
   error:
      goto done;
   }
コード例 #4
0
ファイル: dpsLogWrapper.cpp プロジェクト: SequoiaDB/SequoiaDB
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGWRAPP_WRITEDATA, "_dpsLogWrapper::writeData" )
   void _dpsLogWrapper::writeData ( dpsMergeInfo & info )
   {
      PD_TRACE_ENTRY ( SDB__DPSLGWRAPP_WRITEDATA ) ;

      _lastWriteTick = pmdGetDBTick() ;
      ++_writeReordNum ;

      _buf.writeData( info ) ;

      IExecutor *cb = info.getEDUCB() ;

      if ( cb )
      {
         if ( info.hasDummy() )
         {
            cb->insertLsn( info.getDummyBlock().record().head()._lsn ) ;
         }
         cb->insertLsn( info.getMergeBlock().record().head()._lsn ) ;
      }

      if ( _vecEventHandler.size() > 0 && info.isNeedNotify() )
      {
         DPS_LSN_OFFSET offset = DPS_INVALID_LSN_OFFSET ;
         if ( info.hasDummy() )
         {
            offset = info.getDummyBlock().record().head()._lsn ;
            for( UINT32 i = 0 ; i < _vecEventHandler.size() ; ++i )
            {
               _vecEventHandler[i]->onWriteLog( offset ) ;
            }
         }
         offset = info.getMergeBlock().record().head()._lsn ;
         for( UINT32 i = 0 ; i < _vecEventHandler.size() ; ++i )
         {
            _vecEventHandler[i]->onWriteLog( offset ) ;
         }
      }

      if ( info.isTransEnabled() && cb &&
           DPS_INVALID_TRANS_ID != cb->getTransID() )
      {
         UINT64 transID = cb->getTransID() ;
         cb->setCurTransLsn( info.getMergeBlock().record().head()._lsn ) ;

         if ( sdbGetTransCB()->isFirstOp( transID ) )
         {
            sdbGetTransCB()->clearFirstOpTag( transID ) ;
            cb->setTransID( transID ) ;
         }
      }

      info.resetInfoEx() ;

      PD_TRACE_EXIT( SDB__DPSLGWRAPP_WRITEDATA ) ;
   }