xrpld
Loading...
Searching...
No Matches
Database.h
1#pragma once
2
3#include <xrpl/basics/Blob.h>
4#include <xrpl/basics/TaggedCache.ipp> // IWYU pragma: keep
5#include <xrpl/basics/base_uint.h>
6#include <xrpl/beast/utility/Journal.h>
7#include <xrpl/beast/utility/instrumentation.h>
8#include <xrpl/json/json_value.h>
9#include <xrpl/nodestore/Backend.h>
10#include <xrpl/nodestore/NodeObject.h>
11#include <xrpl/nodestore/Scheduler.h>
12
13#include <atomic>
14#include <condition_variable>
15#include <cstdint>
16#include <functional>
17#include <map>
18#include <memory>
19#include <mutex>
20#include <string>
21#include <utility>
22#include <vector>
23
24namespace xrpl {
25class Section;
26} // namespace xrpl
27
28namespace xrpl::node_store {
29
45{
46public:
47 Database() = delete;
48
57 Database(Scheduler& scheduler, int readThreads, Section const& config, beast::Journal j);
58
64 virtual ~Database();
65
71 virtual std::string
72 getName() const = 0;
73
77 virtual void
79
84 virtual std::int32_t
85 getWriteLoad() const = 0;
86
100 virtual void
101 store(NodeObjectType type, Blob&& data, uint256 const& hash, std::uint32_t ledgerSeq) = 0;
102
115 virtual bool
117
118 virtual void
119 sync() = 0;
120
135 uint256 const& hash,
136 std::uint32_t ledgerSeq = 0,
138 bool duplicate = false);
139
153 virtual void
155 uint256 const& hash,
156 std::uint32_t ledgerSeq,
157 std::function<void(std::shared_ptr<NodeObject> const&)>&& callback);
158
162 virtual void
163 sweep() = 0;
164
172 {
173 return storeCount_;
174 }
175
178 {
179 return fetchTotalCount_;
180 }
181
184 {
185 return fetchHitCount_;
186 }
187
190 {
191 return storeSz_;
192 }
193
196 {
197 return fetchSz_;
198 }
199
200 void
202
206 int
208 {
209 return fdRequired_;
210 }
211
212 virtual void
213 stop();
214
215 bool
216 isStopping() const;
217
221 [[nodiscard]] std::uint32_t
222 earliestLedgerSeq() const noexcept
223 {
224 return earliestLedgerSeq_;
225 }
226
227protected:
231
234
235 // The default is XRP_LEDGER_EARLIEST_SEQ (32570) to match the XRP ledger
236 // network's earliest allowed ledger sequence. Can be set through the
237 // configuration file using the 'earliest_seq' field under the 'node_db'
238 // stanza. If specified, the value must be greater than zero.
239 // Only unit tests or alternate
240 // networks should change this value.
242
243 // The maximum number of requests a thread extracts from the queue in an
244 // attempt to minimize the overhead of mutex acquisition. This is an
245 // advanced tunable, via the config file. The default value is 4.
246 int const requestBundle_;
247
248 void
250 {
251 XRPL_ASSERT(count <= sz, "xrpl::node_store::Database::storeStats : valid inputs");
252 storeCount_ += count;
253 storeSz_ += sz;
254 }
255
256 // Called by the public import function
257 void
258 importInternal(Backend& dstBackend, Database& srcDB);
259
260 void
261 updateFetchMetrics(uint64_t fetches, uint64_t hits, uint64_t duration)
262 {
263 fetchTotalCount_ += fetches;
264 fetchHitCount_ += hits;
265 fetchDurationUs_ += duration;
266 }
267
268private:
274
277
278 // reads to do
279 std::map<
280 uint256,
284
288
291 uint256 const& hash,
292 std::uint32_t ledgerSeq,
293 FetchReport& fetchReport,
294 bool duplicate) = 0;
295
304 virtual void
306
307 void
309};
310
311} // namespace xrpl::node_store
A generic endpoint for log messages.
Definition Journal.h:44
Represents a JSON value.
Definition json_value.h:117
Holds a collection of configuration values.
Definition BasicConfig.h:29
A backend used for the NodeStore.
Definition Backend.h:29
Persistency layer for NodeObject.
Definition Database.h:45
std::atomic< std::uint64_t > storeDurationUs_
Definition Database.h:273
std::atomic< std::uint64_t > storeSz_
Definition Database.h:270
std::uint32_t earliestLedgerSeq() const noexcept
Definition Database.h:222
std::atomic< int > readThreads_
Definition Database.h:286
virtual std::int32_t getWriteLoad() const =0
Retrieve the estimated number of pending write operations.
std::atomic< bool > readStopping_
Definition Database.h:285
std::atomic< std::uint64_t > fetchDurationUs_
Definition Database.h:272
std::uint64_t getStoreSize() const
Definition Database.h:189
virtual std::string getName() const =0
Retrieve the name associated with this backend.
std::atomic< std::uint64_t > storeCount_
Definition Database.h:269
virtual void sweep()=0
Remove expired entries from the positive and negative caches.
int fdRequired() const
Returns the number of file descriptors the database expects to need.
Definition Database.h:207
virtual void store(NodeObjectType type, Blob &&data, uint256 const &hash, std::uint32_t ledgerSeq)=0
Store the object.
virtual ~Database()
Destroy the node store.
std::uint32_t getFetchSize() const
Definition Database.h:195
std::uint32_t getFetchHitCount() const
Definition Database.h:183
virtual std::shared_ptr< NodeObject > fetchNodeObject(uint256 const &hash, std::uint32_t ledgerSeq, FetchReport &fetchReport, bool duplicate)=0
std::uint32_t const earliestLedgerSeq_
Definition Database.h:241
std::atomic< int > runningThreads_
Definition Database.h:287
virtual void forEach(std::function< void(std::shared_ptr< NodeObject >)> f)=0
Visit every object in the database This is usually called during import.
void storeStats(std::uint64_t count, std::uint64_t sz)
Definition Database.h:249
void importInternal(Backend &dstBackend, Database &srcDB)
std::atomic< std::uint64_t > fetchTotalCount_
Definition Database.h:271
std::uint32_t getFetchTotalCount() const
Definition Database.h:177
void updateFetchMetrics(uint64_t fetches, uint64_t hits, uint64_t duration)
Definition Database.h:261
std::uint64_t getStoreCount() const
Gather statistics pertaining to read and write activities.
Definition Database.h:171
virtual bool isSameDB(std::uint32_t s1, std::uint32_t s2)=0
Check if two ledgers are in the same database.
beast::Journal const j_
Definition Database.h:228
std::condition_variable readCondVar_
Definition Database.h:276
std::atomic< std::uint32_t > fetchSz_
Definition Database.h:233
std::shared_ptr< NodeObject > fetchNodeObject(uint256 const &hash, std::uint32_t ledgerSeq=0, FetchType fetchType=FetchType::Synchronous, bool duplicate=false)
Fetch a node object.
virtual void importDatabase(Database &source)=0
Import objects from another database.
virtual void asyncFetch(uint256 const &hash, std::uint32_t ledgerSeq, std::function< void(std::shared_ptr< NodeObject > const &)> &&callback)
Fetch an object without waiting.
std::atomic< std::uint32_t > fetchHitCount_
Definition Database.h:232
std::map< uint256, std::vector< std::pair< std::uint32_t, std::function< void(std::shared_ptr< NodeObject > const &)> > > > read_
Definition Database.h:283
Scheduling for asynchronous backend activity.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
NodeObjectType
The types of node objects.
Definition NodeObject.h:18
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition Blob.h:11
BaseUInt< 256 > uint256
Definition base_uint.h:580
Contains information about a fetch operation.