rippled
SHAMap.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_SHAMAP_SHAMAP_H_INCLUDED
21 #define RIPPLE_SHAMAP_SHAMAP_H_INCLUDED
22 
23 #include <ripple/basics/UnorderedContainers.h>
24 #include <ripple/beast/utility/Journal.h>
25 #include <ripple/nodestore/Database.h>
26 #include <ripple/nodestore/NodeObject.h>
27 #include <ripple/shamap/Family.h>
28 #include <ripple/shamap/FullBelowCache.h>
29 #include <ripple/shamap/SHAMapAddNode.h>
30 #include <ripple/shamap/SHAMapInnerNode.h>
31 #include <ripple/shamap/SHAMapItem.h>
32 #include <ripple/shamap/SHAMapLeafNode.h>
33 #include <ripple/shamap/SHAMapMissingNode.h>
34 #include <ripple/shamap/SHAMapTreeNode.h>
35 #include <ripple/shamap/TreeNodeCache.h>
36 #include <cassert>
37 #include <stack>
38 #include <vector>
39 
40 namespace ripple {
41 
42 class SHAMapNodeID;
43 class SHAMapSyncFilter;
44 
46 enum class SHAMapState {
51  Modifying = 0,
52 
57  Immutable = 1,
58 
63  Synching = 2,
64 
69  Invalid = 3,
70 };
71 
95 class SHAMap
96 {
97 private:
100 
103 
106 
110  bool backed_ = true; // Map is backed by the database
111  mutable bool full_ = false; // Map is believed complete in database
112 
113 public:
116  static inline constexpr unsigned int branchFactor =
118 
120  static inline constexpr unsigned int leafDepth = 64;
121 
122  using DeltaItem = std::pair<
126 
127  SHAMap(SHAMap const&) = delete;
128  SHAMap&
129  operator=(SHAMap const&) = delete;
130 
131  // build new map
132  SHAMap(SHAMapType t, Family& f);
133 
134  SHAMap(SHAMapType t, uint256 const& hash, Family& f);
135 
136  ~SHAMap() = default;
137 
138  Family const&
139  family() const
140  {
141  return f_;
142  }
143 
144  Family&
146  {
147  return f_;
148  }
149 
150  //--------------------------------------------------------------------------
151 
156  class const_iterator;
157 
159  begin() const;
161  end() const;
162 
163  //--------------------------------------------------------------------------
164 
165  // Returns a new map that's a snapshot of this one.
166  // Handles copy on write for mutable snapshots.
168  snapShot(bool isMutable) const;
169 
170  /* Mark this SHAMap as "should be full", indicating
171  that the local server wants all the corresponding nodes
172  in durable storage.
173  */
174  void
175  setFull();
176 
177  void
179 
180  bool
181  fetchRoot(SHAMapHash const& hash, SHAMapSyncFilter* filter);
182 
183  // normal hash access functions
184 
186  bool
187  hasItem(uint256 const& id) const;
188 
189  bool
190  delItem(uint256 const& id);
191 
192  bool
193  addItem(SHAMapNodeType type, SHAMapItem&& i);
194 
195  SHAMapHash
196  getHash() const;
197 
198  // save a copy if you have a temporary anyway
199  bool
201 
202  bool
204 
205  // Save a copy if you need to extend the life
206  // of the SHAMapItem beyond this SHAMap
208  peekItem(uint256 const& id) const;
210  peekItem(uint256 const& id, SHAMapHash& hash) const;
211 
212  // traverse functions
214  upper_bound(uint256 const& id) const;
215 
221  void
222  visitNodes(std::function<bool(SHAMapTreeNode&)> const& function) const;
223 
230  void
232  SHAMap const* have,
233  std::function<bool(SHAMapTreeNode const&)>) const;
234 
239  void
240  visitLeaves(
242  const;
243 
244  // comparison/sync functions
245 
257  getMissingNodes(int maxNodes, SHAMapSyncFilter* filter);
258 
259  bool
260  getNodeFat(
261  SHAMapNodeID const& wanted,
262  std::vector<SHAMapNodeID>& nodeIDs,
263  std::vector<Blob>& rawNodes,
264  bool fatLeaves,
265  std::uint32_t depth) const;
266 
268  void
269  serializeRoot(Serializer& s) const;
270 
272  addRootNode(
273  SHAMapHash const& hash,
274  Slice const& rootNode,
275  SHAMapSyncFilter* filter);
277  addKnownNode(
278  SHAMapNodeID const& nodeID,
279  Slice const& rawNode,
280  SHAMapSyncFilter* filter);
281 
282  // status functions
283  void
284  setImmutable();
285  bool
286  isSynching() const;
287  void
288  setSynching();
289  void
290  clearSynching();
291  bool
292  isValid() const;
293 
294  // caution: otherMap must be accessed only by this function
295  // return value: true=successfully completed, false=too different
296  bool
297  compare(SHAMap const& otherMap, Delta& differences, int maxCount) const;
298 
300  int
301  unshare();
302 
304  int
306 
307  void
308  walkMap(std::vector<SHAMapMissingNode>& missingNodes, int maxMissing) const;
309  bool
310  deepCompare(SHAMap& other) const; // Intended for debug/test only
311 
312  void
313  setUnbacked();
314 
315  void
316  dump(bool withHashes = false) const;
317  void
318  invariants() const;
319 
320 private:
321  using SharedPtrNodeStack =
323  using DeltaRef = std::pair<
326 
327  // tree node cache operations
329  cacheLookup(SHAMapHash const& hash) const;
330  void
332  const;
333 
334  // database operations
336  fetchNodeFromDB(SHAMapHash const& hash) const;
338  fetchNodeNT(SHAMapHash const& hash) const;
340  fetchNodeNT(SHAMapHash const& hash, SHAMapSyncFilter* filter) const;
342  fetchNode(SHAMapHash const& hash) const;
344  checkFilter(SHAMapHash const& hash, SHAMapSyncFilter* filter) const;
345 
347  void
348  dirtyUp(
349  SharedPtrNodeStack& stack,
350  uint256 const& target,
352 
357  walkTowardsKey(uint256 const& id, SharedPtrNodeStack* stack = nullptr)
358  const;
361  findKey(uint256 const& id) const;
362 
364  template <class Node>
367 
369  template <class Node>
372 
376 
378  firstBelow(
380  SharedPtrNodeStack& stack,
381  int branch = 0) const;
382 
383  // Simple descent
384  // Get a child of the specified node
386  descend(SHAMapInnerNode*, int branch) const;
388  descendThrow(SHAMapInnerNode*, int branch) const;
390  descend(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
392  descendThrow(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
393 
394  // Descend with filter
396  descendAsync(
397  SHAMapInnerNode* parent,
398  int branch,
399  SHAMapSyncFilter* filter,
400  bool& pending) const;
401 
403  descend(
404  SHAMapInnerNode* parent,
405  SHAMapNodeID const& parentID,
406  int branch,
407  SHAMapSyncFilter* filter) const;
408 
409  // Non-storing
410  // Does not hook the returned node to its parent
412  descendNoStore(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
413 
416  onlyBelow(SHAMapTreeNode*) const;
417 
418  bool
419  hasInnerNode(SHAMapNodeID const& nodeID, SHAMapHash const& hash) const;
420  bool
421  hasLeafNode(uint256 const& tag, SHAMapHash const& hash) const;
422 
423  SHAMapLeafNode const*
424  peekFirstItem(SharedPtrNodeStack& stack) const;
425  SHAMapLeafNode const*
426  peekNextItem(uint256 const& id, SharedPtrNodeStack& stack) const;
427  bool
428  walkBranch(
429  SHAMapTreeNode* node,
430  std::shared_ptr<SHAMapItem const> const& otherMapItem,
431  bool isFirstMap,
432  Delta& differences,
433  int& maxCount) const;
434  int
435  walkSubTree(bool doWrite, NodeObjectType t);
436 
437  // Structure to track information about call to
438  // getMissingNodes while it's in progress
440  {
441  MissingNodes() = delete;
442  MissingNodes(const MissingNodes&) = delete;
443  MissingNodes&
444  operator=(const MissingNodes&) = delete;
445 
446  // basic parameters
447  int max_;
449  int const maxDefer_;
451 
452  // nodes we have discovered to be missing
455 
456  // nodes we are in the process of traversing
457  using StackEntry = std::tuple<
458  SHAMapInnerNode*, // pointer to the node
459  SHAMapNodeID, // the node's ID
460  int, // while child we check first
461  int, // which child we check next
462  bool>; // whether we've found any missing children yet
463 
464  // We explicitly choose to specify the use of std::deque here, because
465  // we need to ensure that pointers and/or references to existing
466  // elements will not be invalidated during the course of element
467  // insertion and removal. Containers that do not offer this guarantee,
468  // such as std::vector, can't be used here.
470 
471  // nodes we may acquire from deferred reads
474 
475  // nodes we need to resume after we get their children from deferred
476  // reads
478 
480  int max,
481  SHAMapSyncFilter* filter,
482  int maxDefer,
483  std::uint32_t generation)
484  : max_(max)
485  , filter_(filter)
486  , maxDefer_(maxDefer)
487  , generation_(generation)
488  {
489  missingNodes_.reserve(max);
490  deferredReads_.reserve(maxDefer);
491  }
492  };
493 
494  // getMissingNodes helper functions
495  void
496  gmn_ProcessNodes(MissingNodes&, MissingNodes::StackEntry& node);
497  void
498  gmn_ProcessDeferredReads(MissingNodes&);
499 };
500 
501 inline void
503 {
504  full_ = true;
505 }
506 
507 inline void
509 {
510  ledgerSeq_ = lseq;
511 }
512 
513 inline void
515 {
516  assert(state_ != SHAMapState::Invalid);
518 }
519 
520 inline bool
522 {
523  return state_ == SHAMapState::Synching;
524 }
525 
526 inline void
528 {
530 }
531 
532 inline void
534 {
536 }
537 
538 inline bool
540 {
541  return state_ != SHAMapState::Invalid;
542 }
543 
544 inline void
546 {
547  backed_ = false;
548 }
549 
550 //------------------------------------------------------------------------------
551 
553 {
554 public:
558  using reference = value_type const&;
559  using pointer = value_type const*;
560 
561 private:
563  SHAMap const* map_ = nullptr;
564  pointer item_ = nullptr;
565 
566 public:
567  const_iterator() = default;
568 
569  reference
570  operator*() const;
571  pointer
572  operator->() const;
573 
575  operator++();
577  operator++(int);
578 
579 private:
580  explicit const_iterator(SHAMap const* map);
581  const_iterator(SHAMap const* map, pointer item);
582  const_iterator(SHAMap const* map, pointer item, SharedPtrNodeStack&& stack);
583 
584  friend bool
585  operator==(const_iterator const& x, const_iterator const& y);
586  friend class SHAMap;
587 };
588 
590  : map_(map), item_(nullptr)
591 {
592  auto temp = map_->peekFirstItem(stack_);
593  if (temp)
594  item_ = temp->peekItem().get();
595 }
596 
598  : map_(map), item_(item)
599 {
600 }
601 
603  SHAMap const* map,
604  pointer item,
605  SharedPtrNodeStack&& stack)
606  : stack_(std::move(stack)), map_(map), item_(item)
607 {
608 }
609 
612 {
613  return *item_;
614 }
615 
618 {
619  return item_;
620 }
621 
624 {
625  auto temp = map_->peekNextItem(item_->key(), stack_);
626  if (temp)
627  item_ = temp->peekItem().get();
628  else
629  item_ = nullptr;
630  return *this;
631 }
632 
635 {
636  auto tmp = *this;
637  ++(*this);
638  return tmp;
639 }
640 
641 inline bool
643 {
644  assert(x.map_ == y.map_);
645  return x.item_ == y.item_;
646 }
647 
648 inline bool
650 {
651  return !(x == y);
652 }
653 
654 inline SHAMap::const_iterator
656 {
657  return const_iterator(this);
658 }
659 
661 SHAMap::end() const
662 {
663  return const_iterator(this, nullptr);
664 }
665 
666 } // namespace ripple
667 
668 #endif
ripple::SHAMap::MissingNodes
Definition: SHAMap.h:439
ripple::SHAMapAddNode
Definition: SHAMapAddNode.h:28
ripple::SHAMap::visitDifferences
void visitDifferences(SHAMap const *have, std::function< bool(SHAMapTreeNode const &)>) const
Visit every node in this SHAMap that is not present in the specified SHAMap.
Definition: SHAMapSync.cpp:101
ripple::SHAMap::invariants
void invariants() const
Definition: SHAMap.cpp:1114
ripple::SHAMap::clearSynching
void clearSynching()
Definition: SHAMap.h:533
ripple::SHAMap::isValid
bool isValid() const
Definition: SHAMap.h:539
ripple::SHAMap::branchFactor
static constexpr unsigned int branchFactor
Number of children each non-leaf node has (the 'radix tree' part of the map)
Definition: SHAMap.h:116
ripple::SHAMap::descendNoStore
std::shared_ptr< SHAMapTreeNode > descendNoStore(std::shared_ptr< SHAMapInnerNode > const &, int branch) const
Definition: SHAMap.cpp:333
ripple::SHAMap::SHAMap
SHAMap(SHAMap const &)=delete
ripple::SHAMap::peekNextItem
SHAMapLeafNode const * peekNextItem(uint256 const &id, SharedPtrNodeStack &stack) const
Definition: SHAMap.cpp:527
ripple::Dir::const_iterator
Definition: Directory.h:49
std::shared_ptr
STL class.
ripple::SHAMap::getHash
SHAMapHash getHash() const
Definition: SHAMap.cpp:778
ripple::SHAMap::backed_
bool backed_
Definition: SHAMap.h:110
ripple::SHAMap::type_
const SHAMapType type_
Definition: SHAMap.h:109
ripple::SHAMap::deepCompare
bool deepCompare(SHAMap &other) const
Definition: SHAMapSync.cpp:667
ripple::SHAMap::MissingNodes::stack_
std::stack< StackEntry, std::deque< StackEntry > > stack_
Definition: SHAMap.h:469
ripple::SHAMap::hasInnerNode
bool hasInnerNode(SHAMapNodeID const &nodeID, SHAMapHash const &hash) const
Does this map have this inner node?
Definition: SHAMapSync.cpp:739
ripple::SHAMap::family
Family const & family() const
Definition: SHAMap.h:139
ripple::SHAMap::fetchNodeFromDB
std::shared_ptr< SHAMapTreeNode > fetchNodeFromDB(SHAMapHash const &hash) const
Definition: SHAMap.cpp:163
ripple::SHAMap::addItem
bool addItem(SHAMapNodeType type, SHAMapItem &&i)
Definition: SHAMap.cpp:772
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:44
std::pair
ripple::SHAMap::MissingNodes::MissingNodes
MissingNodes(int max, SHAMapSyncFilter *filter, int maxDefer, std::uint32_t generation)
Definition: SHAMap.h:479
ripple::SHAMap::walkSubTree
int walkSubTree(bool doWrite, NodeObjectType t)
Definition: SHAMap.cpp:925
ripple::SHAMap::dump
void dump(bool withHashes=false) const
Definition: SHAMap.cpp:1050
ripple::SHAMap::const_iterator::stack_
SharedPtrNodeStack stack_
Definition: SHAMap.h:562
vector
ripple::NodeObjectType
NodeObjectType
The types of node objects.
Definition: NodeObject.h:32
ripple::SHAMap::onlyBelow
std::shared_ptr< SHAMapItem const > const & onlyBelow(SHAMapTreeNode *) const
If there is only one leaf below this node, get its contents.
Definition: SHAMap.cpp:477
ripple::SHAMapNodeType
SHAMapNodeType
Definition: SHAMapTreeNode.h:126
ripple::SHAMap::MissingNodes::maxDefer_
const int maxDefer_
Definition: SHAMap.h:449
ripple::SHAMap::MissingNodes::generation_
std::uint32_t generation_
Definition: SHAMap.h:450
stack
ripple::SHAMap::peekItem
std::shared_ptr< SHAMapItem const > const & peekItem(uint256 const &id) const
Definition: SHAMap.cpp:556
ripple::SHAMap::serializeRoot
void serializeRoot(Serializer &s) const
Serializes the root in a format appropriate for sending over the wire.
Definition: SHAMapSync.cpp:523
ripple::SHAMap::fetchNode
std::shared_ptr< SHAMapTreeNode > fetchNode(SHAMapHash const &hash) const
Definition: SHAMap.cpp:265
std::forward_iterator_tag
ripple::SHAMap::fetchNodeNT
std::shared_ptr< SHAMapTreeNode > fetchNodeNT(SHAMapHash const &hash) const
Definition: SHAMap.cpp:253
ripple::SHAMap::Delta
std::map< uint256, DeltaItem > Delta
Definition: SHAMap.h:125
ripple::SHAMapInnerNode::branchFactor
static constexpr unsigned int branchFactor
Each inner node has 16 children (the 'radix tree' part of the map)
Definition: SHAMapInnerNode.h:44
std::tuple
ripple::SHAMapState::Modifying
@ Modifying
The map is in flux and objects can be added and removed.
ripple::SHAMap::begin
const_iterator begin() const
Definition: SHAMap.h:655
std::function
ripple::SHAMapNodeID
Identifies a node inside a SHAMap.
Definition: SHAMapNodeID.h:33
ripple::SHAMap::MissingNodes::filter_
SHAMapSyncFilter * filter_
Definition: SHAMap.h:448
ripple::SHAMap::snapShot
std::shared_ptr< SHAMap > snapShot(bool isMutable) const
Definition: SHAMap.cpp:70
ripple::Dir::const_iterator::pointer
value_type const * pointer
Definition: Directory.h:53
ripple::SHAMap::gmn_ProcessNodes
void gmn_ProcessNodes(MissingNodes &, MissingNodes::StackEntry &node)
Definition: SHAMapSync.cpp:173
ripple::const_iterator
Dir::const_iterator const_iterator
Definition: Directory.cpp:25
ripple::SHAMap::cacheLookup
std::shared_ptr< SHAMapTreeNode > cacheLookup(SHAMapHash const &hash) const
Definition: SHAMap.cpp:1093
ripple::SHAMap::const_iterator::operator->
pointer operator->() const
Definition: SHAMap.h:617
ripple::SHAMapLeafNode
Definition: SHAMapLeafNode.h:32
ripple::SHAMap::setFull
void setFull()
Definition: SHAMap.h:502
ripple::SHAMapHash
Definition: SHAMapTreeNode.h:47
ripple::SHAMapState::Synching
@ Synching
The map's hash is fixed but valid nodes may be missing and can be added.
ripple::operator==
bool operator==(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:155
ripple::SHAMap::f_
Family & f_
Definition: SHAMap.h:98
ripple::SHAMap::descendAsync
SHAMapTreeNode * descendAsync(SHAMapInnerNode *parent, int branch, SHAMapSyncFilter *filter, bool &pending) const
Definition: SHAMap.cpp:373
ripple::base_uint< 256 >
ripple::SHAMap::MissingNodes::resumes_
std::map< SHAMapInnerNode *, SHAMapNodeID > resumes_
Definition: SHAMap.h:477
ripple::SHAMap::hasItem
bool hasItem(uint256 const &id) const
Does the tree have an item with the given ID?
Definition: SHAMap.cpp:619
ripple::SHAMap::const_iterator::operator==
friend bool operator==(const_iterator const &x, const_iterator const &y)
Definition: SHAMap.h:642
ripple::SHAMap::MissingNodes::deferredReads_
std::vector< std::tuple< SHAMapInnerNode *, SHAMapNodeID, int > > deferredReads_
Definition: SHAMap.h:473
ripple::SHAMap::hasLeafNode
bool hasLeafNode(uint256 const &tag, SHAMapHash const &hash) const
Does this map have this leaf node?
Definition: SHAMapSync.cpp:763
ripple::SHAMap::operator=
SHAMap & operator=(SHAMap const &)=delete
ripple::SHAMapInnerNode
Definition: SHAMapInnerNode.h:39
ripple::SHAMap::peekFirstItem
SHAMapLeafNode const * peekFirstItem(SharedPtrNodeStack &stack) const
Definition: SHAMap.cpp:513
ripple::SHAMap::MissingNodes::max_
int max_
Definition: SHAMap.h:447
ripple::SHAMap::visitLeaves
void visitLeaves(std::function< void(std::shared_ptr< SHAMapItem const > const &)> const &) const
Visit every leaf node in this SHAMap.
Definition: SHAMapSync.cpp:27
ripple::SHAMapItem
Definition: SHAMapItem.h:35
ripple::SHAMap::isSynching
bool isSynching() const
Definition: SHAMap.h:521
ripple::SHAMap::const_iterator
Definition: SHAMap.h:552
ripple::SHAMap::firstBelow
SHAMapLeafNode * firstBelow(std::shared_ptr< SHAMapTreeNode >, SharedPtrNodeStack &stack, int branch=0) const
Definition: SHAMap.cpp:435
ripple::SHAMap
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
Definition: SHAMap.h:95
ripple::SHAMap::const_iterator::operator++
const_iterator & operator++()
Definition: SHAMap.h:623
ripple::operator!=
bool operator!=(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:165
ripple::SHAMap::MissingNodes::StackEntry
std::tuple< SHAMapInnerNode *, SHAMapNodeID, int, int, bool > StackEntry
Definition: SHAMap.h:462
ripple::SHAMapTreeNode
Definition: SHAMapTreeNode.h:133
ripple::SHAMap::descendThrow
SHAMapTreeNode * descendThrow(SHAMapInnerNode *, int branch) const
Definition: SHAMap.cpp:276
ripple::SHAMap::~SHAMap
~SHAMap()=default
ripple::SHAMap::journal_
beast::Journal journal_
Definition: SHAMap.h:99
ripple::SHAMap::canonicalize
void canonicalize(SHAMapHash const &hash, std::shared_ptr< SHAMapTreeNode > &) const
Definition: SHAMap.cpp:1101
ripple::SHAMap::MissingNodes::missingHashes_
std::set< SHAMapHash > missingHashes_
Definition: SHAMap.h:454
ripple::Family
Definition: Family.h:32
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::SHAMap::const_iterator::item_
pointer item_
Definition: SHAMap.h:564
std::uint32_t
std::map
STL class.
ripple::SHAMap::setLedgerSeq
void setLedgerSeq(std::uint32_t lseq)
Definition: SHAMap.h:508
ripple::SHAMap::getMissingNodes
std::vector< std::pair< SHAMapNodeID, uint256 > > getMissingNodes(int maxNodes, SHAMapSyncFilter *filter)
Check for nodes in the SHAMap not available.
Definition: SHAMapSync.cpp:315
ripple::SHAMap::const_iterator::map_
SHAMap const * map_
Definition: SHAMap.h:563
ripple::SHAMap::fetchRoot
bool fetchRoot(SHAMapHash const &hash, SHAMapSyncFilter *filter)
Definition: SHAMap.cpp:830
ripple::SHAMap::walkMap
void walkMap(std::vector< SHAMapMissingNode > &missingNodes, int maxMissing) const
Definition: SHAMapDelta.cpp:249
ripple::Serializer
Definition: Serializer.h:39
ripple::SHAMap::upper_bound
const_iterator upper_bound(uint256 const &id) const
Definition: SHAMap.cpp:579
ripple::SHAMap::const_iterator::operator*
reference operator*() const
Definition: SHAMap.h:611
ripple::SHAMap::setImmutable
void setImmutable()
Definition: SHAMap.h:514
ripple::SHAMap::const_iterator::const_iterator
const_iterator()=default
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::SHAMap::full_
bool full_
Definition: SHAMap.h:111
ripple::SHAMap::checkFilter
std::shared_ptr< SHAMapTreeNode > checkFilter(SHAMapHash const &hash, SHAMapSyncFilter *filter) const
Definition: SHAMap.cpp:197
ripple::SHAMap::dirtyUp
void dirtyUp(SharedPtrNodeStack &stack, uint256 const &target, std::shared_ptr< SHAMapTreeNode > terminal)
Update hashes up to the root.
Definition: SHAMap.cpp:94
ripple::SHAMap::setUnbacked
void setUnbacked()
Definition: SHAMap.h:545
ripple::SHAMap::findKey
SHAMapLeafNode * findKey(uint256 const &id) const
Return nullptr if key not found.
Definition: SHAMap.cpp:154
ripple::SHAMap::updateGiveItem
bool updateGiveItem(SHAMapNodeType type, std::shared_ptr< SHAMapItem const >)
Definition: SHAMap.cpp:790
ripple::SHAMap::end
const_iterator end() const
Definition: SHAMap.h:661
ripple::SHAMap::walkTowardsKey
SHAMapLeafNode * walkTowardsKey(uint256 const &id, SharedPtrNodeStack *stack=nullptr) const
Walk towards the specified id, returning the node.
Definition: SHAMap.cpp:128
std
STL namespace.
cassert
ripple::SHAMap::addGiveItem
bool addGiveItem(SHAMapNodeType type, std::shared_ptr< SHAMapItem const > item)
Definition: SHAMap.cpp:703
ripple::SHAMap::unshare
int unshare()
Convert any modified nodes to shared.
Definition: SHAMap.cpp:911
ripple::SHAMap::writeNode
std::shared_ptr< SHAMapTreeNode > writeNode(NodeObjectType t, std::shared_ptr< SHAMapTreeNode > node) const
write and canonicalize modified node
Definition: SHAMap.cpp:876
ripple::SHAMap::leafDepth
static constexpr unsigned int leafDepth
The depth of the hash map: data is only present in the leaves.
Definition: SHAMap.h:120
ripple::SHAMap::SharedPtrNodeStack
std::stack< std::pair< std::shared_ptr< SHAMapTreeNode >, SHAMapNodeID > > SharedPtrNodeStack
Definition: SHAMap.h:322
std::ptrdiff_t
ripple::SHAMapState::Immutable
@ Immutable
The map is set in stone and cannot be changed.
ripple::SHAMap::compare
bool compare(SHAMap const &otherMap, Delta &differences, int maxCount) const
Definition: SHAMapDelta.cpp:124
ripple::SHAMapType
SHAMapType
Definition: SHAMapMissingNode.h:32
ripple::SHAMap::visitNodes
void visitNodes(std::function< bool(SHAMapTreeNode &)> const &function) const
Visit every node in this SHAMap.
Definition: SHAMapSync.cpp:39
ripple::SHAMap::gmn_ProcessDeferredReads
void gmn_ProcessDeferredReads(MissingNodes &)
Definition: SHAMapSync.cpp:254
ripple::SHAMapState::Invalid
@ Invalid
The map is known to not be valid.
ripple::SHAMap::const_iterator::pointer
value_type const * pointer
Definition: SHAMap.h:559
ripple::SHAMap::preFlushNode
std::shared_ptr< Node > preFlushNode(std::shared_ptr< Node > node) const
prepare a node to be modified before flushing
Definition: SHAMap.cpp:895
ripple::SHAMap::addKnownNode
SHAMapAddNode addKnownNode(SHAMapNodeID const &nodeID, Slice const &rawNode, SHAMapSyncFilter *filter)
Definition: SHAMapSync.cpp:571
ripple::SHAMap::flushDirty
int flushDirty(NodeObjectType t)
Flush modified nodes to the nodestore and convert them to shared.
Definition: SHAMap.cpp:918
ripple::SHAMap::unshareNode
std::shared_ptr< Node > unshareNode(std::shared_ptr< Node >, SHAMapNodeID const &nodeID)
Unshare the node, allowing it to be modified.
Definition: SHAMap.cpp:419
ripple::SHAMap::descend
SHAMapTreeNode * descend(SHAMapInnerNode *, int branch) const
Definition: SHAMap.cpp:299
ripple::SHAMap::MissingNodes::operator=
MissingNodes & operator=(const MissingNodes &)=delete
ripple::SHAMap::addRootNode
SHAMapAddNode addRootNode(SHAMapHash const &hash, Slice const &rootNode, SHAMapSyncFilter *filter)
Definition: SHAMapSync.cpp:529
ripple::SHAMap::walkBranch
bool walkBranch(SHAMapTreeNode *node, std::shared_ptr< SHAMapItem const > const &otherMapItem, bool isFirstMap, Delta &differences, int &maxCount) const
Definition: SHAMapDelta.cpp:34
ripple::Dir::const_iterator::reference
value_type const & reference
Definition: Directory.h:54
ripple::SHAMap::ledgerSeq_
std::uint32_t ledgerSeq_
The sequence of the ledger that this map references, if any.
Definition: SHAMap.h:105
ripple::SHAMap::getNodeFat
bool getNodeFat(SHAMapNodeID const &wanted, std::vector< SHAMapNodeID > &nodeIDs, std::vector< Blob > &rawNodes, bool fatLeaves, std::uint32_t depth) const
Definition: SHAMapSync.cpp:426
ripple::SHAMapSyncFilter
Definition: SHAMapSyncFilter.h:30
ripple::SHAMap::MissingNodes::missingNodes_
std::vector< std::pair< SHAMapNodeID, uint256 > > missingNodes_
Definition: SHAMap.h:453
ripple::SHAMap::delItem
bool delItem(uint256 const &id)
Definition: SHAMap.cpp:625
ripple::SHAMap::cowid_
std::uint32_t cowid_
ID to distinguish this map for all others we're sharing nodes with.
Definition: SHAMap.h:102
ripple::SHAMap::MissingNodes::MissingNodes
MissingNodes()=delete
ripple::SHAMap::state_
SHAMapState state_
Definition: SHAMap.h:108
std::set
STL class.
ripple::SHAMap::setSynching
void setSynching()
Definition: SHAMap.h:527
ripple::SHAMap::root_
std::shared_ptr< SHAMapTreeNode > root_
Definition: SHAMap.h:107
ripple::SHAMapState
SHAMapState
Describes the current state of a given SHAMap.
Definition: SHAMap.h:46
ripple::SHAMap::family
Family & family()
Definition: SHAMap.h:145
ripple::SHAMap::const_iterator::reference
value_type const & reference
Definition: SHAMap.h:558