xrpld
Loading...
Searching...
No Matches
ManagerImp.cpp
1#include <xrpl/nodestore/detail/ManagerImp.h>
2
3#include <xrpl/basics/contract.h>
4#include <xrpl/beast/utility/Journal.h>
5#include <xrpl/beast/utility/instrumentation.h>
6#include <xrpl/config/BasicConfig.h>
7#include <xrpl/config/Constants.h>
8#include <xrpl/nodestore/Backend.h>
9#include <xrpl/nodestore/Database.h>
10#include <xrpl/nodestore/Manager.h>
11#include <xrpl/nodestore/NodeObject.h>
12#include <xrpl/nodestore/Scheduler.h>
13#include <xrpl/nodestore/detail/DatabaseNodeImp.h>
14
15#include <boost/algorithm/string/predicate.hpp>
16
17#include <algorithm>
18#include <cstddef>
19#include <memory>
20#include <mutex>
21#include <stdexcept>
22#include <string>
23#include <utility>
24
25namespace xrpl::NodeStore {
26
29{
30 static ManagerImp kInst;
31 return kInst;
32}
33
34void
36{
38 "Your xrpld.cfg is missing a [node_db] entry, "
39 "please see the xrpld-example.cfg file!");
40}
41
42// We shouldn't rely on global variables for lifetime management because their
43// lifetime is not well-defined. ManagerImp may get destroyed before the Factory
44// classes, and then, calling Manager::instance().erase() in the destructors of
45// the Factory classes is an undefined behaviour.
46void
48#if XRPL_ROCKSDB_AVAILABLE
49void
50registerRocksDBFactory(Manager& manager);
51#endif
52void
54void
56
58{
60#if XRPL_ROCKSDB_AVAILABLE
61 registerRocksDBFactory(*this);
62#endif
65}
66
69 Section const& parameters,
70 std::size_t burstSize,
71 Scheduler& scheduler,
72 beast::Journal journal)
73{
74 std::string const type{get(parameters, Keys::kType)};
75 if (type.empty())
77
78 auto factory{find(type)};
79 if (factory == nullptr)
80 {
82 }
83
84 return factory->createInstance(
85 NodeObject::kKeyBytes, parameters, burstSize, scheduler, journal);
86}
87
90 std::size_t burstSize,
91 Scheduler& scheduler,
92 int readThreads,
93 Section const& config,
94 beast::Journal journal)
95{
96 auto backend{makeBackend(config, burstSize, scheduler, journal)};
97 backend->open();
99 scheduler, readThreads, std::move(backend), config, journal);
100}
101
102void
104{
105 std::scoped_lock const _(mutex_);
106 list_.push_back(&factory);
107}
108
109void
111{
112 std::scoped_lock const _(mutex_);
113 auto const iter =
114 std::ranges::find_if(list_, [&factory](Factory* other) { return other == &factory; });
115 XRPL_ASSERT(iter != list_.end(), "xrpl::NodeStore::ManagerImp::erase : valid input");
116 list_.erase(iter);
117}
118
119Factory*
121{
122 std::scoped_lock const _(mutex_);
123 auto const iter = std::ranges::find_if(
124 list_, [&name](Factory* other) { return boost::iequals(name, other->getName()); });
125 if (iter == list_.end())
126 return nullptr;
127 return *iter;
128}
129
130//------------------------------------------------------------------------------
131
132Manager&
134{
135 return ManagerImp::instance();
136}
137
138} // namespace xrpl::NodeStore
A generic endpoint for log messages.
Definition Journal.h:38
static constexpr std::size_t kKeyBytes
Definition NodeObject.h:32
Base class for backend factories.
Definition Factory.h:17
virtual std::string getName() const =0
Retrieve the name of this factory.
void insert(Factory &factory) override
Add a factory.
void erase(Factory &factory) override
Remove a factory.
std::vector< Factory * > list_
Definition ManagerImp.h:11
std::unique_ptr< Database > makeDatabase(std::size_t burstSize, Scheduler &scheduler, int readThreads, Section const &config, beast::Journal journal) override
Construct a NodeStore database.
static ManagerImp & instance()
std::unique_ptr< Backend > makeBackend(Section const &parameters, std::size_t burstSize, Scheduler &scheduler, beast::Journal journal) override
Create a backend.
Factory * find(std::string const &name) override
Return a pointer to the matching factory if it exists.
Singleton for managing NodeStore factories and back ends.
Definition Manager.h:10
static Manager & instance()
Returns the instance of the manager singleton.
Scheduling for asynchronous backend activity.
Holds a collection of configuration values.
Definition BasicConfig.h:24
T empty(T... args)
T find_if(T... args)
T make_unique(T... args)
void registerNuDBFactory(Manager &manager)
void registerNullFactory(Manager &manager)
void registerMemoryFactory(Manager &manager)
T get(Section const &section, std::string const &name, T const &defaultValue=T{})
Retrieve a key/value pair from a section.
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:49
static constexpr auto kType
Definition Constants.h:170