/* This function generates a sequence of nodes by a depth-first traverse in * pre-order, this is for verifying if the BST is well balanced. */ int traverseBBSTPreOrder(BBST tree, DQueue lines, int maxcount) { BBSTNode p = tree->Root; DQueueData stack; initializeDQueue(&stack, tree->Context); while( stack.NodeCount > 0 || p != NULL ) { if ( p != NULL ) { insertDQueueTailNode(lines, p); insertDQueueHeadNode(&stack, p); p = p->Left; if ( maxcount > 0 && getDQueueLength(lines) == maxcount ) { break; } } else { p = (BBSTNode)removeDQueueHeadNode(&stack); p = p->Right; } } removeAllDQueueNodes(&stack); cleanDQueue(&stack); return FUNC_RETURN_OK; }
/****************************************************************************** * I aM Alive. * * Request: * |<----------- 64 bits (8 bytes) ----------->| * +----------+--------------------------------+ * | TDC | BDC | Reserved | * +----------+----------+---------------------+ * | | * | Machine ID info | * | | * +-------------------------------------------+ _____ 64bit aligned * * Response: * |<----------- 64 bits (8 bytes) ----------->| * +---------------------+---------------------+ * | heartbeat result | Reserved | * +---------------------+---------------------+ _____ 64bit aligned * ******************************************************************************/ int sendIMAlive(int *errorcode, char *errorbuf, int errorbufsize) { int res = FUNC_RETURN_OK; AsyncCommBuffer newcommbuffer = NULL; Assert( DRMGlobalInstance->LocalHostStat != NULL ); /* Build request. */ SelfMaintainBufferData tosend; initializeSelfMaintainBuffer(&tosend, PCONTEXT); RPCRequestHeadIMAliveData requesthead; requesthead.TmpDirCount = getDQueueLength(&DRMGlobalInstance->LocalHostTempDirectories); requesthead.TmpDirBrokenCount = DRMGlobalInstance->LocalHostStat->FailedTmpDirNum; requesthead.Reserved = 0; appendSMBVar(&tosend, requesthead); appendSelfMaintainBuffer(&tosend, (char *)(DRMGlobalInstance->LocalHostStat), offsetof(SegStatData, Info) + DRMGlobalInstance->LocalHostStat->Info.Size); /* Set content to send and add to AsyncComm framework. */ AsyncCommMessageHandlerContext context = rm_palloc0(AsyncCommContext, sizeof(AsyncCommMessageHandlerContextData)); context->inMessage = false; context->UserData = NULL; context->MessageRecvReadyHandler = NULL; context->MessageRecvedHandler = receivedIMAliveResponse; context->MessageSendReadyHandler = NULL; context->MessageSentHandler = sentIMAlive; context->MessageErrorHandler = sentIMAliveError; context->MessageCleanUpHandler = sentIMAliveCleanUp; /* Connect to HAWQ RM server */ res = registerAsyncConnectionFileDesc(NULL, DRMGlobalInstance->SendToStandby? standby_addr_host: master_addr_host, rm_master_port, ASYNCCOMM_READBYTES | ASYNCCOMM_WRITEBYTES, &AsyncCommBufferHandlersMessage, context, &newcommbuffer); if ( res != FUNC_RETURN_OK ) { rm_pfree(AsyncCommContext, context); elog(WARNING, "Fail to register asynchronous connection for sending " "IMAlive message. %d", res); return res; } buildMessageToCommBuffer(newcommbuffer, tosend.Buffer, tosend.Cursor + 1, REQUEST_RM_IMALIVE, 0, 0); destroySelfMaintainBuffer(&tosend); context->AsyncBuffer = newcommbuffer; InitHandler_Message(newcommbuffer); return FUNC_RETURN_OK; }