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
220  upper_bound(uint256 const& id) const;
221 
229  lower_bound(uint256 const& id) const;
230 
236  void
237  visitNodes(std::function<bool(SHAMapTreeNode&)> const& function) const;
238 
245  void
247  SHAMap const* have,
248  std::function<bool(SHAMapTreeNode const&)> const&) const;
249 
254  void
255  visitLeaves(
257  const;
258 
259  // comparison/sync functions
260 
272  getMissingNodes(int maxNodes, SHAMapSyncFilter* filter);
273 
274  bool
275  getNodeFat(
276  SHAMapNodeID const& wanted,
278  bool fatLeaves,
279  std::uint32_t depth) const;
280 
288  getProofPath(uint256 const& key) const;
289 
297  static bool
299  uint256 const& rootHash,
300  uint256 const& key,
301  std::vector<Blob> const& path);
302 
304  void
305  serializeRoot(Serializer& s) const;
306 
308  addRootNode(
309  SHAMapHash const& hash,
310  Slice const& rootNode,
311  SHAMapSyncFilter* filter);
313  addKnownNode(
314  SHAMapNodeID const& nodeID,
315  Slice const& rawNode,
316  SHAMapSyncFilter* filter);
317 
318  // status functions
319  void
320  setImmutable();
321  bool
322  isSynching() const;
323  void
324  setSynching();
325  void
326  clearSynching();
327  bool
328  isValid() const;
329 
330  // caution: otherMap must be accessed only by this function
331  // return value: true=successfully completed, false=too different
332  bool
333  compare(SHAMap const& otherMap, Delta& differences, int maxCount) const;
334 
336  int
337  unshare();
338 
340  int
342 
343  void
344  walkMap(std::vector<SHAMapMissingNode>& missingNodes, int maxMissing) const;
345  bool
347  std::vector<SHAMapMissingNode>& missingNodes,
348  int maxMissing) const;
349  bool
350  deepCompare(SHAMap& other) const; // Intended for debug/test only
351 
352  void
353  setUnbacked();
354 
355  void
356  dump(bool withHashes = false) const;
357  void
358  invariants() const;
359 
360 private:
361  using SharedPtrNodeStack =
363  using DeltaRef = std::pair<
366 
367  // tree node cache operations
369  cacheLookup(SHAMapHash const& hash) const;
370  void
372  const;
373 
374  // database operations
376  fetchNodeFromDB(SHAMapHash const& hash) const;
378  fetchNodeNT(SHAMapHash const& hash) const;
380  fetchNodeNT(SHAMapHash const& hash, SHAMapSyncFilter* filter) const;
382  fetchNode(SHAMapHash const& hash) const;
384  checkFilter(SHAMapHash const& hash, SHAMapSyncFilter* filter) const;
385 
387  void
388  dirtyUp(
389  SharedPtrNodeStack& stack,
390  uint256 const& target,
392 
397  walkTowardsKey(uint256 const& id, SharedPtrNodeStack* stack = nullptr)
398  const;
401  findKey(uint256 const& id) const;
402 
404  template <class Node>
407 
409  template <class Node>
412 
416 
417  // returns the first item at or below this node
419  firstBelow(
421  SharedPtrNodeStack& stack,
422  int branch = 0) const;
423 
424  // returns the last item at or below this node
426  lastBelow(
428  SharedPtrNodeStack& stack,
429  int branch = branchFactor) const;
430 
431  // helper function for firstBelow and lastBelow
433  belowHelper(
435  SharedPtrNodeStack& stack,
436  int branch,
437  std::tuple<
438  int,
439  std::function<bool(int)>,
440  std::function<void(int&)>> const& loopParams) const;
441 
442  // Simple descent
443  // Get a child of the specified node
445  descend(SHAMapInnerNode*, int branch) const;
447  descendThrow(SHAMapInnerNode*, int branch) const;
449  descend(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
451  descendThrow(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
452 
453  // Descend with filter
454  // If pending, callback is called as if it called fetchNodeNT
455  using descendCallback =
458  descendAsync(
459  SHAMapInnerNode* parent,
460  int branch,
461  SHAMapSyncFilter* filter,
462  bool& pending,
463  descendCallback&&) const;
464 
466  descend(
467  SHAMapInnerNode* parent,
468  SHAMapNodeID const& parentID,
469  int branch,
470  SHAMapSyncFilter* filter) const;
471 
472  // Non-storing
473  // Does not hook the returned node to its parent
475  descendNoStore(std::shared_ptr<SHAMapInnerNode> const&, int branch) const;
476 
479  onlyBelow(SHAMapTreeNode*) const;
480 
481  bool
482  hasInnerNode(SHAMapNodeID const& nodeID, SHAMapHash const& hash) const;
483  bool
484  hasLeafNode(uint256 const& tag, SHAMapHash const& hash) const;
485 
486  SHAMapLeafNode const*
487  peekFirstItem(SharedPtrNodeStack& stack) const;
488  SHAMapLeafNode const*
489  peekNextItem(uint256 const& id, SharedPtrNodeStack& stack) const;
490  bool
491  walkBranch(
492  SHAMapTreeNode* node,
493  std::shared_ptr<SHAMapItem const> const& otherMapItem,
494  bool isFirstMap,
495  Delta& differences,
496  int& maxCount) const;
497  int
498  walkSubTree(bool doWrite, NodeObjectType t);
499 
500  // Structure to track information about call to
501  // getMissingNodes while it's in progress
503  {
504  MissingNodes() = delete;
505  MissingNodes(const MissingNodes&) = delete;
506  MissingNodes&
507  operator=(const MissingNodes&) = delete;
508 
509  // basic parameters
510  int max_;
512  int const maxDefer_;
514 
515  // nodes we have discovered to be missing
518 
519  // nodes we are in the process of traversing
520  using StackEntry = std::tuple<
521  SHAMapInnerNode*, // pointer to the node
522  SHAMapNodeID, // the node's ID
523  int, // while child we check first
524  int, // which child we check next
525  bool>; // whether we've found any missing children yet
526 
527  // We explicitly choose to specify the use of std::deque here, because
528  // we need to ensure that pointers and/or references to existing
529  // elements will not be invalidated during the course of element
530  // insertion and removal. Containers that do not offer this guarantee,
531  // such as std::vector, can't be used here.
533 
534  // nodes we may have acquired from deferred reads
535  using DeferredNode = std::tuple<
536  SHAMapInnerNode*, // parent node
537  SHAMapNodeID, // parent node ID
538  int, // branch
540 
545 
546  // nodes we need to resume after we get their children from deferred
547  // reads
549 
551  int max,
552  SHAMapSyncFilter* filter,
553  int maxDefer,
554  std::uint32_t generation)
555  : max_(max)
556  , filter_(filter)
557  , maxDefer_(maxDefer)
558  , generation_(generation)
559  , deferred_(0)
560  {
561  missingNodes_.reserve(max);
562  finishedReads_.reserve(maxDefer);
563  }
564  };
565 
566  // getMissingNodes helper functions
567  void
568  gmn_ProcessNodes(MissingNodes&, MissingNodes::StackEntry& node);
569  void
570  gmn_ProcessDeferredReads(MissingNodes&);
571 
572  // fetch from DB helper function
574  finishFetch(
575  SHAMapHash const& hash,
576  std::shared_ptr<NodeObject> const& object) const;
577 };
578 
579 inline void
581 {
582  full_ = true;
583 }
584 
585 inline void
587 {
588  ledgerSeq_ = lseq;
589 }
590 
591 inline void
593 {
594  assert(state_ != SHAMapState::Invalid);
596 }
597 
598 inline bool
600 {
601  return state_ == SHAMapState::Synching;
602 }
603 
604 inline void
606 {
608 }
609 
610 inline void
612 {
614 }
615 
616 inline bool
618 {
619  return state_ != SHAMapState::Invalid;
620 }
621 
622 inline void
624 {
625  backed_ = false;
626 }
627 
628 //------------------------------------------------------------------------------
629 
631 {
632 public:
636  using reference = value_type const&;
637  using pointer = value_type const*;
638 
639 private:
641  SHAMap const* map_ = nullptr;
642  pointer item_ = nullptr;
643 
644 public:
645  const_iterator() = delete;
646 
647  const_iterator(const_iterator const& other) = default;
649  operator=(const_iterator const& other) = default;
650 
651  ~const_iterator() = default;
652 
653  reference
654  operator*() const;
655  pointer
656  operator->() const;
657 
659  operator++();
661  operator++(int);
662 
663 private:
664  explicit const_iterator(SHAMap const* map);
665  const_iterator(SHAMap const* map, std::nullptr_t);
666  const_iterator(SHAMap const* map, pointer item, SharedPtrNodeStack&& stack);
667 
668  friend bool
669  operator==(const_iterator const& x, const_iterator const& y);
670  friend class SHAMap;
671 };
672 
673 inline SHAMap::const_iterator::const_iterator(SHAMap const* map) : map_(map)
674 {
675  assert(map_ != nullptr);
676 
677  if (auto temp = map_->peekFirstItem(stack_))
678  item_ = temp->peekItem().get();
679 }
680 
682  : map_(map)
683 {
684 }
685 
687  SHAMap const* map,
688  pointer item,
689  SharedPtrNodeStack&& stack)
690  : stack_(std::move(stack)), map_(map), item_(item)
691 {
692 }
693 
696 {
697  return *item_;
698 }
699 
702 {
703  return item_;
704 }
705 
708 {
709  if (auto temp = map_->peekNextItem(item_->key(), stack_))
710  item_ = temp->peekItem().get();
711  else
712  item_ = nullptr;
713  return *this;
714 }
715 
718 {
719  auto tmp = *this;
720  ++(*this);
721  return tmp;
722 }
723 
724 inline bool
726 {
727  assert(x.map_ == y.map_);
728  return x.item_ == y.item_;
729 }
730 
731 inline bool
733 {
734  return !(x == y);
735 }
736 
737 inline SHAMap::const_iterator
739 {
740  return const_iterator(this);
741 }
742 
744 SHAMap::end() const
745 {
746  return const_iterator(this, nullptr);
747 }
748 
749 } // namespace ripple
750 
751 #endif
ripple::SHAMap::MissingNodes
Definition: SHAMap.h:502
ripple::SHAMapAddNode
Definition: SHAMapAddNode.h:28
ripple::SHAMap::invariants
void invariants() const
Definition: SHAMap.cpp:1189
ripple::SHAMap::clearSynching
void clearSynching()
Definition: SHAMap.h:611
ripple::SHAMap::isValid
bool isValid() const
Definition: SHAMap.h:617
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:351
ripple::SHAMap::SHAMap
SHAMap(SHAMap const &)=delete
ripple::SHAMap::MissingNodes::deferLock_
std::mutex deferLock_
Definition: SHAMap.h:542
ripple::SHAMap::peekNextItem
SHAMapLeafNode const * peekNextItem(uint256 const &id, SharedPtrNodeStack &stack) const
Definition: SHAMap.cpp:568
ripple::Dir::const_iterator
Definition: Directory.h:49
std::shared_ptr
STL class.
ripple::SHAMap::getHash
SHAMapHash getHash() const
Definition: SHAMap.cpp:853
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:532
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::MissingNodes::deferred_
int deferred_
Definition: SHAMap.h:541
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:847
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:550
ripple::SHAMap::walkSubTree
int walkSubTree(bool doWrite, NodeObjectType t)
Definition: SHAMap.cpp:1000
ripple::SHAMap::dump
void dump(bool withHashes=false) const
Definition: SHAMap.cpp:1125
ripple::SHAMap::const_iterator::stack_
SharedPtrNodeStack stack_
Definition: SHAMap.h:640
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:518
ripple::SHAMap::getProofPath
std::optional< std::vector< Blob > > getProofPath(uint256 const &key) const
Get the proof path of the key.
Definition: SHAMapSync.cpp:791
ripple::SHAMapNodeType
SHAMapNodeType
Definition: SHAMapTreeNode.h:46
ripple::SHAMap::MissingNodes::maxDefer_
const int maxDefer_
Definition: SHAMap.h:512
ripple::SHAMap::MissingNodes::generation_
std::uint32_t generation_
Definition: SHAMap.h:513
stack
ripple::SHAMap::peekItem
std::shared_ptr< SHAMapItem const > const & peekItem(uint256 const &id) const
Definition: SHAMap.cpp:597
ripple::SHAMap::serializeRoot
void serializeRoot(Serializer &s) const
Serializes the root in a format appropriate for sending over the wire.
Definition: SHAMapSync.cpp:522
ripple::SHAMap::fetchNode
std::shared_ptr< SHAMapTreeNode > fetchNode(SHAMapHash const &hash) const
Definition: SHAMap.cpp:283
std::forward_iterator_tag
ripple::SHAMap::fetchNodeNT
std::shared_ptr< SHAMapTreeNode > fetchNodeNT(SHAMapHash const &hash) const
Definition: SHAMap.cpp:271
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:46
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:451
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:738
ripple::SHAMap::visitDifferences
void visitDifferences(SHAMap const *have, std::function< bool(SHAMapTreeNode const &)> const &) const
Visit every node in this SHAMap that is not present in the specified SHAMap.
Definition: SHAMapSync.cpp:100
ripple::SHAMap::MissingNodes::finishedReads_
std::vector< DeferredNode > finishedReads_
Definition: SHAMap.h:544
std::function
ripple::SHAMapNodeID
Identifies a node inside a SHAMap.
Definition: SHAMapNodeID.h:33
ripple::SHAMap::MissingNodes::filter_
SHAMapSyncFilter * filter_
Definition: SHAMap.h:511
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:24
ripple::SHAMap::cacheLookup
std::shared_ptr< SHAMapTreeNode > cacheLookup(SHAMapHash const &hash) const
Definition: SHAMap.cpp:1168
ripple::SHAMap::const_iterator::operator->
pointer operator->() const
Definition: SHAMap.h:701
ripple::SHAMapLeafNode
Definition: SHAMapLeafNode.h:32
ripple::SHAMap::setFull
void setFull()
Definition: SHAMap.h:580
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:165
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:492
ripple::base_uint< 256 >
std::nullptr_t
ripple::SHAMap::MissingNodes::resumes_
std::map< SHAMapInnerNode *, SHAMapNodeID > resumes_
Definition: SHAMap.h:548
ripple::SHAMap::hasItem
bool hasItem(uint256 const &id) const
Does the tree have an item with the given ID?
Definition: SHAMap.cpp:695
ripple::SHAMap::const_iterator::operator==
friend bool operator==(const_iterator const &x, const_iterator const &y)
Definition: SHAMap.h:725
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::SHAMap::const_iterator::~const_iterator
~const_iterator()=default
ripple::SHAMapInnerNode
Definition: SHAMapInnerNode.h:41
ripple::SHAMap::verifyProofPath
static bool verifyProofPath(uint256 const &rootHash, uint256 const &key, std::vector< Blob > const &path)
Verify the proof path.
Definition: SHAMapSync.cpp:826
ripple::SHAMap::peekFirstItem
SHAMapLeafNode const * peekFirstItem(SharedPtrNodeStack &stack) const
Definition: SHAMap.cpp:554
ripple::SHAMap::MissingNodes::max_
int max_
Definition: SHAMap.h:510
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:599
ripple::SHAMap::const_iterator
Definition: SHAMap.h:630
ripple::SHAMap::firstBelow
SHAMapLeafNode * firstBelow(std::shared_ptr< SHAMapTreeNode >, SharedPtrNodeStack &stack, int branch=0) const
Definition: SHAMap.cpp:504
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:707
ripple::operator!=
bool operator!=(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:175
ripple::SHAMap::MissingNodes::StackEntry
std::tuple< SHAMapInnerNode *, SHAMapNodeID, int, int, bool > StackEntry
Definition: SHAMap.h:525
ripple::SHAMapTreeNode
Definition: SHAMapTreeNode.h:53
ripple::SHAMap::descendThrow
SHAMapTreeNode * descendThrow(SHAMapInnerNode *, int branch) const
Definition: SHAMap.cpp:294
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:1176
ripple::SHAMap::MissingNodes::missingHashes_
std::set< SHAMapHash > missingHashes_
Definition: SHAMap.h:517
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:642
std::uint32_t
std::map
STL class.
ripple::SHAMap::setLedgerSeq
void setLedgerSeq(std::uint32_t lseq)
Definition: SHAMap.h:586
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:641
ripple::SHAMap::fetchRoot
bool fetchRoot(SHAMapHash const &hash, SHAMapSyncFilter *filter)
Definition: SHAMap.cpp:905
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
Find the first item after the given item.
Definition: SHAMap.cpp:620
ripple::SHAMap::const_iterator::operator*
reference operator*() const
Definition: SHAMap.h:695
ripple::SHAMap::setImmutable
void setImmutable()
Definition: SHAMap.h:592
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:215
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:623
ripple::SHAMap::MissingNodes::deferCondVar_
std::condition_variable deferCondVar_
Definition: SHAMap.h:543
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:865
ripple::SHAMap::const_iterator::const_iterator
const_iterator()=delete
ripple::SHAMap::end
const_iterator end() const
Definition: SHAMap.h:744
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:779
ripple::SHAMap::unshare
int unshare()
Convert any modified nodes to shared.
Definition: SHAMap.cpp:986
ripple::SHAMap::descendAsync
SHAMapTreeNode * descendAsync(SHAMapInnerNode *parent, int branch, SHAMapSyncFilter *filter, bool &pending, descendCallback &&) const
Definition: SHAMap.cpp:391
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:951
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:362
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::getNodeFat
bool getNodeFat(SHAMapNodeID const &wanted, std::vector< std::pair< SHAMapNodeID, Blob >> &data, bool fatLeaves, std::uint32_t depth) const
Definition: SHAMapSync.cpp:427
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:637
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:970
ripple::SHAMap::addKnownNode
SHAMapAddNode addKnownNode(SHAMapNodeID const &nodeID, Slice const &rawNode, SHAMapSyncFilter *filter)
Definition: SHAMapSync.cpp:570
ripple::SHAMap::flushDirty
int flushDirty(NodeObjectType t)
Flush modified nodes to the nodestore and convert them to shared.
Definition: SHAMap.cpp:993
ripple::SHAMap::lower_bound
const_iterator lower_bound(uint256 const &id) const
Find the object with the greatest object id smaller than the input id.
Definition: SHAMap.cpp:657
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:435
ripple::SHAMap::descend
SHAMapTreeNode * descend(SHAMapInnerNode *, int branch) const
Definition: SHAMap.cpp:317
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:528
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::SHAMapSyncFilter
Definition: SHAMapSyncFilter.h:30
ripple::SHAMap::MissingNodes::missingNodes_
std::vector< std::pair< SHAMapNodeID, uint256 > > missingNodes_
Definition: SHAMap.h:516
ripple::SHAMap::delItem
bool delItem(uint256 const &id)
Definition: SHAMap.cpp:701
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:605
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:636