ClRcT clLogClntStreamEntryAdd(ClCntHandleT hClntTable, ClLogStreamKeyT *pStreamKey, ClStringT *pShmName, ClUint32T shmSize, ClCntNodeHandleT *phStreamNode) { ClRcT rc = CL_OK; ClLogClntStreamDataT *pStreamData = NULL; #ifndef NO_SAF ClInt32T fd = 0; ClUint32T headerSize = 0; ClInt32T tries = 0; struct stat statbuf; #endif CL_LOG_DEBUG_TRACE(("Enter")); pStreamData = (ClLogClntStreamDataT*) clHeapCalloc(1, sizeof(ClLogClntStreamDataT)); if( pStreamData == NULL ) { CL_LOG_DEBUG_ERROR(("clHeapCalloc()")); return CL_LOG_RC(CL_ERR_NO_MEMORY); } pStreamData->shmName.pValue = (ClCharT*) clHeapCalloc(pShmName->length, sizeof(ClCharT)); if( NULL == pStreamData->shmName.pValue ) { CL_LOG_DEBUG_ERROR(("clHeapCalloc()")); clHeapFree(pStreamData); return CL_LOG_RC(CL_ERR_NO_MEMORY); } memcpy(pStreamData->shmName.pValue, pShmName->pValue, pShmName->length); CL_LOG_DEBUG_VERBOSE(("Opening Shared Memory Segment: %s", pStreamData->shmName.pValue)); #ifndef NO_SAF rc = clOsalShmOpen_L(pStreamData->shmName.pValue, CL_LOG_SHM_OPEN_FLAGS, CL_LOG_SHM_MODE, &fd); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalShmOpen(): rc[0x %x]", rc)); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } /* * Check to be safe w.r.t SIGBUS in case a parallel ftruncate from log server is in progress */ memset(&statbuf, 0, sizeof(statbuf)); while(tries++ < 3 && !fstat(fd, &statbuf)) { if((ClUint32T) statbuf.st_size < shmSize) { sleep(1); } else break; } if(!statbuf.st_size) { CL_LOG_DEBUG_ERROR(("fstat on shared segment with size 0")); CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return CL_LOG_RC(CL_ERR_LIBRARY); } rc = clOsalMmap_L(NULL, shmSize, CL_LOG_MMAP_PROT_FLAGS, CL_LOG_MMAP_FLAGS, fd, 0, (void **) &pStreamData->pStreamHeader); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalMmap(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); CL_LOG_DEBUG_VERBOSE(("Mmapped Shared Memory Segment")); pStreamData->pStreamHeader->shmSize = shmSize; headerSize = CL_LOG_HEADER_SIZE_GET(pStreamData->pStreamHeader->maxMsgs, pStreamData->pStreamHeader->maxComps); pStreamData->pStreamRecords = ((ClUint8T *) (pStreamData->pStreamHeader)) + headerSize; CL_LOG_DEBUG_VERBOSE(("pStreamHeader : %p", (void *) pStreamData->pStreamHeader)); CL_LOG_DEBUG_VERBOSE(("msgMap: %p", (void *) (pStreamData->pStreamHeader + 1))); CL_LOG_DEBUG_VERBOSE(("pStreamRecords: %p", pStreamData->pStreamRecords)); #endif rc = clBitmapCreate(&(pStreamData->hStreamBitmap), 0); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clBitmapCreate(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clOsalMunmap_L(pStreamData->pStreamHeader, shmSize), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } /* * Create the shared lock for the sem. */ rc = clLogClientStreamSharedMutexInit(pStreamData, pShmName); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalProcessSharedMutexInit(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clBitmapDestroy(pStreamData->hStreamBitmap), CL_OK); CL_LOG_CLEANUP(clOsalMunmap_L(pStreamData->pStreamHeader, shmSize), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } rc = clCntNodeAddAndNodeGet(hClntTable,(ClCntKeyHandleT) pStreamKey, (ClCntDataHandleT) pStreamData, NULL, phStreamNode); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clCntNodeAddAndNodeGet(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clBitmapDestroy(pStreamData->hStreamBitmap), CL_OK); CL_LOG_CLEANUP(clLogClientStreamMutexDestroy(pStreamData), CL_OK); CL_LOG_CLEANUP(clOsalMunmap_L(pStreamData->pStreamHeader, shmSize), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } CL_LOG_DEBUG_TRACE(("Exit")); return rc; }
static ClRcT clLogMasterStreamTableRecreate(ClLogSvrCommonEoDataT *pCommonEoEntry, ClBufferHandleT hFileEntryBuf, ClLogFileDataT *pFileData) { ClRcT rc = CL_OK; ClLogStreamKeyT streamKey = {{0}}; ClLogStreamKeyT *pStreamKey = NULL; ClLogMasterStreamDataT *pStreamData = NULL; ClCntNodeHandleT hStreamNode = CL_HANDLE_INVALID_VALUE; ClUint32T bitNum = 0; ClLogMasterEoDataT *pMasterEoEntry = NULL; CL_LOG_DEBUG_TRACE(("Enter")); rc = clLogMasterEoEntryGet(&pMasterEoEntry, &pCommonEoEntry); if( CL_OK != rc ) { return rc; } rc = clXdrUnmarshallSaNameT(hFileEntryBuf, &(streamKey.streamName)); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc)); return rc; } rc = clXdrUnmarshallSaNameT(hFileEntryBuf, &(streamKey.streamScopeNode)); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc)); return rc; } rc = clLogStreamKeyCreate(&streamKey.streamName, &streamKey.streamScopeNode, pCommonEoEntry->maxStreams, &pStreamKey); if( CL_OK != rc ) { return rc; } pStreamData = (ClLogMasterStreamDataT*) clHeapCalloc(1, sizeof(ClLogMasterStreamDataT)); if( NULL == pStreamData ) { CL_LOG_DEBUG_ERROR(("clHeapCalloc()")); clLogStreamKeyDestroy(pStreamKey); return rc; } rc = clXdrUnmarshallClUint64T(hFileEntryBuf, &(pStreamData->streamMcastAddr)); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint64T(): rc[0x %x]", rc)); clHeapFree(pStreamData); clLogStreamKeyDestroy(pStreamKey); return rc; } rc = clXdrUnmarshallClUint16T(hFileEntryBuf, &(pStreamData->streamId)); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint16T(): rc[0x %x]", rc)); clHeapFree(pStreamData); clLogStreamKeyDestroy(pStreamKey); return rc; } rc = clCntNodeAddAndNodeGet(pFileData->hStreamTable, (ClCntKeyHandleT) pStreamKey, (ClCntDataHandleT) pStreamData, NULL, &hStreamNode); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clCntNodeAdd(): rc[0x %x]", rc)); clHeapFree(pStreamData); clLogStreamKeyDestroy(pStreamKey); return rc; } /* Find out the partiuclar stream is still valid */ if( strncmp(gStreamScopeGlobal, (const ClCharT *)pStreamKey->streamScopeNode.value, pStreamKey->streamScopeNode.length) && CL_FALSE == clLogMasterStreamIsValid(&pStreamKey->streamScopeNode)) { /* * marking this as invalid by assigining CL_IOC_RESERVED_ADDRESS * so that streamMcastAddr will not be allocated & bit will not be set * numActive streams count also will be valid */ pStreamData->streamMcastAddr = CL_IOC_RESERVED_ADDRESS; clLogNotice(CL_LOG_AREA_FILE_OWNER, CL_LOG_CTX_FO_INIT, "Invalidating the stream [%.*s:%.*s]", pStreamKey->streamScopeNode.length, pStreamKey->streamScopeNode.value, pStreamKey->streamName.length, pStreamKey->streamName.value); } if( CL_IOC_RESERVED_ADDRESS != pStreamData->streamMcastAddr ) { bitNum = pStreamData->streamMcastAddr - pMasterEoEntry->startMcastAddr; CL_LOG_DEBUG_TRACE(("bitNUm: %d pStreamData->streamMcastAddr : %lld \n", bitNum, pStreamData->streamMcastAddr)); rc = clBitmapBitSet(pMasterEoEntry->hAllocedAddrMap, bitNum); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clBitmapBitClear()")); CL_LOG_CLEANUP(clCntNodeDelete(pFileData->hStreamTable, hStreamNode), CL_OK); } pFileData->nActiveStreams++; clLogInfo(CL_LOG_AREA_MASTER, CL_LOG_CTX_CKPT_READ, "Active stream [%.*s:%.*s] has been added", pStreamKey->streamScopeNode.length, pStreamKey->streamScopeNode.value, pStreamKey->streamName.length, pStreamKey->streamName.value); } CL_LOG_DEBUG_TRACE(("Exit")); return CL_OK; }