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() ; }
// 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 ); }
// 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; }
// 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 ) ; }