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
213 
214  // finds the object in the tree with the smallest object id greater than the
215  // input id
217  upper_bound(uint256 const& id) const;
218 
219  // finds the object in the tree with the greatest object id smaller than the
220  // input id
222  lower_bound(uint256 const& id) const;
223 
229  void
230  visitNodes(std::function<bool(SHAMapTreeNode&)> const& function) const;
231 
238  void
240  SHAMap const* have,
241  std::function<bool(SHAMapTreeNode const&)>) const;
242 
247  void
248  visitLeaves(
250  const;
251 
252  // comparison/sync functions
253 
265  getMissingNodes(int maxNodes, SHAMapSyncFilter* filter);
266 
267  bool
268  getNodeFat(
269  SHAMapNodeID const& wanted,
270  std::vector<SHAMapNodeID>& nodeIDs,
271  std::vector<Blob>& rawNodes,
272  bool fatLeaves,
273  std::uint32_t depth) const;
274 
282  getProofPath(uint256 const& key) const;
283 
291  static bool
293  uint256 const& rootHash,
294  uint256 const& key,
295  std::vector<Blob> const& path);
296 
298  void
299  serializeRoot(Serializer& s) const;
300 
302  addRootNode(
303  SHAMapHash const& hash,
304  Slice const& rootNode,
305  SHAMapSyncFilter* filter);
307  addKnownNode(
308  SHAMapNodeID const& nodeID,
309  Slice const& rawNode,
310  SHAMapSyncFilter* filter);
311 
312  // status functions
313  void
314  setImmutable();
315  bool
316  isSynching() const;
317  void
318  setSynching();
319  void
320  clearSynching();
321  bool
322  isValid() const;
323 
324  // caution: otherMap must be accessed only by this function
325  // return value: true=successfully completed, false=too different
326  bool
327  compare(SHAMap const& otherMap, Delta& differences, int maxCount) const;
328 
330  int
331  unshare();
332 
334  int
336 
337  void
338  walkMap(std::vector<SHAMapMissingNode>& missingNodes, int maxMissing) const;
339  bool
341  std::vector<SHAMapMissingNode>& missingNodes,
342  int maxMissing) const;
343  bool
344  deepCompare(SHAMap& other) const; // Intended for debug/test only
345 
346  void
347  setUnbacked();
348 
349  void
350  dump(bool withHashes = false) const;
351  void
352  invariants() const;
353 
354 private:
355  using SharedPtrNodeStack =
357  using DeltaRef = std::pair<
360 
361  // tree node cache operations
363  cacheLookup(SHAMapHash const& hash) const;
364  void
366  const;
367 
368  // database operations
370  fetchNodeFromDB(SHAMapHash const& hash) const;
372  fetchNodeNT(SHAMapHash const& hash) const;
374  fetchNodeNT(SHAMapHash const& hash, SHAMapSyncFilter* filter) const;
376  fetchNode(SHAMapHash const& hash) const;
378  checkFilter(SHAMapHash const& hash, SHAMapSyncFilter* filter) const;
379 
381  void
382  dirtyUp(
383  SharedPtrNodeStack& stack,
384  uint256 const& target,
386 
391  walkTowardsKey(uint256 const& id, SharedPtrNodeStack* stack = nullptr)
392  const;
395  findKey(uint256 const& id) const;
396 
398  template <class Node>
401 
403  template <class Node>
406 
410 
411  // returns the first item at or below this node
413  firstBelow(
415  SharedPtrNodeStack& stack,
416  int branch = 0) const;
417 
418  // returns the last item at or below this node
420  lastBelow(
422  SharedPtrNodeStack& stack,
423  int branch = branchFactor) const;
424 
425  // helper function for firstBelow and lastBelow
427  belowHelper(
429  SharedPtrNodeStack& stack,
430  int branch,
431  std::tuple<
432  int,
433  std::function<bool(int)>,
434  std::function<void(int&)>> const& loopParams) const;
435 
436  // Simple descent
437  // Get a child of the specified node
439  descend(SHAMapInnerNode*, int branch) const;
441  descendThrow(SHAMapInnerNode*, int branch) const;
443  descend(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
445  descendThrow(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
446 
447  // Descend with filter
448  // If pending, callback is called as if it called fetchNodeNT
449  using descendCallback =
452  descendAsync(
453  SHAMapInnerNode* parent,
454  int branch,
455  SHAMapSyncFilter* filter,
456  bool& pending,
457  descendCallback&&) const;
458 
460  descend(
461  SHAMapInnerNode* parent,
462  SHAMapNodeID const& parentID,
463  int branch,
464  SHAMapSyncFilter* filter) const;
465 
466  // Non-storing
467  // Does not hook the returned node to its parent
469  descendNoStore(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
470 
473  onlyBelow(SHAMapTreeNode*) const;
474 
475  bool
476  hasInnerNode(SHAMapNodeID const& nodeID, SHAMapHash const& hash) const;
477  bool
478  hasLeafNode(uint256 const& tag, SHAMapHash const& hash) const;
479 
480  SHAMapLeafNode const*
481  peekFirstItem(SharedPtrNodeStack& stack) const;
482  SHAMapLeafNode const*
483  peekNextItem(uint256 const& id, SharedPtrNodeStack& stack) const;
484  bool
485  walkBranch(
486  SHAMapTreeNode* node,
487  std::shared_ptr<SHAMapItem const> const& otherMapItem,
488  bool isFirstMap,
489  Delta& differences,
490  int& maxCount) const;
491  int
492  walkSubTree(bool doWrite, NodeObjectType t);
493 
494  // Structure to track information about call to
495  // getMissingNodes while it's in progress
497  {
498  MissingNodes() = delete;
499  MissingNodes(const MissingNodes&) = delete;
500  MissingNodes&
501  operator=(const MissingNodes&) = delete;
502 
503  // basic parameters
504  int max_;
506  int const maxDefer_;
508 
509  // nodes we have discovered to be missing
512 
513  // nodes we are in the process of traversing
514  using StackEntry = std::tuple<
515  SHAMapInnerNode*, // pointer to the node
516  SHAMapNodeID, // the node's ID
517  int, // while child we check first
518  int, // which child we check next
519  bool>; // whether we've found any missing children yet
520 
521  // We explicitly choose to specify the use of std::deque here, because
522  // we need to ensure that pointers and/or references to existing
523  // elements will not be invalidated during the course of element
524  // insertion and removal. Containers that do not offer this guarantee,
525  // such as std::vector, can't be used here.
527 
528  // nodes we may have acquired from deferred reads
529  using DeferredNode = std::tuple<
530  SHAMapInnerNode*, // parent node
531  SHAMapNodeID, // parent node ID
532  int, // branch
534 
539 
540  // nodes we need to resume after we get their children from deferred
541  // reads
543 
545  int max,
546  SHAMapSyncFilter* filter,
547  int maxDefer,
548  std::uint32_t generation)
549  : max_(max)
550  , filter_(filter)
551  , maxDefer_(maxDefer)
552  , generation_(generation)
553  , deferred_(0)
554  {
555  missingNodes_.reserve(max);
556  finishedReads_.reserve(maxDefer);
557  }
558  };
559 
560  // getMissingNodes helper functions
561  void
562  gmn_ProcessNodes(MissingNodes&, MissingNodes::StackEntry& node);
563  void
564  gmn_ProcessDeferredReads(MissingNodes&);
565 
566  // fetch from DB helper function
568  finishFetch(
569  SHAMapHash const& hash,
570  std::shared_ptr<NodeObject> const& object) const;
571 };
572 
573 inline void
575 {
576  full_ = true;
577 }
578 
579 inline void
581 {
582  ledgerSeq_ = lseq;
583 }
584 
585 inline void
587 {
588  assert(state_ != SHAMapState::Invalid);
590 }
591 
592 inline bool
594 {
595  return state_ == SHAMapState::Synching;
596 }
597 
598 inline void
600 {
602 }
603 
604 inline void
606 {
608 }
609 
610 inline bool
612 {
613  return state_ != SHAMapState::Invalid;
614 }
615 
616 inline void
618 {
619  backed_ = false;
620 }
621 
622 //------------------------------------------------------------------------------
623 
625 {
626 public:
630  using reference = value_type const&;
631  using pointer = value_type const*;
632 
633 private:
635  SHAMap const* map_ = nullptr;
636  pointer item_ = nullptr;
637 
638 public:
639  const_iterator() = delete;
640 
641  const_iterator(const_iterator const& other) = default;
643  operator=(const_iterator const& other) = default;
644 
645  ~const_iterator() = default;
646 
647  reference
648  operator*() const;
649  pointer
650  operator->() const;
651 
653  operator++();
655  operator++(int);
656 
657 private:
658  explicit const_iterator(SHAMap const* map);
659  const_iterator(SHAMap const* map, std::nullptr_t);
660  const_iterator(SHAMap const* map, pointer item, SharedPtrNodeStack&& stack);
661 
662  friend bool
663  operator==(const_iterator const& x, const_iterator const& y);
664  friend class SHAMap;
665 };
666 
667 inline SHAMap::const_iterator::const_iterator(SHAMap const* map) : map_(map)
668 {
669  assert(map_ != nullptr);
670 
671  if (auto temp = map_->peekFirstItem(stack_))
672  item_ = temp->peekItem().get();
673 }
674 
676  : map_(map)
677 {
678 }
679 
681  SHAMap const* map,
682  pointer item,
683  SharedPtrNodeStack&& stack)
684  : stack_(std::move(stack)), map_(map), item_(item)
685 {
686 }
687 
690 {
691  return *item_;
692 }
693 
696 {
697  return item_;
698 }
699 
702 {
703  if (auto temp = map_->peekNextItem(item_->key(), stack_))
704  item_ = temp->peekItem().get();
705  else
706  item_ = nullptr;
707  return *this;
708 }
709 
712 {
713  auto tmp = *this;
714  ++(*this);
715  return tmp;
716 }
717 
718 inline bool
720 {
721  assert(x.map_ == y.map_);
722  return x.item_ == y.item_;
723 }
724 
725 inline bool
727 {
728  return !(x == y);
729 }
730 
731 inline SHAMap::const_iterator
733 {
734  return const_iterator(this);
735 }
736 
738 SHAMap::end() const
739 {
740  return const_iterator(this, nullptr);
741 }
742 
743 } // namespace ripple
744 
745 #endif
ripple::SHAMap::MissingNodes
Definition: SHAMap.h:496
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:100
ripple::SHAMap::invariants
void invariants() const
Definition: SHAMap.cpp:1181
ripple::SHAMap::clearSynching
void clearSynching()
Definition: SHAMap.h:605
ripple::SHAMap::isValid
bool isValid() const
Definition: SHAMap.h:611
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:340
ripple::SHAMap::SHAMap
SHAMap(SHAMap const &)=delete
ripple::SHAMap::MissingNodes::deferLock_
std::mutex deferLock_
Definition: SHAMap.h:536
ripple::SHAMap::peekNextItem
SHAMapLeafNode const * peekNextItem(uint256 const &id, SharedPtrNodeStack &stack) const
Definition: SHAMap.cpp:557
ripple::Dir::const_iterator
Definition: Directory.h:49
std::shared_ptr
STL class.
ripple::SHAMap::getHash
SHAMapHash getHash() const
Definition: SHAMap.cpp:845
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:668
ripple::SHAMap::MissingNodes::stack_
std::stack< StackEntry, std::deque< StackEntry > > stack_
Definition: SHAMap.h:526
ripple::SHAMap::hasInnerNode
bool hasInnerNode(SHAMapNodeID const &nodeID, SHAMapHash const &hash) const
Does this map have this inner node?
Definition: SHAMapSync.cpp:740
ripple::SHAMap::MissingNodes::deferred_
int deferred_
Definition: SHAMap.h:535
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:839
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:544
ripple::SHAMap::walkSubTree
int walkSubTree(bool doWrite, NodeObjectType t)
Definition: SHAMap.cpp:992
ripple::SHAMap::dump
void dump(bool withHashes=false) const
Definition: SHAMap.cpp:1117
ripple::SHAMap::const_iterator::stack_
SharedPtrNodeStack stack_
Definition: SHAMap.h:634
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:507
ripple::SHAMap::getProofPath
std::optional< std::vector< Blob > > getProofPath(uint256 const &key) const
Get the proof path of the key.
Definition: SHAMapSync.cpp:792
ripple::SHAMapNodeType
SHAMapNodeType
Definition: SHAMapTreeNode.h:46
ripple::SHAMap::MissingNodes::maxDefer_
const int maxDefer_
Definition: SHAMap.h:506
ripple::SHAMap::MissingNodes::generation_
std::uint32_t generation_
Definition: SHAMap.h:507
stack
ripple::SHAMap::peekItem
std::shared_ptr< SHAMapItem const > const & peekItem(uint256 const &id) const
Definition: SHAMap.cpp:586
ripple::SHAMap::serializeRoot
void serializeRoot(Serializer &s) const
Serializes the root in a format appropriate for sending over the wire.
Definition: SHAMapSync.cpp:524
ripple::SHAMap::fetchNode
std::shared_ptr< SHAMapTreeNode > fetchNode(SHAMapHash const &hash) const
Definition: SHAMap.cpp:272
std::forward_iterator_tag
ripple::SHAMap::fetchNodeNT
std::shared_ptr< SHAMapTreeNode > fetchNodeNT(SHAMapHash const &hash) const
Definition: SHAMap.cpp:260
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
ripple::SHAMap::belowHelper
SHAMapLeafNode * belowHelper(std::shared_ptr< SHAMapTreeNode > node, SharedPtrNodeStack &stack, int branch, std::tuple< int, std::function< bool(int)>, std::function< void(int &)>> const &loopParams) const
Definition: SHAMap.cpp:440
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:732
ripple::SHAMap::MissingNodes::finishedReads_
std::vector< DeferredNode > finishedReads_
Definition: SHAMap.h:538
std::function
ripple::SHAMapNodeID
Identifies a node inside a SHAMap.
Definition: SHAMapNodeID.h:33
ripple::SHAMap::MissingNodes::filter_
SHAMapSyncFilter * filter_
Definition: SHAMap.h:505
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:172
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:1160
ripple::SHAMap::const_iterator::operator->
pointer operator->() const
Definition: SHAMap.h:695
ripple::SHAMapLeafNode
Definition: SHAMapLeafNode.h:32
ripple::SHAMap::setFull
void setFull()
Definition: SHAMap.h:574
ripple::SHAMapHash
Definition: SHAMapHash.h:32
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:159
ripple::SHAMap::f_
Family & f_
Definition: SHAMap.h:98
ripple::SHAMap::lastBelow
SHAMapLeafNode * lastBelow(std::shared_ptr< SHAMapTreeNode > node, SharedPtrNodeStack &stack, int branch=branchFactor) const
Definition: SHAMap.cpp:481
ripple::base_uint< 256 >
std::nullptr_t
ripple::SHAMap::MissingNodes::resumes_
std::map< SHAMapInnerNode *, SHAMapNodeID > resumes_
Definition: SHAMap.h:542
ripple::SHAMap::hasItem
bool hasItem(uint256 const &id) const
Does the tree have an item with the given ID?
Definition: SHAMap.cpp:686
ripple::SHAMap::const_iterator::operator==
friend bool operator==(const_iterator const &x, const_iterator const &y)
Definition: SHAMap.h:719
ripple::SHAMap::hasLeafNode
bool hasLeafNode(uint256 const &tag, SHAMapHash const &hash) const
Does this map have this leaf node?
Definition: SHAMapSync.cpp:764
ripple::SHAMap::operator=
SHAMap & operator=(SHAMap const &)=delete
ripple::SHAMap::const_iterator::~const_iterator
~const_iterator()=default
ripple::SHAMapInnerNode
Definition: SHAMapInnerNode.h:39
ripple::SHAMap::verifyProofPath
static bool verifyProofPath(uint256 const &rootHash, uint256 const &key, std::vector< Blob > const &path)
Verify the proof path.
Definition: SHAMapSync.cpp:827
ripple::SHAMap::peekFirstItem
SHAMapLeafNode const * peekFirstItem(SharedPtrNodeStack &stack) const
Definition: SHAMap.cpp:543
ripple::SHAMap::MissingNodes::max_
int max_
Definition: SHAMap.h:504
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:31
ripple::SHAMap::isSynching
bool isSynching() const
Definition: SHAMap.h:593
ripple::SHAMap::const_iterator
Definition: SHAMap.h:624
ripple::SHAMap::firstBelow
SHAMapLeafNode * firstBelow(std::shared_ptr< SHAMapTreeNode >, SharedPtrNodeStack &stack, int branch=0) const
Definition: SHAMap.cpp:493
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:701
ripple::operator!=
bool operator!=(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:169
ripple::SHAMap::MissingNodes::StackEntry
std::tuple< SHAMapInnerNode *, SHAMapNodeID, int, int, bool > StackEntry
Definition: SHAMap.h:519
ripple::SHAMapTreeNode
Definition: SHAMapTreeNode.h:53
ripple::SHAMap::descendThrow
SHAMapTreeNode * descendThrow(SHAMapInnerNode *, int branch) const
Definition: SHAMap.cpp:283
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:1168
ripple::SHAMap::MissingNodes::missingHashes_
std::set< SHAMapHash > missingHashes_
Definition: SHAMap.h:511
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:636
std::uint32_t
std::map
STL class.
ripple::SHAMap::setLedgerSeq
void setLedgerSeq(std::uint32_t lseq)
Definition: SHAMap.h:580
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:317
ripple::SHAMap::const_iterator::map_
SHAMap const * map_
Definition: SHAMap.h:635
ripple::SHAMap::fetchRoot
bool fetchRoot(SHAMapHash const &hash, SHAMapSyncFilter *filter)
Definition: SHAMap.cpp:897
ripple::SHAMap::walkMap
void walkMap(std::vector< SHAMapMissingNode > &missingNodes, int maxMissing) const
Definition: SHAMapDelta.cpp:252
ripple::Serializer
Definition: Serializer.h:39
ripple::SHAMap::upper_bound
const_iterator upper_bound(uint256 const &id) const
Definition: SHAMap.cpp:609
ripple::SHAMap::const_iterator::operator*
reference operator*() const
Definition: SHAMap.h:689
ripple::SHAMap::setImmutable
void setImmutable()
Definition: SHAMap.h:586
ripple::SHAMap::finishFetch
std::shared_ptr< SHAMapTreeNode > finishFetch(SHAMapHash const &hash, std::shared_ptr< NodeObject > const &object) const
Definition: SHAMap.cpp:171
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::walkMapParallel
bool walkMapParallel(std::vector< SHAMapMissingNode > &missingNodes, int maxMissing) const
Definition: SHAMapDelta.cpp:294
ripple::SHAMap::checkFilter
std::shared_ptr< SHAMapTreeNode > checkFilter(SHAMapHash const &hash, SHAMapSyncFilter *filter) const
Definition: SHAMap.cpp:204
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:617
ripple::SHAMap::MissingNodes::deferCondVar_
std::condition_variable deferCondVar_
Definition: SHAMap.h:537
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:857
ripple::SHAMap::const_iterator::const_iterator
const_iterator()=delete
ripple::SHAMap::end
const_iterator end() const
Definition: SHAMap.h:738
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:770
ripple::SHAMap::unshare
int unshare()
Convert any modified nodes to shared.
Definition: SHAMap.cpp:978
ripple::SHAMap::descendAsync
SHAMapTreeNode * descendAsync(SHAMapInnerNode *parent, int branch, SHAMapSyncFilter *filter, bool &pending, descendCallback &&) const
Definition: SHAMap.cpp:380
std::condition_variable
ripple::SHAMap::writeNode
std::shared_ptr< SHAMapTreeNode > writeNode(NodeObjectType t, std::shared_ptr< SHAMapTreeNode > node) const
write and canonicalize modified node
Definition: SHAMap.cpp:943
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:356
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:128
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:265
std::optional
std::mutex
STL class.
ripple::SHAMapState::Invalid
@ Invalid
The map is known to not be valid.
ripple::SHAMap::const_iterator::pointer
value_type const * pointer
Definition: SHAMap.h:631
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:962
ripple::SHAMap::addKnownNode
SHAMapAddNode addKnownNode(SHAMapNodeID const &nodeID, Slice const &rawNode, SHAMapSyncFilter *filter)
Definition: SHAMapSync.cpp:572
ripple::SHAMap::flushDirty
int flushDirty(NodeObjectType t)
Flush modified nodes to the nodestore and convert them to shared.
Definition: SHAMap.cpp:985
ripple::SHAMap::lower_bound
const_iterator lower_bound(uint256 const &id) const
Definition: SHAMap.cpp:648
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:424
ripple::SHAMap::descend
SHAMapTreeNode * descend(SHAMapInnerNode *, int branch) const
Definition: SHAMap.cpp:306
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:530
ripple::SHAMap::walkBranch
bool walkBranch(SHAMapTreeNode *node, std::shared_ptr< SHAMapItem const > const &otherMapItem, bool isFirstMap, Delta &differences, int &maxCount) const
Definition: SHAMapDelta.cpp:38
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::const_iterator::operator=
const_iterator & operator=(const_iterator const &other)=default
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:427
ripple::SHAMapSyncFilter
Definition: SHAMapSyncFilter.h:30
ripple::SHAMap::MissingNodes::missingNodes_
std::vector< std::pair< SHAMapNodeID, uint256 > > missingNodes_
Definition: SHAMap.h:510
ripple::SHAMap::delItem
bool delItem(uint256 const &id)
Definition: SHAMap.cpp:692
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:599
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:630