Esempio n. 1
0
    Task* getNextTask() {
        std::unique_lock<std::mutex> counterLock(m_threadCounterMutex);
        m_threadsDoneCount++;

        if (m_threadsDoneCount >= m_totalThreads) {
            while (!m_queueSemaphore.wait_for(std::chrono::milliseconds(100))) {
                if (m_closeRequested) {
                    m_closing = true;
                    m_barrier.notify_all();
                    return nullptr;
                }
            }

            m_threadsDoneCount = 0;
            m_currentProblem = m_tasks.front().problemSpace().begin();
        }

        counterLock.unlock();
        m_barrier.wait_until_condition([this]() { return m_closing.load(); });

        if (m_closing) {
            return nullptr;
        }

        return &m_tasks.front();
    }
Esempio n. 2
0
  bool perform2(size_t blocksCount = 10)
  {
    using namespace Tests::Common;
    launchTestnet(3, Line);
    std::this_thread::sleep_for(std::chrono::milliseconds(10000));
    LOG_TRACE("STEP 1 PASSED");
    mineBlock();
    mineBlock();
    LOG_TRACE("STEP 2 PASSED");
    std::unique_ptr<CryptoNote::INode> localNode;
    std::unique_ptr<CryptoNote::INode> remoteNode;

    nodeDaemons.front()->makeINode(localNode);
    nodeDaemons.back()->makeINode(remoteNode);
    
    std::unique_ptr<CryptoNote::IWalletLegacy> wallet;
    makeWallet(wallet, localNode);

    LOG_TRACE("STEP 3 PASSED");
    Semaphore blockMined;
    Semaphore blockArrivedToRemote;

    WaitForBlockchainHeightChangeObserver localHCO(blockMined);
    WaitForBlockchainHeightChangeObserver remoteHCO(blockArrivedToRemote);

    localNode->addObserver(&localHCO);
    remoteNode->addObserver(&remoteHCO);
    for (size_t blockNumber = 0; blockNumber < blocksCount; ++blockNumber) {
      nodeDaemons.front()->startMining(1, wallet->getAddress());
      blockMined.wait();
      CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(5000)), false, "block propagation too slow >5000ms.");
      nodeDaemons.front()->stopMining();
      LOG_TRACE("STEP 4 STAGE " + TO_STRING(blockNumber+1) + " of " + TO_STRING(blocksCount)+" PASSED");
    }
    
    return true;
  }
Esempio n. 3
0
  bool perform4() {
    using namespace CryptoNote;
    using namespace Tests::Common;
    launchTestnet(3, Star);
    LOG_TRACE("STEP 1 PASSED");
    
    std::unique_ptr<CryptoNote::INode> hopNode;
    std::unique_ptr<CryptoNote::INode> localNode;
    std::unique_ptr<CryptoNote::INode> remoteNode;

    nodeDaemons[0]->makeINode(hopNode);
    nodeDaemons[1]->makeINode(localNode);
    nodeDaemons[2]->makeINode(remoteNode);

    LOG_TRACE("STEP 2 PASSED");


    std::string test_block1_hex =
      "0101b392d79f05a742885cb01d11b7b36fb8bf14616d42cd3d8c1429a224df41afa81b86b8a3a84e"
      "d8c33f010b01ff0108c0a62d02cc353782cbe4c6067bd30510f11d1f2993f2c7fed37239f299ffe3"
      "f96f135675c096b102023e8d4b2c22d73f91d0d9f8e0e12c8df24e5917f00d0b2dd99786c5bb0e5b"
      "300580bbb021022764ae61c084db07e7cd83c55e9c833f42b1d422e1008220fdb4acc726b94ea980"
      "88debe01023330c2b7dc4840f478066370ae48b148ce8dd010c59f6ecc08598682d32f07d080a0d9"
      "e61d02bcf35dc40ead54a614174774e60d8f5d0e46272c70bc7e70f205f7ccef25c34980b09dc2df"
      "01026ddcf1aed901f018453fd9352a01d5a44067d271ca403b4cd799d9832076daa280f092cbdd08"
      "021f613eab32b76ed03f6a796de7a5c92009ea9f9b9e3299ec91df7657cd694e5580c089a9a2f50f"
      "02f545046885a297ba63a2c7b305a74fdb741129cc367330661c1363e0bb0f0d0b2101acf052dcbe"
      "407bc34df1b7fffc17f0bfb0ffc23002e2b6de48a210df6f78bf1400";
    std::string test_block2_hex =
      "0101b492d79f05456231a956ed3a8c1ac0bfe8efc1bb5d522d8474e566b051919ddea0ceab478a74"
      "e35210010c01ff0207c0e41202b2d7e697c6e2e894f9e98262c278235720b39f3a149774cb58cb52"
      "e5dde21601c09fab0302abffefad3afab42ca1ce2f7dccfa6942256f31387b307becd43571cfe22a"
      "10688084af5f02e2ab32d9b8fb8ced4bf4a81de0f48c23dc575076e8d233a3532d28f36e79035380"
      "a0d9e61d020c10664fe1ca35418733fa32ae2deadd4bf7ed982bb5d11ba98a7940a73e161580b09d"
      "c2df010266c3bfa27436b480a217a2fe06df714f4d2094ec1a0ced3bac2d96881972e28a80f092cb"
      "dd0802f31e9ac25fb8afd1d9d964331242a94f023c3188db5e532b5a9c800a843a3ebc80c089a9a2"
      "f50f0206244fcc73941c3da62ea6d62d679bedb311fc530d149099bdfd04c59cd507a121019d4b74"
      "f09454ccfdd6ca44b8c5f73c6805ea08dbe6a71769b058e158b2d4df5100";
    std::string test_block3_hex =
      "0101b492d79f051f6fe6d9f7c14c0d5e16ba82d9ea68e4e6d6f30726854d45330aeb2fae5c1cd3fb"
      "7f4352010d01ff0308ffae350220f4c1c7631ecf4247688c376665df2b9dd935af6e4c027c9cddcb"
      "400fefec7380a4e803029e05ef9b3295e178d0f3199fca420f909f04fdab09b97c14290c8a913e42"
      "19c68087a70e02693641fefb1a6da81c2308370f349ef5e4adab792ae06b5da989ae3f1b7a13ca80"
      "d293ad0302c14d721ed8da5c98f108ef17c326737765857ddfa0b705fd4483cfa7ffeaad51808cee"
      "891a02f5a8e2ac24d6a9f789e5514de520c3ac28387788e130e22c4250b7d1be47460380b09dc2df"
      "0102cc3b2f894b416f3e09afae0395fc01cc2ec9763dff72839944e60055049ea37d80f092cbdd08"
      "02772df06a2cd92c174815ae1572799430ea01e903796f6a763648c7b350151ce580c089a9a2f50f"
      "0211c7bea98edba4fad6d3f19b330a676b8fb0391f7a99f45542e7cf52d39d6c632101e0370c5c79"
      "e99d772b41e0569bc41e1ebde2e563cdb7f5bdd23984899fad103200";
    std::string test_block4_hex =
      "0101b492d79f0537da79424e1cc69d16aadf174dcf443947f8027695a5d1e30b2be4f5aa71904194"
      "47fe54010e01ff0407fffc1a0278eb82c9ea2f1e998906cec55caf26e347224c3391fb0aa2213bc1"
      "5eec4dacc580bbb021024ce32a63614269f43f698644c98fd9b7a11694dc69fd5126f6f6735ba6c5"
      "98dd808c8d9e0202d539ead46faf6d786964dd5106004612eb8d64778ad4fe8befa8c63e4d666f92"
      "808cee891a021a6c6669298dcc1c86af887804f128123d95a6d96b5884db97cfc96fa9ad018e80b0"
      "9dc2df0102dd3b9bbfef1eddeef8c406de9c0c4fc469c8069c910541252491df5a482fd5e380f092"
      "cbdd0802176a4cb411309761b7f50b0f495e99cc55cbaae70011d3c901e409a8a938f1b680c089a9"
      "a2f50f02bb232a77911350a1315de0b3de447142390f97e5ef25ecc1bf5837a8972b4b5e2101ef54"
      "5c318e38cfdd92362340fab6ec6630e4134b93cfd01db4d9a42fa945fdef00";

    Semaphore blockArrivedToRemote;

    WaitForBlockchainHeightChangeObserver remoteHCO(blockArrivedToRemote);

    std::chrono::steady_clock::time_point localAdded;
    std::chrono::steady_clock::time_point hoplAdded;
    std::chrono::steady_clock::time_point remoteAdded;
    std::chrono::steady_clock::time_point submitInvokingStart;
    std::chrono::steady_clock::time_point submitInvoked;

    //auto height = localNode->getLastKnownBlockHeight();

    CallbackHeightChangeObserver CHCOLocal([&localAdded](uint64_t new_height){localAdded = std::chrono::steady_clock::now(); });
    CallbackHeightChangeObserver CHCOHop([&hoplAdded](uint64_t new_height){hoplAdded = std::chrono::steady_clock::now(); });
    CallbackHeightChangeObserver CHCORemote([&remoteAdded](uint64_t new_height){remoteAdded = std::chrono::steady_clock::now(); });

    localNode->addObserver(&CHCOLocal);
    hopNode->addObserver(&CHCOHop);
    remoteNode->addObserver(&CHCORemote);
    remoteNode->addObserver(&remoteHCO);

    LOG_TRACE("test_block1");
    submitInvokingStart = std::chrono::steady_clock::now();
    if (!nodeDaemons[1]->submitBlock(test_block1_hex)) return false;
    submitInvoked = std::chrono::steady_clock::now();
    CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 1 propagation too slow >10000ms.");
    LOG_TRACE("submitBlock() invocation takes:        " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms");
    LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms");
    LOG_TRACE("Local   -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms");
    LOG_TRACE("HopNode -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms");
    LOG_TRACE("Local   -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms");

    LOG_TRACE("test_block2");
    submitInvokingStart = std::chrono::steady_clock::now();
    if (!nodeDaemons[1]->submitBlock(test_block2_hex)) return false;
    submitInvoked = std::chrono::steady_clock::now();
    CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 2 propagation too slow >10000ms.");
    LOG_TRACE("submitBlock() invocation takes:        " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms");
    LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms");
    LOG_TRACE("Local   -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms");
    LOG_TRACE("HopNode -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms");
    LOG_TRACE("Local   -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms");

    LOG_TRACE("test_block3");
    submitInvokingStart = std::chrono::steady_clock::now();
    if (!nodeDaemons[1]->submitBlock(test_block3_hex)) return false;
    submitInvoked = std::chrono::steady_clock::now();
    CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 3 propagation too slow >10000ms.");
    LOG_TRACE("submitBlock() invocation takes:        " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms");
    LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms");
    LOG_TRACE("Local   -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms");
    LOG_TRACE("HopNode -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms");
    LOG_TRACE("Local   -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms");
    
    LOG_TRACE("test_block4");
    submitInvokingStart = std::chrono::steady_clock::now();
    if (!nodeDaemons[1]->submitBlock(test_block4_hex)) return false;
    submitInvoked = std::chrono::steady_clock::now();
    CHECK_AND_ASSERT_MES(blockArrivedToRemote.wait_for(std::chrono::milliseconds(10000)), false, "block 4 propagation too slow >10000ms.");
    LOG_TRACE("submitBlock() invocation takes:        " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(submitInvoked - submitInvokingStart).count()) + " ms");
    LOG_TRACE("HeightChangedCallback() since submit : " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(localAdded - submitInvoked).count()) + " ms");
    LOG_TRACE("Local   -> HopNode: " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(hoplAdded - localAdded).count()) + " ms");
    LOG_TRACE("HopNode -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - hoplAdded).count()) + " ms");
    LOG_TRACE("Local   -> Remote:  " + TO_STRING(std::chrono::duration_cast<std::chrono::milliseconds>(remoteAdded - localAdded).count()) + " ms");

    localNode.release();
    remoteNode.release();
    hopNode.release();
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    return true;
  }