mirror of
https://github.com/XRPLF/rippled.git
synced 2026-10-05 03:08:08 +00:00
sweep() started one thread per cache partition, and the partition count defaults to the host's core count, so a sweep of one cache started one thread per core. Several caches are swept per timer tick, so the churn multiplied by the number of caches. Cap the workers instead of the partitions. sweep() now starts min(partitions, kMaxSweepThreads) of them, and worker w takes partitions w, w + workerCount, w + 2 * workerCount and so on, which covers every partition exactly once. sweepHelper decided what one partition's sweep does and also wrapped it in a std::thread. Split those: sweepPartition returns void and runs in the calling thread, and sweep() alone owns thread creation. Both overloads change the same way; the sweeping logic is untouched. Fewer workers means the exclusive cache lock is held for longer, since sweep() joins inside it. That trade is unmeasured. Add gtest cases for the cap, and for eviction reaching every partition on both the key/value and key-only caches.
Basics
Utility functions and classes.
The module xrpl/basics should contain no dependencies on other modules.
Choosing an xrpld container.
-
std::vector- For ordered containers with most insertions or erases at the end.
-
std::deque- For ordered containers with most insertions or erases at the start or end.
-
std::list- For ordered containers with inserts and erases to the middle.
- For containers with iterators stable over insert and erase.
- Generally slower and bigger than
std::vectororstd::dequeexcept for those cases.
-
std::set- For sorted containers.
-
xrpl::hash_set- Where inserts and contains need to be O(1).
- For "small" sets,
std::setmight be faster and smaller.
-
xrpl::hardened_hash_set- For data sets where the key could be manipulated by an attacker in an attempt to mount an algorithmic complexity attack: see http://en.wikipedia.org/wiki/Algorithmic_complexity_attack
The following container is deprecated
std::unordered_set- Use
xrpl::hash_setinstead, which uses a better hashing algorithm. - Or use
xrpl::hardened_hash_setto prevent algorithmic complexity attacks.