void ProcessMerkleBlock(CNode& pfrom, CDataStream& vRecv, ThinBlockWorker& worker, const TxFinder& txfinder) { CMerkleBlock merkleBlock; vRecv >> merkleBlock; uint256 hash = merkleBlock.header.GetHash(); pfrom.AddInventoryKnown(CInv(MSG_BLOCK, hash)); if (!worker.isAvailable() && worker.blockHash() != hash) LogPrint("thin", "expected peer %d to be working on %s, " "but received block %s, switching peer to new block\n", pfrom.id, worker.blockStr(), hash.ToString()); if (HaveBlockData(hash)) { LogPrint("thin", "already had block %s, " "ignoring merkleblock (peer %d)\n", hash.ToString(), pfrom.id); worker.setAvailable(); return; } worker.setToWork(hash); if (worker.isStubBuilt()) { LogPrint("thin", "already built thin block stub " "%s (peer %d)\n", hash.ToString(), pfrom.id); SendPing(pfrom); return; } LogPrint("thin", "building thin block %s (peer %d) ", hash.ToString(), pfrom.id); // Now attempt to reconstruct the block from the state of our memory pool. // The peer should have already sent us the transactions we need before // sending us this message. If it didn't, we just ignore the message // entirely for now. try { worker.buildStub(merkleBlock, txfinder); SendPing(pfrom); } catch (const thinblock_error& e) { pfrom.PushMessage("reject", std::string("merkleblock"), REJECT_MALFORMED, std::string("bad merkle tree"), hash); Misbehaving(pfrom.GetId(), 10); // FIXME: Is this DoS policy reasonable? Immediate disconnect is better? LogPrintf("%s peer=%d", e.what(), pfrom.GetId()); worker.setAvailable(); return; } }
CNode* CMigrationInfo::FindNodeWithFreeMem(CNode* i_sourceNode, CProcess* i_process) { i_sourceNode->WriteLog("MIGRATION - MEM ISSUES - Searching for destination node to establish migration"); CNode* returnValue = NULL; bool found = false; double maxFreeMem = 0; uint32_t maxIndex = 0; // find out which is the process with the greatest free mem that we can migrate to: if (i_sourceNode->GetAvailableBandwidth() > 0) { for (uint32_t i = 0; i < CMasterSingleton::GetInstance()->GetNodeCount(); ++i) { CNode* currentNode = CMasterSingleton::GetInstance()->GetNode(i); double freeMem = currentNode->GetFreeMem(); if (maxFreeMem < freeMem && i_sourceNode->GetId() != currentNode->GetId() && CanBeDestination(currentNode, i_process)) { maxFreeMem = freeMem; maxIndex = i; found = true; } } // if found is false, we will return a null pointer meaning that the migration should not happen if (found) returnValue = CMasterSingleton::GetInstance()->GetNode(maxIndex); } return returnValue; }
CNode* CMigrationInfo::FindNodeWithFreeCpu(CNode* i_sourceNode, CProcess* i_process) { i_sourceNode->WriteLog("MIGRATION - CPU ISSUES - Searching for destination node to establish migration"); CNode* returnValue = NULL; bool found = false; uint32_t minIndex = 0; double minCpu = 1; if (i_sourceNode->GetAvailableBandwidth() > 0) { for (uint32_t i = 0; i < CMasterSingleton::GetInstance()->GetNodeCount(); ++i) { CNode* currentNode = CMasterSingleton::GetInstance()->GetNode(i); double cpuUsage = currentNode->GetCpuUsage(); if (minCpu > cpuUsage && i_sourceNode->GetId() != currentNode->GetId() && CanBeDestination(currentNode, i_process)) { minCpu = cpuUsage; minIndex = i; found = true; } } // if found is false, we will return a null pointer meaning that the migration should not happen if (found) returnValue = CMasterSingleton::GetInstance()->GetNode(minIndex); } return returnValue; }