mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-04 11:55:51 +00:00
@@ -137,6 +137,7 @@ target_sources (clio PRIVATE
|
||||
## Util
|
||||
src/util/config/Config.cpp
|
||||
src/util/log/Logger.cpp
|
||||
src/util/Random.cpp
|
||||
src/util/Taggable.cpp)
|
||||
|
||||
# Clio server
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <etl/Source.h>
|
||||
#include <rpc/RPCHelpers.h>
|
||||
#include <util/Profiler.h>
|
||||
#include <util/Random.h>
|
||||
#include <util/log/Logger.h>
|
||||
|
||||
#include <ripple/beast/net/IPEndpoint.h>
|
||||
@@ -184,8 +185,10 @@ LoadBalancer::forwardToRippled(
|
||||
boost::asio::yield_context yield
|
||||
) const
|
||||
{
|
||||
srand(static_cast<unsigned>(time(0)));
|
||||
auto sourceIdx = rand() % sources_.size();
|
||||
std::size_t sourceIdx = 0;
|
||||
if (!sources_.empty())
|
||||
sourceIdx = util::Random::uniform(0ul, sources_.size());
|
||||
|
||||
auto numAttempts = 0u;
|
||||
|
||||
while (numAttempts < sources_.size()) {
|
||||
@@ -228,8 +231,10 @@ template <class Func>
|
||||
bool
|
||||
LoadBalancer::execute(Func f, uint32_t ledgerSequence)
|
||||
{
|
||||
srand(static_cast<unsigned>(time(0)));
|
||||
auto sourceIdx = rand() % sources_.size();
|
||||
std::size_t sourceIdx = 0;
|
||||
if (!sources_.empty())
|
||||
sourceIdx = util::Random::uniform(0ul, sources_.size());
|
||||
|
||||
auto numAttempts = 0;
|
||||
|
||||
while (true) {
|
||||
|
||||
27
src/util/Random.cpp
Normal file
27
src/util/Random.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
//------------------------------------------------------------------------------
|
||||
/*
|
||||
This file is part of clio: https://github.com/XRPLF/clio
|
||||
Copyright (c) 2023, the clio developers.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
//==============================================================================
|
||||
#include <util/Random.h>
|
||||
|
||||
#include <chrono>
|
||||
|
||||
namespace util {
|
||||
|
||||
std::mt19937_64 Random::generator_{std::chrono::system_clock::now().time_since_epoch().count()};
|
||||
|
||||
} // namespace util
|
||||
44
src/util/Random.h
Normal file
44
src/util/Random.h
Normal file
@@ -0,0 +1,44 @@
|
||||
//------------------------------------------------------------------------------
|
||||
/*
|
||||
This file is part of clio: https://github.com/XRPLF/clio
|
||||
Copyright (c) 2023, the clio developers.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
//==============================================================================
|
||||
#pragma once
|
||||
|
||||
#include <random>
|
||||
|
||||
namespace util {
|
||||
|
||||
class Random {
|
||||
public:
|
||||
template <typename T>
|
||||
static T
|
||||
uniform(T min, T max)
|
||||
{
|
||||
assert(min <= max);
|
||||
if constexpr (std::is_floating_point_v<T>) {
|
||||
std::uniform_real_distribution<T> distribution(min, max);
|
||||
return distribution(generator_);
|
||||
}
|
||||
std::uniform_int_distribution<T> distribution(min, max);
|
||||
return distribution(generator_);
|
||||
}
|
||||
|
||||
private:
|
||||
static std::mt19937_64 generator_;
|
||||
};
|
||||
|
||||
} // namespace util
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <data/CassandraBackend.h>
|
||||
#include <etl/NFTHelpers.h>
|
||||
#include <rpc/RPCHelpers.h>
|
||||
#include <util/Random.h>
|
||||
#include <util/config/Config.h>
|
||||
|
||||
#include <boost/json/parse.hpp>
|
||||
@@ -73,6 +74,8 @@ protected:
|
||||
EXPECT_TRUE(handle.connect());
|
||||
handle.execute("DROP KEYSPACE " + std::string{keyspace});
|
||||
}
|
||||
|
||||
std::default_random_engine randomEngine{0};
|
||||
};
|
||||
|
||||
TEST_F(BackendCassandraTest, Basic)
|
||||
@@ -437,8 +440,6 @@ TEST_F(BackendCassandraTest, Basic)
|
||||
EXPECT_FALSE(obj);
|
||||
}
|
||||
|
||||
// obtain a time-based seed:
|
||||
auto const seed = std::chrono::system_clock::now().time_since_epoch().count();
|
||||
std::string accountBlobOld = accountBlob;
|
||||
{
|
||||
lgrInfoNext.seq = lgrInfoNext.seq + 1;
|
||||
@@ -448,7 +449,7 @@ TEST_F(BackendCassandraTest, Basic)
|
||||
lgrInfoNext.accountHash = ~(lgrInfoNext.accountHash ^ lgrInfoNext.txHash);
|
||||
|
||||
backend->writeLedger(lgrInfoNext, ledgerInfoToBinaryString(lgrInfoNext));
|
||||
std::shuffle(accountBlob.begin(), accountBlob.end(), std::default_random_engine(seed));
|
||||
std::shuffle(accountBlob.begin(), accountBlob.end(), randomEngine);
|
||||
backend->writeLedgerObject(std::string{accountIndexBlob}, lgrInfoNext.seq, std::string{accountBlob});
|
||||
|
||||
ASSERT_TRUE(backend->finishWrites(lgrInfoNext.seq));
|
||||
@@ -560,7 +561,6 @@ TEST_F(BackendCassandraTest, Basic)
|
||||
auto generateAccountTx = [&](uint32_t ledgerSequence, auto txns) {
|
||||
std::vector<AccountTransactionsData> ret;
|
||||
auto accounts = generateAccounts(ledgerSequence, 10);
|
||||
std::srand(std::time(nullptr));
|
||||
uint32_t idx = 0;
|
||||
for (auto& [hash, txn, meta] : txns) {
|
||||
AccountTransactionsData data;
|
||||
@@ -568,17 +568,16 @@ TEST_F(BackendCassandraTest, Basic)
|
||||
data.transactionIndex = idx;
|
||||
data.txHash = hash;
|
||||
for (size_t i = 0; i < 3; ++i) {
|
||||
data.accounts.insert(accounts[std::rand() % accounts.size()]);
|
||||
data.accounts.insert(accounts[util::Random::uniform(0ul, accounts.size() - 1)]);
|
||||
}
|
||||
++idx;
|
||||
ret.push_back(data);
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
auto generateNextLedger = [seed](auto lgrInfo) {
|
||||
auto generateNextLedger = [this](auto lgrInfo) {
|
||||
++lgrInfo.seq;
|
||||
lgrInfo.parentHash = lgrInfo.hash;
|
||||
static auto randomEngine = std::default_random_engine(seed);
|
||||
std::shuffle(lgrInfo.txHash.begin(), lgrInfo.txHash.end(), randomEngine);
|
||||
std::shuffle(lgrInfo.accountHash.begin(), lgrInfo.accountHash.end(), randomEngine);
|
||||
std::shuffle(lgrInfo.hash.begin(), lgrInfo.hash.end(), randomEngine);
|
||||
@@ -967,8 +966,6 @@ TEST_F(BackendCassandraTest, CacheIntegration)
|
||||
obj = backend->fetchLedgerObject(key256, lgrInfoOld.seq - 1, yield);
|
||||
EXPECT_FALSE(obj);
|
||||
}
|
||||
// obtain a time-based seed:
|
||||
unsigned const seed = std::chrono::system_clock::now().time_since_epoch().count();
|
||||
std::string accountBlobOld = accountBlob;
|
||||
{
|
||||
backend->startWrites();
|
||||
@@ -979,7 +976,7 @@ TEST_F(BackendCassandraTest, CacheIntegration)
|
||||
lgrInfoNext.accountHash = ~(lgrInfoNext.accountHash ^ lgrInfoNext.txHash);
|
||||
|
||||
backend->writeLedger(lgrInfoNext, ledgerInfoToBinaryString(lgrInfoNext));
|
||||
std::shuffle(accountBlob.begin(), accountBlob.end(), std::default_random_engine(seed));
|
||||
std::shuffle(accountBlob.begin(), accountBlob.end(), randomEngine);
|
||||
auto key = ripple::uint256::fromVoidChecked(accountIndexBlob);
|
||||
backend->cache().update({{*key, {accountBlob.begin(), accountBlob.end()}}}, lgrInfoNext.seq);
|
||||
backend->writeLedgerObject(std::string{accountIndexBlob}, lgrInfoNext.seq, std::string{accountBlob});
|
||||
@@ -1065,10 +1062,9 @@ TEST_F(BackendCassandraTest, CacheIntegration)
|
||||
return objs;
|
||||
};
|
||||
|
||||
auto generateNextLedger = [seed](auto lgrInfo) {
|
||||
auto generateNextLedger = [this](auto lgrInfo) {
|
||||
++lgrInfo.seq;
|
||||
lgrInfo.parentHash = lgrInfo.hash;
|
||||
static auto randomEngine = std::default_random_engine(seed);
|
||||
std::shuffle(lgrInfo.txHash.begin(), lgrInfo.txHash.end(), randomEngine);
|
||||
std::shuffle(lgrInfo.accountHash.begin(), lgrInfo.accountHash.end(), randomEngine);
|
||||
std::shuffle(lgrInfo.hash.begin(), lgrInfo.hash.end(), randomEngine);
|
||||
|
||||
Reference in New Issue
Block a user