// PD_TRACE_DECLARE_FUNCTION ( SDB_NETMLTRTAGT_HNDMSG, "netMultiRouteAgent::handleMsg" )
   INT32 netMultiRouteAgent::handleMsg( const NET_HANDLE &handle,
                                        const _MsgHeader *header,
                                        const CHAR *msg )
   {
      INT32 rc = SDB_OK;
      PD_TRACE_ENTRY ( SDB_NETMLTRTAGT_HNDMSG );

      CHAR *pMsgRsp = (CHAR *)SDB_OSS_MALLOC( header->messageLength );
      PD_CHECK( pMsgRsp, SDB_OOM, error, PDERROR,
                "Memory malloc failed(size = %d)", header->messageLength ) ;

      ossMemcpy( pMsgRsp, msg, header->messageLength );

      {
         ossScopedLock _lock( &_mutex, SHARED ) ;
         COORD_SESSION_MAP::iterator it = _sessionMap.find( header->TID );
         if ( _sessionMap.end() != it )
         {
            it->second->postEvent( pmdEDUEvent( PMD_EDU_EVENT_MSG,
                                                PMD_EDU_MEM_ALLOC,
                                                pMsgRsp ) ) ;
         }
         else
         {
            PD_LOG( PDWARNING, "Recieve expired msg[opCode:[%d]%d, TID:%d,"
                    "ReqID:%lld] from node[%d:%d:%d]",
                    IS_REPLY_TYPE( header->opCode ),
                    GET_REQUEST_TYPE( header->opCode ), header->TID,
                    header->requestID, header->routeID.columns.groupID,
                    header->routeID.columns.nodeID,
                    header->routeID.columns.serviceID ) ;
            rc = SDB_SYS ;
            goto error ;
         }
      }

   done:
      PD_TRACE_EXITRC ( SDB_NETMLTRTAGT_HNDMSG, rc );
      return rc ;
   error:
      if ( pMsgRsp )
      {
         SDB_OSS_FREE( pMsgRsp ) ;
      }
      goto done ;
   }
   INT32 _sptClassMetaInfo::_getContents( const CHAR *pFileBuff,
                                          const CHAR *pMark1,
                                          const CHAR*pMark2,
                                          CHAR **ppBuff,
                                          INT32 *pBuffSize )
   {
      INT32 rc = SDB_OK ;
      stringstream ss ;
      INT32 buffSize = 0 ;
      CHAR *pBuff = NULL ;
      CHAR *begin = NULL ;
      CHAR *end = NULL ;

      begin = ossStrstr( (CHAR *)pFileBuff, (CHAR *)pMark1 ) ;
      end = ossStrstr( (CHAR *)pFileBuff, (CHAR *)pMark2 ) ;
      if ( NULL == begin || NULL == end )
      {
         rc = SDB_INVALIDARG ;
         ss << "Failed to get [" << pMark1 << "], or [" 
            << pMark2 << "], rc = " << rc << ERROR_END ;
         goto error ;
      }
      buffSize = end - begin ;
      pBuff = (CHAR *)SDB_OSS_MALLOC( buffSize + 1 ) ;
      if ( NULL == pBuff )
      {
         rc = SDB_OOM ;
         ss << "Failed to alloc [" << buffSize << "] bytes, rc = " 
            << rc << ERROR_END ;
         goto error ;
      }
      ossMemset( pBuff, 0, buffSize ) ;
      ossMemcpy( pBuff, begin, buffSize ) ;
      pBuff[buffSize] = '\0' ;
      *ppBuff = pBuff ;
      *pBuffSize = buffSize + 1 ;
      
   done:
      return rc ;
   error:
      PRINT_ERROR ;
      goto done ;
   }
Beispiel #3
0
   void _rtnLobWindow::cacheLastDataOrClearCache()
   {
      if ( _pageSize == _cachedSz )
      {
         _cachedSz = 0 ;
      }

      if ( !_writeData.empty() )
      {
         SDB_ASSERT( _writeData.tuple.columns.len < ( UINT32 )_pageSize, "impossible" ) ;
         SDB_ASSERT( 0 == _cachedSz || _cachedSz == _pageSize, "impossible" ) ;
         ossMemcpy( _pool, _writeData.data, _writeData.tuple.columns.len ) ;
         _cachedSz += _writeData.tuple.columns.len ;
         _writeData.clear() ;
      }

      _analysisCache = FALSE ;
      return ;
   }
Beispiel #4
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSRPCMGR__PARSE, "_dpsReplicaLogMgr::_parse" )
   INT32 _dpsReplicaLogMgr::_parse( UINT32 sub, UINT32 offset,
                                    UINT32 len, CHAR *out )
   {
      INT32 rc            = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSRPCMGR__PARSE );
      UINT32 localSub     = sub;
      UINT32 localOffset  = offset;
      UINT32 needParseLen = len;
      UINT32 outOffset    = 0;
      SDB_ASSERT ( out, "out can't be NULL" ) ;
      if ( offset + len >= _pageNum*DPS_DEFAULT_PAGE_SIZE )
      {
         PD_LOG ( PDERROR, "offset + len is greater than buffer size, "
                  "offset = %d, len = %d", offset, len ) ;
         rc = SDB_DPS_CORRUPTED_LOG ;
         goto error ;
      }
      while ( needParseLen > 0 )
      {
         UINT32 parseLen = ( DPS_DEFAULT_PAGE_SIZE - localOffset ) <
                                 needParseLen ?
                           ( DPS_DEFAULT_PAGE_SIZE - localOffset ) :
                                 needParseLen;
         ossMemcpy( out + outOffset,
                    (PAGE( localSub )->mb())->offset( localOffset ), parseLen );

         localOffset += parseLen;
         outOffset += parseLen;
         needParseLen -= parseLen;

         if ( 0 == ( DPS_DEFAULT_PAGE_SIZE - localOffset ) )
         {
            localSub = _incPageID( localSub ) ;
            localOffset = 0 ;
         }
      }
   done :
      PD_TRACE_EXITRC ( SDB__DPSRPCMGR__PARSE, rc );
      return rc ;
   error :
      goto done ;
   }
Beispiel #5
0
 INT32 utilStrJoin( const CHAR **src,
                    UINT32 cnt,
                    CHAR *join,
                    UINT32 &joinSize )
 {
    SDB_ASSERT( NULL != join, "impossible" ) ;
    INT32 rc = SDB_OK ;
    UINT32 len = 0 ;
    for ( UINT32 i = 0; i < cnt; i++ )
    {
       if ( NULL != src[i] )
       {
          UINT32 sLen = ossStrlen(src[i]) ;
          ossMemcpy( join + len, src[i], sLen ) ;
          len += sLen ;
       }
    }
    joinSize = len ;
    return rc ;
 }
Beispiel #6
0
   INT32 _rtnObjBuff::getOwned()
   {
      INT32 rc = SDB_OK ;

      if ( !_owned && _pBuff )
      {
         CHAR *pBuff = ( CHAR* )SDB_OSS_MALLOC( _buffSize ) ;
         if ( pBuff )
         {
            ossMemcpy( pBuff, _pBuff, _buffSize ) ;
            _pBuff = pBuff ;
            _owned = TRUE ;
         }
         else
         {
            rc = SDB_OOM ;
         }
      }
      return rc ;
   }
Beispiel #7
0
      INT32 resize( UINT32 size )
      {
         INT32 rc = SDB_OK ;
         if ( size <= _bufSize ||
              size <= _eleSize )
         {
            goto done ;
         }

         else if ( UTIL_ARRAY_DEFAULT_SIZE == _bufSize )
         {
            _dynamicBuf = ( T * )SDB_OSS_MALLOC( sizeof( T ) * size ) ;
            if ( NULL == _dynamicBuf )
            {
               rc = SDB_OOM ;
               goto error ;
            }
            _bufSize = size ;
            ossMemcpy( _dynamicBuf, _staticBuf, sizeof( T ) * UTIL_ARRAY_DEFAULT_SIZE ) ;
            _eles = _dynamicBuf ;
         }
         else
         {
            T *tmp = _dynamicBuf ;
            _dynamicBuf = ( T * )SDB_OSS_REALLOC( _dynamicBuf,
                                                  sizeof( T ) * size ) ;
            if ( NULL == _dynamicBuf )
            {
               _dynamicBuf = tmp ;
               rc = SDB_OOM ;
               goto error ;
            }
            _bufSize = size ;
            _eles = _dynamicBuf ;
         } 
      done:
         return rc ;
      error:
         goto done ;
      }
Beispiel #8
0
 OSS_INLINE INT32 append( const T &t )
 {
    INT32 rc = SDB_OK ;
    if ( _eleSize < _bufSize )
    {
       _eles[_eleSize++] = t ;
    }
    else if ( UTIL_ARRAY_DEFAULT_SIZE == _bufSize )
    {
       _dynamicBuf = ( T * )SDB_OSS_MALLOC( sizeof( T ) * ( _bufSize * 2 ) ) ;
       if ( NULL == _dynamicBuf )
       {
          rc = SDB_OOM ;
          goto error ;
       }
       _bufSize *= 2 ;
       ossMemcpy( _dynamicBuf, _staticBuf, sizeof( T ) * UTIL_ARRAY_DEFAULT_SIZE ) ;
       _eles = _dynamicBuf ;
       _eles[_eleSize++] = t ;
    }
    else
    {
       T *tmp = _dynamicBuf ;
       _dynamicBuf = ( T * )SDB_OSS_REALLOC( _dynamicBuf,
                                             sizeof( T ) * _bufSize * 2 ) ;
       if ( NULL == _dynamicBuf )
       {
          _dynamicBuf = tmp ;
          rc = SDB_OOM ;
          goto error ;
       }
       _bufSize *= 2 ;
       _eles = _dynamicBuf ;
       _eles[_eleSize++] = t ;
    }
 done:
    return rc ;
 error:
    goto done ;
 }
Beispiel #9
0
INT32 _dpsLogPage::fill( UINT32 offset, const CHAR *src, UINT32 len )
{
    INT32 rc = SDB_OK ;
    PD_TRACE_ENTRY ( SDB__DPSLGPAGE );
    if ( !_mb )
    {
        _mb = SDB_OSS_NEW _dpsMessageBlock( DPS_DEFAULT_PAGE_SIZE );
        if ( NULL == _mb )
        {
            pdLog(PDERROR, __FUNC__, __FILE__, __LINE__,
                  "new _dpsMessageBlock failed!");
            rc = SDB_OOM ;
            goto error ;
        }
    }
    ossMemcpy ( _mb->offset( offset ), src, len ) ;
done :
    PD_TRACE_EXITRC ( SDB__DPSLGPAGE, rc );
    return rc ;
error :
    goto done ;
}
Beispiel #10
0
INT32 getProgramPath( CHAR *pOutputPath )
{
   INT32 rc = SDB_OK ;
   CHAR *t = OSS_FILE_SEP ;
   const CHAR *p = NULL ;
   if ( !pOutputPath )
   {
      rc = SDB_INVALIDARG ;
      goto error ;
   }
   if ( progName[0] == '\0' )
   {
      pOutputPath[0] = '\0' ;
      goto done ;
   }
   p = ossStrrchr ( progName, t[0] ) ;
   if ( p )
   {
      INT32 pathLen = p - progName + 1 ;
      if ( pathLen > OSS_MAX_PATHSIZE + 1 )
      {
         pOutputPath[0] = '\0' ;
         rc = SDB_INVALIDARG ;
         goto error ;
      }
      ossMemcpy ( pOutputPath, progName, pathLen ) ;
      pOutputPath[pathLen] = '\0' ;
   }
   else
   {
       pOutputPath[0] = '\0' ;
   }
done :
   return rc ;
error :
   goto done ;

}
Beispiel #11
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGWRAPP_RECDROW, "_dpsLogWrapper::recordRow" )
   INT32 _dpsLogWrapper::recordRow( const CHAR *row, UINT32 len )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSLGWRAPP_RECDROW );
      if ( !_initialized )
      {
         goto done;
      }
      {
         SDB_ASSERT( NULL != row, "row should not be NULL!") ;
         _dpsMergeBlock block ;
         dpsLogRecord &record = block.record();
         dpsLogRecordHeader &header = record.head() ;
         ossMemcpy( &header, row, sizeof(dpsLogRecordHeader) );
         block.setRow( TRUE ) ;
         rc = record.push( DPS_LOG_ROW_ROWDATA,
                           header._length -  sizeof(dpsLogRecordHeader),
                           row + sizeof(dpsLogRecordHeader)) ;
         if ( SDB_OK != rc )
         {
            PD_LOG( PDERROR, "Failed to push row to record:%d", rc ) ;
            goto error;
         }

         _lastWriteTick = pmdGetDBTick() ;
         ++_writeReordNum ;

         rc = _buf.merge( block );
      }

   done :
      PD_TRACE_EXITRC ( SDB__DPSLGWRAPP_RECDROW, rc );
      return rc ;
   error:
      goto done ;
   }
Beispiel #12
0
   INT32 restAdaptor::recvRequestBody( pmdRestSession *pSession,
                                       HTTP_PARSE_COMMON &common,
                                       CHAR **ppPath,
                                       INT32 &pathSize )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY( SDB__RESTADP_RECVREQBO ) ;
      SDB_ASSERT ( pSession, "pSession is NULL" ) ;
      SDB_ASSERT ( ppPath, "ppPath is NULL" ) ;
      httpConnection *pHttpCon = pSession->getRestConn() ;
      CHAR *pBuffer = NULL ;
      const CHAR *pContentLength = NULL ;
      CHAR *pUrl = NULL ;
      INT32 bodySize = 0 ;
      INT32 sumBodySize = 0 ;
      INT32 curRecvSize  = 0 ;
      INT32 receivedSize = 0 ;
      INT32 tempSize = 0 ;
      INT32 urlSize = 0 ;

      rc = getHttpHeader( pSession, REST_STRING_CONLEN, &pContentLength ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Failed to get http header, rc=%d", rc ) ;
         goto error ;
      }

      if ( pContentLength )
      {
         bodySize = ossAtoi( pContentLength ) ;
         if ( bodySize > 0 )
         {
            if ( bodySize > _maxHttpBodySize )
            {
               rc = SDB_REST_RECV_SIZE ;
               PD_LOG ( PDERROR, "http body size %d greater than %d",
                        bodySize,
                        _maxHttpBodySize ) ;
               goto error ;
            }

            rc = pSession->allocBuff( bodySize + 1,
                                      &(pHttpCon->_pBodyBuf),
                                      sumBodySize ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Unable to allocate %d bytes memory, rc=%d",
                        bodySize, rc ) ;
               goto error ;
            }
            pBuffer = pHttpCon->_pBodyBuf ;
            pBuffer[bodySize] = 0 ;

            if ( pHttpCon->_pPartBody )
            {
               ossMemcpy( pHttpCon->_pBodyBuf,
                          pHttpCon->_pPartBody,
                          pHttpCon->_partSize ) ;
               receivedSize = pHttpCon->_partSize ;
            }

            rc = pSession->recvData( pBuffer + receivedSize,
                                     bodySize - receivedSize,
                                     _timeout,
                                     TRUE,
                                     &curRecvSize,
                                     0 ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Failed to recv, rc=%d", rc ) ;
               goto error ;
            }
            receivedSize += curRecvSize ;

            urlSize = urlDecodeSize( pBuffer, receivedSize ) ;
            rc = pSession->allocBuff( urlSize + 1, &pUrl, tempSize ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Unable to allocate %d bytes memory, rc=%d",
                        urlSize + 1, rc ) ;
               goto error ;
            }
            urlDecode( pBuffer, receivedSize,
                       &pUrl, urlSize ) ;
            pUrl[ urlSize ] = 0 ;
            _parse_http_query( pHttpCon, pUrl, urlSize ) ;
         }
      }

      rc = _convertMsg( pSession, common, ppPath, pathSize ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Failed to build msg, rc=%d", rc ) ;
         goto error ;
      }
      pHttpCon->_common = common ;
   done:
      PD_TRACE_EXITRC( SDB__RESTADP_RECVREQBO, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #13
0
   INT32 restAdaptor::_convertMsg( pmdRestSession *pSession,
                                   HTTP_PARSE_COMMON &common,
                                   CHAR **ppMsg,
                                   INT32 &msgSize )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY( SDB__RESTADP_CONVERTMSG );
      SDB_ASSERT ( pSession, "pSession is NULL" ) ;
      SDB_ASSERT ( ppMsg, "pMsg is NULL" ) ;
      INT32 pathSize = 0 ;
      INT32 tempSize = 0 ;
      INT32 extenSize = 0 ;
      const CHAR *pFileName = NULL ;
      const CHAR *pExtension = NULL ;
      CHAR *pMsg = NULL ;
      httpConnection *pHttpCon = pSession->getRestConn() ;

      pFileName = _getResourceFileName( pHttpCon->_pPath ) ;
      if ( pFileName )
      {
         common = COM_GETFILE ;
         pHttpCon->_fileType = HTTP_FILE_UNKNOW ;
         pExtension = _getFileExtension( pFileName ) ;
         if ( pExtension )
         {
            extenSize = ossStrlen( pExtension ) ;
            for( UINT32 i = 0; i < REST_STRING_FILE_EX_SIZE; ++i )
            {
               if ( 0 == ossStrncasecmp( pExtension,
                                         fileExtension[i], extenSize ) )
               {
                  pHttpCon->_fileType = (HTTP_FILE_TYPE)i ;
                  break ;
               }
            }
         }
      }
      else
      {
         if ( pHttpCon->_requestQuery.size() > 0 )
         {
            common = COM_CMD ;
            pHttpCon->_fileType = HTTP_FILE_HTML ;
         }
         else
         {
            common = COM_GETFILE ;
            pHttpCon->_fileType = HTTP_FILE_DEFAULT ;
         }
      }
      pathSize = ossStrlen( pHttpCon->_pPath ) ;
      rc = pSession->allocBuff( pathSize, &pMsg, tempSize ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Unable to allocate %d bytes memory, rc=%d",
                  pathSize, rc ) ;
         goto error ;
      }
      ossMemcpy( pMsg, pHttpCon->_pPath, pathSize ) ;
      pMsg[pathSize] = 0 ;
      *ppMsg = pMsg ;
      msgSize = pathSize ;
   done:
      PD_TRACE_EXITRC ( SDB__RESTADP_CONVERTMSG, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #14
0
   INT32 restAdaptor::appendHttpBody( pmdRestSession *pSession,
                                      const CHAR *pBuffer,
                                      INT32 length,
                                      INT32 number, BOOLEAN isObjBuffer )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY( SDB__RESTADP_APPENDBODY ) ;
      SDB_ASSERT ( pSession, "pSession is NULL" ) ;
      SDB_ASSERT ( pBuffer, "pBuffer is NULL" ) ;
      httpConnection *pHttpCon = pSession->getRestConn() ;
      INT32 tempSize = 0 ;
      httpResponse httpRe ;

      if( TRUE == pHttpCon->_isChunk )
      {
         if( FALSE == pHttpCon->_isSendHttpHeader )
         {
            pHttpCon->_isSendHttpHeader = TRUE ;
            rc = _setResponseType( pSession ) ;
            if( rc )
            {
               PD_LOG ( PDERROR, "Failed to set respone type, rc=%d",
                        rc ) ;
               goto error ;
            }
            rc = _sendHttpHeader( pSession, HTTP_OK ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Failed to send http header, rc=%d", rc ) ;
               goto error ;
            }
         }

         if( isObjBuffer )
         {
            INT32 jsonSize = 0 ;
            BSONObj record ;
            std::string str ;
            _rtnObjBuff rtnObj( pBuffer, length, number ) ;

            while( TRUE )
            {
               rc = rtnObj.nextObj( record ) ;
               if ( SDB_DMS_EOC == rc )
               {
                  rc = SDB_OK ;
                  break ;
               }
               else if ( SDB_SYS == rc )
               {
                  PD_LOG ( PDERROR, "Failed to get nextObj:rc=%d", rc ) ;
                  goto error ;
               }
               
               str = record.toString( FALSE, TRUE ) ;
               jsonSize = ossStrlen( str.c_str() ) ;
               rc = _sendHttpChunk( pSession, str.c_str(), jsonSize ) ;
               if( rc )
               {
                  PD_LOG ( PDERROR, "Failed to send http chunk, rc=%d", rc ) ;
                  goto error ;
               }
            }
         }
         else
         {
            rc = _sendHttpChunk( pSession, pBuffer, length ) ;
            if( rc )
            {
               PD_LOG ( PDERROR, "Failed to send http chunk, rc=%d", rc ) ;
               goto error ;
            }
         }
      }
      else
      {
         if( isObjBuffer )
         {
            CHAR *pJson = NULL ;
            INT32 jsonSize = 0 ;
            BSONObj record ;
            std::string str ;
            _rtnObjBuff rtnObj( pBuffer, length, number ) ;

            while( TRUE )
            {
               rc = rtnObj.nextObj( record ) ;
               if ( SDB_DMS_EOC == rc )
               {
                  rc = SDB_OK ;
                  break ;
               }
               else if ( SDB_SYS == rc )
               {
                  PD_LOG ( PDERROR, "Failed to get nextObj:rc=%d", rc ) ;
                  goto error ;
               }

               str = record.toString( FALSE, TRUE ) ;
               jsonSize = ossStrlen( str.c_str() ) ;
               rc = pSession->allocBuff( jsonSize + 1, &pJson, tempSize ) ;
               if ( rc )
               {
                  PD_LOG ( PDERROR, "Unable to allocate %d bytes memory, rc=%d",
                           jsonSize + 1, rc ) ;
                  goto error ;
               }
               ossMemcpy( pJson, str.c_str(), jsonSize ) ;
               pJson[ jsonSize ] = 0 ;
               pHttpCon->_responseSize += jsonSize ;
               httpRe.pBuffer = pJson ;
               httpRe.len = jsonSize ;
               pHttpCon->_responseBody.push_back( httpRe ) ;
               pBuffer = NULL ;
               jsonSize = 0 ;
            }
         }
         else
         {
            CHAR *pFileText = NULL ;
            rc = pSession->allocBuff( length + 1, &pFileText, tempSize ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Unable to allocate %d bytes memory, rc=%d",
                        length + 1, rc ) ;
               goto error ;
            }
            ossMemcpy( pFileText, pBuffer, length ) ;
            pFileText[ length ] = 0 ;
            pHttpCon->_firstRecordSize = length ;
            httpRe.pBuffer = pFileText ;
            httpRe.len = length ;
            pHttpCon->_responseBody[0] = httpRe ;
         }
      }
   done:
      PD_TRACE_EXITRC( SDB__RESTADP_APPENDBODY, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #15
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGFILEMGR_LOAD, "_dpsLogFileMgr::load" )
   INT32 _dpsLogFileMgr::load( const DPS_LSN &lsn, _dpsMessageBlock *mb,
                               BOOLEAN onlyHeader,
                               UINT32 *pLength )
   {
      INT32 rc      = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSLGFILEMGR_LOAD );
      SDB_ASSERT ( mb, "mb can't be NULL" ) ;
      UINT32 sub    = ( UINT32 )( lsn.offset / _logFileSz  % _files.size() ) ;
      dpsLogRecordHeader head ;
      UINT32 len = 0 ;
      rc = LOG_FILE( sub )->read( lsn.offset, sizeof(dpsLogRecordHeader),
                                  (CHAR*)&head ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Failed to read log file %d, rc = %d", sub, rc ) ;
         goto error ;
      }
      if ( lsn.offset != head._lsn )
      {
         PD_LOG ( PDERROR, "Invalid LSN is read from log file, expect %lld, %d,"
                  "actual %lld, %d", lsn.offset, lsn.version, head._lsn,
                  head._version ) ;
         rc = SDB_DPS_LOG_NOT_IN_FILE ;
         goto error ;
      }
      if ( head._length < sizeof(dpsLogRecordHeader) )
      {
         PD_LOG ( PDERROR, "LSN length[%u] is smaller than dps log head",
                  head._length ) ;
         rc = SDB_DPS_CORRUPTED_LOG ;
         goto error ;
      }

      if ( pLength )
      {
         *pLength = head._length ;
      }

      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 ;
         }
      }
      ossMemcpy( mb->writePtr(), &head, sizeof(dpsLogRecordHeader ) ) ;
      mb->writePtr( mb->length() + sizeof( dpsLogRecordHeader ) ) ;
      if ( onlyHeader )
      {
         goto done ;
      }

      rc = LOG_FILE( sub )->read ( lsn.offset + sizeof(dpsLogRecordHeader ),
                                   head._length - sizeof( dpsLogRecordHeader ),
                                   mb->writePtr() ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Failed to read from log file %d for %d bytes, "
                  "rc = %d", sub, head._length-sizeof(dpsLogRecordHeader),
                  rc ) ;
         mb->writePtr( mb->length() - sizeof( dpsLogRecordHeader ) ) ;
         goto error ;
      }
      mb->writePtr ( mb->length() + head._length -
                     sizeof( dpsLogRecordHeader ) ) ;

   done:
      PD_TRACE_EXITRC ( SDB__DPSLGFILEMGR_LOAD, rc ) ;
      return rc ;
   error:
      goto done ;
   }
   INT32 _coordDeleteOperator::_prepareMainCLOp( coordCataSel &cataSel,
                                                 coordSendMsgIn &inMsg,
                                                 coordSendOptions &options,
                                                 pmdEDUCB *cb,
                                                 coordProcessResult &result )
   {
      INT32 rc                = SDB_OK ;
      MsgOpDelete *pDelMsg    = ( MsgOpDelete* )inMsg.msg() ;

      INT32 flag              = 0 ;
      CHAR *pCollectionName   = NULL;
      CHAR *pDeletor          = NULL;
      CHAR *pHint             = NULL;

      CoordGroupSubCLMap &grpSubCl = cataSel.getGroup2SubsMap() ;
      CoordGroupSubCLMap::iterator it ;

      inMsg.data()->clear() ;

      rc = msgExtractDelete( (CHAR*)inMsg.msg(), &flag, &pCollectionName,
                             &pDeletor, &pHint ) ;
      PD_RC_CHECK( rc, PDERROR, "Failed to parse delete request, rc: %d",
                   rc ) ;

      try
      {
         BSONObj boDeletor( pDeletor ) ;
         BSONObj boHint( pHint ) ;
         BSONObj boNew ;

         CHAR *pBuff             = NULL ;
         UINT32 buffLen          = 0 ;
         UINT32 buffPos          = 0 ;

         it = grpSubCl.begin() ;
         while( it != grpSubCl.end() )
         {
            CoordSubCLlist &subCLLst = it->second ;

            netIOVec &iovec = inMsg._datas[ it->first ] ;
            netIOV ioItem ;

            ioItem.iovBase = (const CHAR*)inMsg.msg() + sizeof( MsgHeader ) ;
            ioItem.iovLen = ossRoundUpToMultipleX ( offsetof(MsgOpDelete, name) +
                                                    pDelMsg->nameLength + 1, 4 ) -
                            sizeof( MsgHeader ) ;
            iovec.push_back( ioItem ) ;

            boNew = _buildNewDeletor( boDeletor, subCLLst ) ;
            UINT32 roundLen = ossRoundUpToMultipleX( boNew.objsize(), 4 ) ;
            if ( buffPos + roundLen > buffLen )
            {
               UINT32 alignLen = ossRoundUpToMultipleX( roundLen,
                                                        DMS_PAGE_SIZE4K ) ;
               rc = cb->allocBuff( alignLen, &pBuff, &buffLen ) ;
               PD_RC_CHECK( rc, PDERROR, "Alloc buff[%u] failed, rc: %d",
                            alignLen, rc ) ;
               _vecBlock.push_back( pBuff ) ;
               buffPos = 0 ;
            }
            ossMemcpy( &pBuff[ buffPos ], boNew.objdata(), boNew.objsize() ) ;
            ioItem.iovBase = &pBuff[ buffPos ] ;
            ioItem.iovLen = roundLen ;
            buffPos += roundLen ;
            iovec.push_back( ioItem ) ;

            ioItem.iovBase = boHint.objdata() ;
            ioItem.iovLen = boHint.objsize() ;
            iovec.push_back( ioItem ) ;         

            ++it ;
         }
      }
      catch( std::exception &e )
      {
         PD_LOG( PDERROR, "Parse delete message occur exception: %s",
                 e.what() ) ;
         rc = SDB_SYS ;
         goto error ;
      }

   done:
      return rc ;
   error:
      _clearBlock( cb ) ;
      goto done ;
   }
Beispiel #17
0
// PD_TRACE_DECLARE_FUNCTION ( SDB_OSSWKSEX, "ossWalkStackEx" )
UINT32 ossWalkStackEx( LPEXCEPTION_POINTERS lpEP,
                       UINT32 framesToSkip,
                       UINT32 framesRequested ,
                       void ** ppInstruction )
{
   PD_TRACE_ENTRY ( SDB_OSSWKSEX );
   HANDLE       hProcess   = GetCurrentProcess() ;
   HANDLE       hThread    = GetCurrentThread() ;

   STACKFRAME64 stackFrame = { 0 } ;
   CONTEXT      cContext   = { 0 } ;
   PCONTEXT     pContext   = &cContext ;
   BOOLEAN      bSuccess   = true ;

   UINT32 numFrames, framesOnStk ;

   framesOnStk = 0 ;

   if ( NULL != ppInstruction )
   {
      numFrames = framesRequested ;

      if ( OSS_MAX_BACKTRACE_FRAMES_SUPPORTED <= ( framesToSkip + numFrames ) )
      {
         numFrames = OSS_MAX_BACKTRACE_FRAMES_SUPPORTED - framesToSkip -1 ;
      }

      if ( NULL == lpEP )
      {
         framesOnStk = CaptureStackBackTrace( framesToSkip,
                                              numFrames, ppInstruction, NULL ) ;
      }
      else
      {
      #ifndef _WIN64
         stackFrame.AddrPC.Offset    = lpEP->ContextRecord->Eip ;
         stackFrame.AddrPC.Mode      = AddrModeFlat ;
         stackFrame.AddrStack.Offset = lpEP->ContextRecord->Esp ;
         stackFrame.AddrStack.Mode   = AddrModeFlat ;
         stackFrame.AddrFrame.Offset = lpEP->ContextRecord->Ebp ;
         stackFrame.AddrFrame.Mode   = AddrModeFlat ;
         ossMemcpy( pContext, lpEP->ContextRecord, sizeof( CONTEXT ) ) ;
      #else
         RtlCaptureContext( pContext ) ;
      #endif

         bSuccess = true ;
         WaitForSingleObject( ossGetSysMutexHandle( _StackWalk64 ), INFINITE ) ;
         while ( bSuccess && framesOnStk < numFrames )
         {
            bSuccess = StackWalk64( OSS_THIS_IMAGE_MACHINE_TYPE,
                                    hProcess,
                                    hThread,
                                    &stackFrame,
                                    pContext,
                                    NULL,
                                    SymFunctionTableAccess64,
                                    SymGetModuleBase64,
                                    NULL ) ;
            if ( bSuccess )
            {
               ppInstruction[ framesOnStk ] = (void*)stackFrame.AddrPC.Offset ;
            }
            else
            {
               ppInstruction[ framesOnStk ] = 0 ;
            }
            framesOnStk++ ;
         }
         ReleaseMutex ( ossGetSysMutexHandle( _StackWalk64 ) ) ;
      }
   }
   PD_TRACE_EXIT ( SDB_OSSWKSEX );
   return framesOnStk ;
}
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DMSSTORAGELOADEXT__IMPRTBLOCK, "dmsStorageLoadOp::pushToTempDataBlock" )
   INT32 dmsStorageLoadOp::pushToTempDataBlock ( dmsMBContext *mbContext,
                                                 pmdEDUCB *cb,
                                                 BSONObj &record,
                                                 BOOLEAN isLast,
                                                 BOOLEAN isAsynchr )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DMSSTORAGELOADEXT__IMPRTBLOCK );
      UINT32      dmsrecordSize   = 0 ;
      dmsRecord   *pRecord        = NULL ;
      dmsRecord   *pPreRecord     = NULL ;
      dmsOffset   offset          = DMS_INVALID_OFFSET ;
      dmsOffset   recordOffset    = DMS_INVALID_OFFSET ;

      _IDToInsert oid ;
      idToInsertEle oidEle((CHAR*)(&oid)) ;
      CHAR *pNewRecordData       = NULL ;
      dmsRecordData recordData ;

      dmsCompressorEntry *compressorEntry = NULL ;

      SDB_ASSERT( mbContext, "mb context can't be NULL" ) ;

      compressorEntry = _su->data()->getCompressorEntry( mbContext->mbID() ) ;
      /* For concurrency protection with drop CL and set compresor. */
      dmsCompressorGuard compGuard( compressorEntry, SHARED ) ;

      try
      {
         recordData.setData( record.objdata(), record.objsize(),
                             FALSE, TRUE ) ;
         /* (0) */
         BSONElement ele = record.getField ( DMS_ID_KEY_NAME ) ;
         const CHAR *pCheckErr = "" ;
         if ( !dmsIsRecordIDValid( ele, TRUE, &pCheckErr ) )
         {
            PD_LOG( PDERROR, "Record[%s] _id is error: %s",
                    record.toString().c_str(), pCheckErr ) ;
            rc = SDB_INVALIDARG ;
            goto error ;
         }

         if ( ele.eoo() )
         {
            oid._oid.init() ;
            rc = cb->allocBuff( oidEle.size() + record.objsize(),
                                &pNewRecordData ) ;
            if ( rc )
            {
               PD_LOG( PDERROR, "Alloc memory[size:%u] failed, rc: %d",
                       oidEle.size() + record.objsize(), rc ) ;
               goto error ;
            }
            *(UINT32*)pNewRecordData = oidEle.size() + record.objsize() ;
            ossMemcpy( pNewRecordData + sizeof(UINT32), oidEle.rawdata(),
                       oidEle.size() ) ;
            ossMemcpy( pNewRecordData + sizeof(UINT32) + oidEle.size(),
                       record.objdata() + sizeof(UINT32),
                       record.objsize() - sizeof(UINT32) ) ;
            recordData.setData( pNewRecordData,
                                oidEle.size() + record.objsize(),
                                FALSE, TRUE ) ;
            record = BSONObj( pNewRecordData ) ;
         }
         dmsrecordSize = recordData.len() ;

         if ( recordData.len() + DMS_RECORD_METADATA_SZ >
              DMS_RECORD_USER_MAX_SZ )
         {
            rc = SDB_DMS_RECORD_TOO_BIG ;
            goto error ;
         }

         if ( compressorEntry->ready() )
         {
            const CHAR *compressedData    = NULL ;
            INT32 compressedDataSize      = 0 ;
            UINT8 compressRatio           = 0 ;
            rc = dmsCompress( cb, compressorEntry,
                              recordData.data(), recordData.len(),
                              &compressedData, &compressedDataSize,
                              compressRatio ) ;
            if ( SDB_OK == rc &&
                 compressedDataSize + sizeof(UINT32) < recordData.orgLen() &&
                 compressRatio < DMS_COMPRESS_RATIO_THRESHOLD )
            {
               dmsrecordSize = compressedDataSize + sizeof(UINT32) ;
               recordData.setData( compressedData, compressedDataSize,
                                   TRUE, FALSE ) ;
            }
            else if ( rc )
            {
               if ( SDB_UTIL_COMPRESS_ABORT == rc )
               {
                  PD_LOG( PDINFO, "Record compression aborted. "
                          "Insert the original data. rc: %d", rc ) ;
               }
               else
               {
                  PD_LOG( PDWARNING, "Record compression failed. "
                          "Insert the original data. rc: %d", rc ) ;
               }
               rc = SDB_OK ;
            }
         }

         /*
          * Release the guard to avoid deadlock with truncate/drop collection.
          */
         compGuard.release() ;

         dmsrecordSize *= DMS_RECORD_OVERFLOW_RATIO ;
         dmsrecordSize += DMS_RECORD_METADATA_SZ ;
         dmsrecordSize = OSS_MIN( DMS_RECORD_MAX_SZ,
                                  ossAlignX ( dmsrecordSize, 4 ) ) ;

         INT32 expandSize = dmsrecordSize << DMS_RECORDS_PER_EXTENT_SQUARE ;
         if ( expandSize > DMS_BEST_UP_EXTENT_SZ )
         {
            expandSize = expandSize < DMS_BEST_UP_EXTENT_SZ ?
                         DMS_BEST_UP_EXTENT_SZ : expandSize ;
         }

         if ( !_pCurrentExtent )
         {
            rc = _allocateExtent ( expandSize ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Failed to allocate new extent in reorg file, "
                        "rc = %d", rc ) ;
               goto error ;
            }
            _currentExtent = (dmsExtent*)_pCurrentExtent ;
         }

         if ( dmsrecordSize > (UINT32)_currentExtent->_freeSpace || isLast )
         {
            rc = mbContext->mbLock( EXCLUSIVE ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Failed to lock collection, rc=%d", rc ) ;
               goto error ;
            }
            if ( !isAsynchr )
            {
               _currentExtent->_firstRecordOffset = DMS_INVALID_OFFSET ;
               _currentExtent->_lastRecordOffset = DMS_INVALID_OFFSET ;
            }

            rc = _su->loadExtentA( mbContext, _pCurrentExtent,
                                   _currentExtentSize / _pageSize,
                                   TRUE ) ;
            mbContext->mbUnlock() ;

            if ( rc )
            {
               PD_LOG ( PDERROR, "Failed to load extent, rc = %d", rc ) ;
               goto error ;
            }

            if ( isLast )
            {
               goto done ;
            }

            rc = _allocateExtent ( expandSize ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Failed to allocate new extent in reorg file, "
                        "rc = %d", rc ) ;
               goto error ;
            }
         }

         recordOffset = _currentExtentSize - _currentExtent->_freeSpace ;
         pRecord = ( dmsRecord* )( (const CHAR*)_currentExtent + recordOffset ) ;

         if ( _currentExtent->_freeSpace - (INT32)dmsrecordSize <
              (INT32)DMS_MIN_RECORD_SZ &&
              _currentExtent->_freeSpace <= (INT32)DMS_RECORD_MAX_SZ )
         {
            dmsrecordSize = _currentExtent->_freeSpace ;
         }

         pRecord->setNormal() ;
         pRecord->setMyOffset( recordOffset ) ;
         pRecord->setSize( dmsrecordSize ) ;
         pRecord->setData( recordData ) ;
         pRecord->setNextOffset( DMS_INVALID_OFFSET ) ;
         pRecord->setPrevOffset( DMS_INVALID_OFFSET ) ;

         if ( isAsynchr )
         {
            _currentExtent->_recCount++ ;
         }
         _currentExtent->_freeSpace -= dmsrecordSize ;
         offset = _currentExtent->_lastRecordOffset ;
         if ( DMS_INVALID_OFFSET != offset )
         {
            pPreRecord = (dmsRecord*)( (const CHAR*)_currentExtent + offset ) ;
            pPreRecord->setNextOffset( recordOffset ) ;
            pRecord->setPrevOffset( offset ) ;
         }
         _currentExtent->_lastRecordOffset = recordOffset ;

         offset = _currentExtent->_firstRecordOffset ;
         if ( DMS_INVALID_OFFSET == offset )
         {
            _currentExtent->_firstRecordOffset = recordOffset ;
         }
      }
      catch( std::exception &e )
      {
         PD_LOG( PDERROR, "Occur exception: %s", e.what() ) ;
         rc = SDB_SYS ;
         goto error ;
      }

   done:
      PD_TRACE_EXITRC ( SDB__DMSSTORAGELOADEXT__IMPRTBLOCK, rc );
      return rc ;
   error:
      goto done ;
   }
Beispiel #19
0
INT32 _ossModuleHandle::patchModuleName( const CHAR* name, CHAR *patchedName, UINT32 size )
{
   INT32 rc = SDB_OK ;
   SDB_ASSERT( name, "Module name can not be NULL" ) ;
   SDB_ASSERT( patchedName, "Patched buffer can not be NULL" ) ;

   const CHAR *ptr = NULL ;
   INT32 patchedNameLen = 0 ;
#ifdef _WINDOWS
   INT32 tailLen = ossStrlen(LIB_END_STR) ;
#else
   INT32 tailLen = ossStrlen(LIB_END_STR) ;
#endif

   ossMemset( patchedName, 0, size ) ;
#ifdef _LINUX
   ptr = ossStrstr( name, LIB_START_STR ) ;
   if ( ptr != name )
   {
      ossMemcpy( patchedName, LIB_START_STR, ossStrlen(LIB_START_STR) ) ;
   }
#endif

   patchedNameLen = ossStrlen( patchedName ) ;
   ptr = ossStrrchr( name, '.' ) ;
   if ( ptr != NULL )
   {
#ifdef _WINDOWS
      if ( 'd' != *(ptr + 1) || 'l' != *(ptr + 2) && 'l' != *(ptr + 3) )
      {
         if ( patchedNameLen + ossStrlen( name ) + tailLen >= size )
         {
            rc = SDB_INVALIDSIZE ;
            goto error ;
         }
         ossStrncat( patchedName, name, ossStrlen( name ) ) ;
         ossStrncat( patchedName, LIB_END_STR, tailLen ) ;
      }
#else
      if ( 's' != *(ptr + 1) && 'o' != *(ptr + 2) )
      {
         if ( patchedNameLen + ossStrlen( name ) + tailLen >= size )
         {
            rc = SDB_INVALIDSIZE ;
            goto error ;
         }
         ossStrncat( patchedName, name, ossStrlen( name ) ) ;
         ossStrncat( patchedName, LIB_END_STR, tailLen ) ;
      }
#endif
      else
      {
         if ( patchedNameLen + ossStrlen( name ) + tailLen >= size )
         {
            rc = SDB_INVALIDSIZE ;
            goto error ;
         }
         ossStrncat( patchedName, name, strlen( name ) ) ;
      }
   }
   else
   {
      if ( patchedNameLen + ossStrlen( name ) + tailLen >= size )
      {
         rc = SDB_INVALIDSIZE ;
         goto error ;
      }
      ossStrncat( patchedName, name, ptr - name ) ;
      ossStrncat( patchedName, LIB_END_STR, tailLen ) ;
   }

done:
   return rc ;
error:
   goto done ;
}
Beispiel #20
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSRPCMGR__RESTRORE, "_dpsReplicaLogMgr::_restore" )
   INT32 _dpsReplicaLogMgr::_restore ()
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSRPCMGR__RESTRORE );
      _dpsLogFile *file = _logger.getWorkLogFile() ;
      DPS_LSN beginLsn = file->getFirstLSN ( FALSE ) ;
      UINT32 length = file->getLength() ;
      _dpsMessageBlock block ( sizeof ( dpsLogRecordHeader ) ) ;
      _dpsMergeBlock mergeBlock ;
      dpsLogRecordHeader &head = mergeBlock.record().head();

      _restoreFlag = TRUE ;

      if ( beginLsn.invalid() )
      {
         rc = SDB_DPS_INVALID_LSN ;
         goto error ;
      }

      _movePages( beginLsn.offset, beginLsn.version ) ;

      while ( beginLsn.offset % file->size() < length )
      {
         rc = _logger.load ( beginLsn, &block ) ;
         if ( SDB_OK != rc )
         {
            PD_LOG ( PDERROR, "restore dps file load failed[rc:%d]", rc ) ;
            goto error ;
         }
         ossMemcpy( &head, block.offset(0), sizeof(dpsLogRecordHeader) ) ;
         mergeBlock.setRow( TRUE );
         mergeBlock.record().push( DPS_LOG_ROW_ROWDATA,
                                   block.length()- sizeof(dpsLogRecordHeader),
                                   block.offset(sizeof(dpsLogRecordHeader))) ;
         rc = merge ( mergeBlock ) ;
         if ( SDB_OK != rc )
         {
            PD_LOG ( PDERROR, "restore merge failed[rc:%d]", rc ) ;
            goto error ;
         }

         beginLsn.offset += head._length ;
         mergeBlock.clear() ;
         block.clear() ;
      }

      {
         UINT32 fileIdleSize = file->getIdleSize() +
                              (&_pages[_work])->getLength() ;
         if ( fileIdleSize % DPS_DEFAULT_PAGE_SIZE != 0 )
         {
            PD_LOG( PDERROR, "File[%s] idle size[%u] is not multi-times of "
                    "page size, cur page info[%u, %s]",
                    file->toString().c_str(), fileIdleSize,
                    _work, (&_pages[_work])->toString().c_str() ) ;
            rc = SDB_SYS ;
            SDB_ASSERT( FALSE, "Idle size error" ) ;
            goto error ;
         }

         file->idleSize ( fileIdleSize ) ;
      }

   done:
      _restoreFlag = FALSE ;
      PD_TRACE_EXITRC ( SDB__DPSRPCMGR__RESTRORE, rc );
      return rc ;
   error:
      goto done ;
   }
   // PD_TRACE_DECLARE_FUNCTION ( SDB_RTNLOCALLOBSTREAM__QUERYLOBMETA, "_rtnLocalLobStream::_queryLobMeta" )
   INT32 _rtnLocalLobStream::_queryLobMeta( _pmdEDUCB *cb,
                                            _dmsLobMeta &meta,
                                            BOOLEAN allowUncompleted,
                                            _rtnLobPiecesInfo* piecesInfo )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY( SDB_RTNLOCALLOBSTREAM__QUERYLOBMETA ) ;
      UINT32 len = _su->getLobPageSize() ;
      UINT32 readLen = 0 ;
      CHAR *buf = NULL ;
      dmsLobRecord record ;

      if ( SDB_LOB_MODE_WRITE == _getMode() )
      {
         rc = _queryLobMeta4Write( cb, meta, piecesInfo ) ;
         if ( SDB_OK != rc )
         {
            PD_LOG( PDERROR, "Failed to query meta for write, rc: %d", rc ) ;
            goto error ;
         }
         goto done ;
      }

      _getPool().clear() ;

      rc = _getPool().allocate( len, &buf ) ;
      if ( rc )
      {
         PD_LOG( PDERROR, "Failed to alloc buffer[%u], rc: %d",
                 len, rc ) ;
         goto error ;
      }

      record.set( &getOID(), DMS_LOB_META_SEQUENCE, 0, len, NULL ) ;

      rc = _su->lob()->read( record, _mbContext, cb, buf, readLen ) ;
      if ( SDB_OK == rc )
      {
         if ( readLen < sizeof( _dmsLobMeta ) )
         {
            PD_LOG( PDERROR, "Read lob[%s]'s meta page len is less than "
                    "meta size[%u]", getOID().str().c_str(),
                    sizeof( _dmsLobMeta ) ) ;
            rc = SDB_SYS ;
            goto error ;
         }
         ossMemcpy( (void*)&meta, buf, sizeof( meta ) ) ;
         if ( !meta.isDone() && !allowUncompleted )
         {
            PD_LOG( PDINFO, "Lob[%s] meta[%s] is not available",
                    getOID().str().c_str(), meta.toString().c_str() ) ;
            rc = SDB_LOB_IS_NOT_AVAILABLE ;
            goto error ;
         }

         if ( 0 == meta._modificationTime )
         {
            meta._modificationTime = meta._createTime ;
         }

         if ( meta._version >= DMS_LOB_META_MERGE_DATA_VERSION &&
              meta._lobLen > 0 &&
              readLen > DMS_LOB_META_LENGTH )
         {
            rc = _getPool().push( buf + DMS_LOB_META_LENGTH,
                                  ( meta._lobLen <= readLen-DMS_LOB_META_LENGTH ?
                                  meta._lobLen : readLen-DMS_LOB_META_LENGTH ),
                                  0 ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to push data to pool, rc:%d", rc ) ;
               goto error ;
            }
            _getPool().pushDone() ;
         }

         if ( NULL != piecesInfo &&
              meta.hasPiecesInfo() )
         {
            INT32 length = meta._piecesInfoNum * (INT32)sizeof( _rtnLobPieces ) ;
            const CHAR* piecesInfoBuf = (const CHAR*)
                                        ( buf + DMS_LOB_META_LENGTH - length ) ;

            rc = piecesInfo->readFrom( piecesInfoBuf, length ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to read pieces info from meta, rc:%d", rc ) ;
               goto error ;
            }
         }

         goto done ;
      }
      else
      {
         if ( SDB_LOB_SEQUENCE_NOT_EXIST == rc )
         {
            rc = SDB_FNE ;
         }
         else if ( SDB_FNE != rc )
         {
            PD_LOG( PDERROR, "Failed to get meta of lob, rc:%d", rc ) ;
         }
         goto error ;
      }

   done:
      PD_TRACE_EXITRC( SDB_RTNLOCALLOBSTREAM__QUERYLOBMETA, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #22
0
 void setDict( const CHAR *dict, UINT32 dictLen )
 {
    ossMemcpy((CHAR *)this + sizeof(_dmsDictExtent), dict, dictLen ) ;
    _dictLen = dictLen ;
 }
Beispiel #23
0
   INT32 restAdaptor::setOPResult( pmdRestSession *pSession,
                                   INT32 result,
                                   const BSONObj &info )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY( SDB__RESTADP_SETOPR ) ;
      SDB_ASSERT ( pSession, "pSession is NULL" ) ;
      httpConnection *pHttpCon = pSession->getRestConn() ;

      if( COM_GETFILE != pHttpCon->_common )
      {
         std::string str = info.toString( FALSE, TRUE ) ;
         INT32 bufferSize = ossStrlen( str.c_str() ) ;
         if( TRUE == pHttpCon->_isChunk )
         {
            if( FALSE == pHttpCon->_isSendHttpHeader )
            {
               pHttpCon->_isSendHttpHeader = TRUE ;
               rc = _setResponseType( pSession ) ;
               if( rc )
               {
                  PD_LOG ( PDERROR, "Failed to set respone type, rc=%d",
                           rc ) ;
                  goto error ;
               }
               rc = _sendHttpHeader( pSession, HTTP_OK ) ;
               if ( rc )
               {
                  PD_LOG ( PDERROR, "Failed to send http header, rc=%d", rc ) ;
                  goto error ;
               }
            }
            rc = _sendHttpChunk( pSession, str.c_str(), bufferSize ) ;
            if( rc )
            {
               PD_LOG ( PDERROR, "Failed to send http chunk, rc=%d", rc ) ;
               goto error ;
            }
         }
         else
         {
	    CHAR *pBuffer = NULL ;
	    INT32 tempSize = 0 ;
            httpResponse httpRe ;
            rc = pSession->allocBuff( bufferSize + 1, &pBuffer, tempSize ) ;
            if ( rc )
            {
               PD_LOG ( PDERROR, "Unable to allocate %d bytes memory, rc=%d",
                        bufferSize + 1, rc ) ;
               goto error ;
            }
            ossMemcpy( pBuffer, str.c_str(), bufferSize ) ;
            pBuffer[ bufferSize ] = 0 ;
            pHttpCon->_firstRecordSize = bufferSize ;
            httpRe.pBuffer = pBuffer ;
            httpRe.len = bufferSize ;
            pHttpCon->_responseBody[0] = httpRe ;
         }
      }
   done:
      PD_TRACE_EXITRC( SDB__RESTADP_SETOPR, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #24
0
 // PD_TRACE_DECLARE_FUNCTION ( SDB__DMSROUNIT__INIT, "_dmsReorgUnit::_init" )
 INT32 _dmsReorgUnit::_init ( BOOLEAN createNew )
 {
    INT32 rc = SDB_OK ;
    PD_TRACE_ENTRY ( SDB__DMSROUNIT__INIT );
    class _reorgUnitHead *unitHead = NULL ;
    INT32 bufSize = ossRoundUpToMultipleX (
                          sizeof ( class _reorgUnitHead ),
                          DMS_REORG_UNIT_HEAD_SIZE_UNIT ) ;
    INT32 restSize = bufSize ;
    _headSize = bufSize ;
    CHAR *pBuffer = (CHAR*)SDB_OSS_MALLOC (bufSize) ;
    if ( !pBuffer )
    {
       PD_LOG ( PDERROR, "Failed to allocate %d bytes of memory", bufSize ) ;
       rc = SDB_OOM ;
       goto error ;
    }
    unitHead = (class _reorgUnitHead*)pBuffer ;
    ossMemset ( unitHead, 0, bufSize ) ;
    if ( createNew )
    {
       SINT64 writeSize = 0 ;
       _readOnly = FALSE ;
       ossMemcpy ( unitHead->_eyeCatcher, DMS_REORG_UNIT_EYECATCHER,
                   DMS_REORG_UNIT_EYECATCHER_LEN ) ;
       unitHead->_headerSize = bufSize ;
       ossMemcpy ( unitHead->_fileName, _fileName, OSS_MAX_PATHSIZE ) ;
       unitHead->_pageSize = _pageSize ;
       while ( restSize != 0 )
       {
          rc = ossWrite ( &_file, &pBuffer[bufSize-restSize], restSize,
                          &writeSize ) ;
          if ( rc && SDB_INTERRUPT != rc )
          {
             PD_LOG ( PDERROR, "Failed to write into file: %s, rc = %d",
                      _fileName, rc ) ;
             goto error ;
          }
          restSize -= writeSize ;
          rc = SDB_OK ;
       }
    }
    else
    {
       SINT64 readSize = 0 ;
       _readOnly = TRUE ;
       while ( restSize > 0 )
       {
          rc = ossRead ( &_file, &pBuffer[bufSize-restSize], restSize, &readSize ) ;
          if ( rc && SDB_INTERRUPT != rc )
          {
             PD_LOG ( PDERROR, "Failed to read from file: %s, rc = %d",
                      _fileName, rc ) ;
             goto error ;
          }
          restSize -= readSize ;
          rc = SDB_OK ;
       }
       if ( ossMemcmp ( unitHead->_eyeCatcher, DMS_REORG_UNIT_EYECATCHER,
                        DMS_REORG_UNIT_EYECATCHER_LEN ) ||
            unitHead->_headerSize != bufSize )
       {
          PD_LOG ( PDERROR, "Invalid reorg file is detected" ) ;
          rc = SDB_DMS_INVALID_REORG_FILE ;
          goto error ;
       }
    }
 done :
    if ( pBuffer )
    {
       SDB_OSS_FREE ( pBuffer ) ;
    }
    PD_TRACE_EXITRC ( SDB__DMSROUNIT__INIT, rc );
    return rc ;
 error :
    goto done ;
 }
   INT32 _rtnLocalLobStream::_queryLobMeta4Write( _pmdEDUCB *cb,
                                   _dmsLobMeta &meta,
                                   _rtnLobPiecesInfo* piecesInfo )
   {
      INT32 rc = SDB_OK ;
      _rtnLobMetaCache* metaCache = NULL ;
      const _dmsLobMeta* cachedMeta = NULL ;
      BOOLEAN accessInfoLocked = FALSE ;
      SDB_ASSERT( NULL != _accessInfo, "_accessInfo is null" ) ;
      SDB_ASSERT( SDB_LOB_MODE_WRITE == _getMode(), "should be write mode" ) ;

      _accessInfo->lock() ;
      accessInfoLocked = TRUE ;

      metaCache = _accessInfo->getMetaCache() ;
      if ( NULL == metaCache )
      {
         metaCache = SDB_OSS_NEW _rtnLobMetaCache() ;
         if ( NULL == metaCache )
         {
            rc = SDB_OOM ;
            PD_LOG( PDERROR, "Failed to new _rtnLobMetaCache, rc:%d", rc ) ;
            goto error ;
         }
         _accessInfo->setMetaCache( metaCache ) ;
      }
      else
      {
         metaCache->setNeedMerge( TRUE ) ;
      }

      cachedMeta = metaCache->lobMeta() ;
      if ( NULL == cachedMeta )
      {
         UINT32 readLen = 0 ;
         UINT32 len = DMS_LOB_META_LENGTH ;
         CHAR* buf = NULL ;
         dmsLobRecord record ;

         _getPool().clear() ;

         rc = _getPool().allocate( len, &buf ) ;
         if ( rc )
         {
            PD_LOG( PDERROR, "Failed to alloc buffer[%u], rc: %d",
                    len, rc ) ;
            goto error ;
         }

         record.set( &getOID(), DMS_LOB_META_SEQUENCE, 0, len, NULL ) ;

         rc = _su->lob()->read( record, _mbContext, cb, buf, readLen ) ;
         if ( SDB_OK == rc )
         {
            if ( readLen < sizeof( meta ) )
            {
               PD_LOG( PDERROR, "Read lob[%s]'s meta page len is less than "
                       "meta size[%u]", getOID().str().c_str(),
                       sizeof( meta ) ) ;
               rc = SDB_SYS ;
               goto error ;
            }

            ossMemcpy( &meta, buf, sizeof( meta ) ) ;

            if ( !meta.isDone() )
            {
               PD_LOG( PDINFO, "Lob[%s] meta[%s] is not available",
                       getOID().str().c_str(), meta.toString().c_str() ) ;
               rc = SDB_LOB_IS_NOT_AVAILABLE ;
               goto error ;
            }

            if ( meta.hasPiecesInfo() && NULL != piecesInfo )
            {
               INT32 length = meta._piecesInfoNum * (INT32)sizeof( _rtnLobPieces ) ;
               const CHAR* pieces = (const CHAR*)
                  ( buf + DMS_LOB_META_LENGTH - length ) ;

               rc = piecesInfo->readFrom( pieces, length ) ;
               if ( SDB_OK != rc )
               {
                  PD_LOG( PDINFO, "Failed to read pieces info of Lob[%s]",
                          getOID().str().c_str() ) ;
                  goto error ;
               }
            }

            rc = metaCache->cache( *(_dmsLobMeta*)buf ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDINFO, "Failed to cache meta data of Lob[%s]",
                       getOID().str().c_str() ) ;
               goto error ;
            }
         }
         else
         {
            if ( SDB_LOB_SEQUENCE_NOT_EXIST == rc )
            {
               rc = SDB_FNE ;
            }
            else if ( SDB_FNE != rc )
            {
               PD_LOG( PDERROR, "Failed to get meta of lob, rc:%d", rc ) ;
            }
            goto error ;
         }
      }
      else
      {
         ossMemcpy( &meta, cachedMeta, sizeof( meta ) ) ;

         if ( meta.hasPiecesInfo() && NULL != piecesInfo )
         {
            INT32 length = meta._piecesInfoNum *
                           (INT32)sizeof( _rtnLobPieces ) ;
            rc = piecesInfo->readFrom( (CHAR*)cachedMeta + DMS_LOB_META_LENGTH - length,
                                      length ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to read lob pieces info, rc:%d", rc ) ;
               goto error ;
            }
         }
      }

   done:
      if ( accessInfoLocked )
      {
         _accessInfo->unlock() ;
         accessInfoLocked = FALSE ;
      }
      return rc ;
   error:
      goto done ;
   }
Beispiel #26
0
 void setOption( const CHAR *optAddr, UINT32 optSize )
 {
    SDB_ASSERT( optAddr, "Option address is NULL" ) ;
    ossMemcpy( (CHAR *)this + sizeof(_dmsOptExtent), optAddr, optSize ) ;
    _optSize = optSize ;
 }
Beispiel #27
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 ;
   }
   // PD_TRACE_DECLARE_FUNCTION ( SDB_RTNLOCALLOBSTREAM__UPDATE, "_rtnLocalLobStream::_update" )
   INT32 _rtnLocalLobStream::_update( const _rtnLobTuple &tuple,
                                      _pmdEDUCB *cb )
   {
      INT32 rc = SDB_OK ;
      BOOLEAN accessInfoLocked = FALSE ;
      PD_TRACE_ENTRY( SDB_RTNLOCALLOBSTREAM__UPDATE ) ;

      dmsLobRecord record ;
      const MsgLobTuple &t = tuple.tuple ;
      CHAR* buf = NULL ;

      record.set( &getOID(), t.columns.sequence, t.columns.offset,
                  t.columns.len, ( const CHAR * )tuple.data ) ;

      if ( DMS_LOB_META_SEQUENCE == t.columns.sequence &&
           SDB_LOB_MODE_WRITE == _getMode() &&
           0 == t.columns.offset &&
           t.columns.len >= sizeof(_dmsLobMeta) )
      {
         _rtnLobMetaCache* metaCache = NULL ;
         const _dmsLobMeta* meta = (const _dmsLobMeta*)tuple.data ;
         if ( meta->hasPiecesInfo() && t.columns.len < DMS_LOB_META_LENGTH )
         {
            rc = SDB_SYS ;
            PD_LOG( PDERROR, "Invalid lob meta data length:%d, rc=%d",
                    t.columns.len, rc ) ;
            goto error ;
         }

         SDB_ASSERT( NULL != _accessInfo, "_accessInfo is null" ) ;

         _accessInfo->lock() ;
         accessInfoLocked = TRUE ;

         metaCache = _accessInfo->getMetaCache() ;
         SDB_ASSERT( NULL != metaCache, "metaCache is null" ) ;
         SDB_ASSERT( NULL != metaCache->lobMeta(), "lob meta cache is null" ) ;

         if ( metaCache->needMerge() )
         {
            _rtnLobMetaCache newCache ;
            rc = newCache.cache( *(metaCache->lobMeta()) ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to cache lob meta, rc=%d", rc ) ;
               goto error ;
            }

            rc = newCache.merge( *meta, _su->getLobPageSize() ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to merge lob meta data, rc=%d", rc ) ;
               goto error ;
            }

            SDB_ASSERT( NULL != newCache.lobMeta(), "new lob meta cache is null" ) ;

            rc = metaCache->cache( *( newCache.lobMeta() ) ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to cache lob meta, rc=%d", rc ) ;
               goto error ;
            }

            buf = (CHAR*)SDB_OSS_MALLOC( record._dataLen > DMS_LOB_META_LENGTH ?
                                         record._dataLen : DMS_LOB_META_LENGTH ) ;
            if ( NULL == buf )
            {
               rc = SDB_OOM ;
               PD_LOG( PDERROR, "Failed to malloc buf, rc=%d", rc ) ;
               goto error ;
            }
            ossMemset( buf, 0, DMS_LOB_META_LENGTH ) ;

            ossMemcpy( buf, record._data, record._dataLen ) ;
            record._data = (const CHAR*)buf ;

            if ( newCache.lobMeta()->hasPiecesInfo() )
            {
               ossMemcpy( (void*)record._data, newCache.lobMeta(), DMS_LOB_META_LENGTH ) ;
               if ( record._dataLen < DMS_LOB_META_LENGTH )
               {
                  record._dataLen = DMS_LOB_META_LENGTH ;
               }
            }
            else
            {
               ossMemcpy( (void*)record._data, newCache.lobMeta(), sizeof( _dmsLobMeta ) ) ;
            }
         }
         else
         {
            rc = metaCache->cache( *meta ) ;
            if ( SDB_OK != rc )
            {
               PD_LOG( PDERROR, "Failed to cache lob meta, rc=%d", rc ) ;
               goto error ;
            }
         }

         rc = _su->lob()->update( record, _mbContext, cb, _getDPSCB() ) ;
         if ( SDB_OK != rc )
         {
            PD_LOG( PDERROR, "failed to update to lob:%d", rc ) ;
            goto error ;
         }

         _accessInfo->unlock() ;
         accessInfoLocked = FALSE ;
      }
      else
      {
         rc = _su->lob()->update( record, _mbContext, cb, _getDPSCB() ) ;
         if ( SDB_OK != rc )
         {
            PD_LOG( PDERROR, "failed to update to lob:%d", rc ) ;
            goto error ;
         }
      }

   done:
      if ( accessInfoLocked )
      {
         _accessInfo->unlock() ;
      }
      SAFE_OSS_FREE( buf ) ;
      PD_TRACE_EXITRC( SDB_RTNLOCALLOBSTREAM__UPDATE, rc ) ;
      return rc ;
   error:
      goto done ;
   }
Beispiel #29
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__IXMINXCB2, "_ixmIndexCB::_ixmIndexCB" )
   _ixmIndexCB::_ixmIndexCB ( dmsExtentID extentID,
                              const BSONObj &infoObj,
                              UINT16 mbID ,
                              _dmsStorageIndex *pIndexSu,
                              _dmsContext *context )
   {
      SDB_ASSERT ( pIndexSu, "index su can't be NULL" ) ;
      PD_TRACE_ENTRY ( SDB__IXMINXCB2 );

      ixmIndexCBExtent *pExtent = NULL ;
      _isInitialized = FALSE ;
      dmsExtRW extRW ;
      _pIndexSu = pIndexSu ;
      _pContext = context ;
      _extentID = extentID ;
      _pageSize = _pIndexSu->pageSize() ;

      _extent = (const ixmIndexCBExtent*)pIndexSu->beginFixedAddr ( extentID,
                                                                    1 ) ;
      extRW = pIndexSu->extent2RW( extentID, context->mbID() ) ;
      pExtent = extRW.writePtr<ixmIndexCBExtent>( 0, _pageSize ) ;

      if ( infoObj.objsize() + IXM_INDEX_CB_EXTENT_METADATA_SIZE >=
           (UINT32)_pageSize )
      {
         PD_LOG ( PDERROR, "index object is too big: %s",
                  infoObj.toString().c_str() ) ;
         goto error ;
      }

      pExtent->_type = IXM_EXTENT_TYPE_NONE ;
      if ( !generateIndexType( infoObj, pExtent->_type ) )
      {
         goto error ;
      }


      pExtent->_flag           = DMS_EXTENT_FLAG_INUSE ;
      pExtent->_eyeCatcher [0] = IXM_EXTENT_CB_EYECATCHER0 ;
      pExtent->_eyeCatcher [1] = IXM_EXTENT_CB_EYECATCHER1 ;
      pExtent->_indexFlag      = IXM_INDEX_FLAG_INVALID ;
      pExtent->_mbID           = mbID ;
      pExtent->_version        = DMS_EXTENT_CURRENT_V ;
      pExtent->_logicID        = DMS_INVALID_EXTENT ;
      pExtent->_scanExtLID     = DMS_INVALID_EXTENT ;
      pExtent->_rootExtentID   = DMS_INVALID_EXTENT ;
      ossMemset( pExtent->_reserved, 0, sizeof( pExtent->_reserved ) ) ;
      if ( !infoObj.hasField (DMS_ID_KEY_NAME) )
      {
         _IDToInsert oid ;
         oid._oid.init() ;
         *(INT32*)(((CHAR*)pExtent) +IXM_INDEX_CB_EXTENT_METADATA_SIZE) =
               infoObj.objsize() + sizeof(_IDToInsert) ;
         ossMemcpy ( ((CHAR*)pExtent) +
                     IXM_INDEX_CB_EXTENT_METADATA_SIZE +
                     sizeof(INT32),
                     (CHAR*)(&oid),
                     sizeof(_IDToInsert)) ;
         ossMemcpy ( ((CHAR*)pExtent) +
                     IXM_INDEX_CB_EXTENT_METADATA_SIZE +
                     sizeof(INT32) +
                     sizeof(_IDToInsert),
                     infoObj.objdata()+sizeof(INT32),
                     infoObj.objsize()-sizeof(INT32) ) ;
      }
      else
      {
         ossMemcpy ( ((CHAR*)pExtent) +
                     IXM_INDEX_CB_EXTENT_METADATA_SIZE,
                     infoObj.objdata(),
                     infoObj.objsize() ) ;
      }
      _init() ;

   done :
      PD_TRACE_EXIT ( SDB__IXMINXCB2 );
      return ;
   error :
      goto done ;
   }
Beispiel #30
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__CLSSYNCMAG_UPNFYLIST, "_clsSyncManager::updateNotifyList" )
   INT32 _clsSyncManager::updateNotifyList( BOOLEAN newNodeValid )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__CLSSYNCMAG_UPNFYLIST ) ;

      map<UINT64, _clsSharingStatus> &group = _info->info ;
      UINT32 removed = 0 ;
      UINT32 prevAlives = 0 ;
      UINT32 aliveRemoved = 0 ;
      _clsSyncStatus status[CLS_REPLSET_MAX_NODE_SIZE - 1] ;
      UINT32 valid = 0 ;

      ossScopedRWLock lock( &_info->mtx, EXCLUSIVE ) ;

      _aliveCount = _info->alives.size() ;

      for ( UINT32 i = 0; i < _validSync ; i++ )
      {
         if ( _notifyList[i].valid )
         {
            ++prevAlives ;
         }

         if ( group.end() ==
              group.find( _notifyList[i].id.value ) )
         {
            if ( _notifyList[i].valid )
            {
               ++aliveRemoved ;
            }
            ++removed ;
         }
         else
         {
            status[valid] = _notifyList[i] ;
            ++valid ;
         }
      }

      if ( 0 != removed )
      {
         _clearSyncList( removed, aliveRemoved, prevAlives,
                         _validSync, _notifyList ) ;
      }

      UINT32 merge = valid ;
      map<UINT64, _clsSharingStatus>::const_iterator itr =
                                        group.begin() ;
      for ( ; itr != group.end(); itr++ )
      {
         BOOLEAN has = FALSE ;
         for ( UINT32 j = 0; j < valid; j++ )
         {
            if ( itr->first == status[j].id.value )
            {
               has = TRUE ;
               break ;
            }
         }
         if ( !has )
         {
            status[merge].offset = 0 ;
            status[merge].id.value = itr->first ;
            status[merge].valid = newNodeValid ;
            ++merge ;
         }
      }

      ossMemcpy( _notifyList, status, merge * sizeof( _clsSyncStatus ) ) ;
      _validSync = merge ;

      PD_TRACE_EXITRC ( SDB__CLSSYNCMAG_UPNFYLIST, rc ) ;
      return rc ;
   }