rippled
Application.cpp
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 #include <ripple/app/consensus/RCLValidations.h>
21 #include <ripple/app/ledger/InboundLedgers.h>
22 #include <ripple/app/ledger/InboundTransactions.h>
23 #include <ripple/app/ledger/LedgerCleaner.h>
24 #include <ripple/app/ledger/LedgerMaster.h>
25 #include <ripple/app/ledger/LedgerReplayer.h>
26 #include <ripple/app/ledger/LedgerToJson.h>
27 #include <ripple/app/ledger/OpenLedger.h>
28 #include <ripple/app/ledger/OrderBookDB.h>
29 #include <ripple/app/ledger/PendingSaves.h>
30 #include <ripple/app/ledger/TransactionMaster.h>
31 #include <ripple/app/main/Application.h>
32 #include <ripple/app/main/BasicApp.h>
33 #include <ripple/app/main/DBInit.h>
34 #include <ripple/app/main/GRPCServer.h>
35 #include <ripple/app/main/LoadManager.h>
36 #include <ripple/app/main/NodeIdentity.h>
37 #include <ripple/app/main/NodeStoreScheduler.h>
38 #include <ripple/app/main/Tuning.h>
39 #include <ripple/app/misc/AmendmentTable.h>
40 #include <ripple/app/misc/HashRouter.h>
41 #include <ripple/app/misc/LoadFeeTrack.h>
42 #include <ripple/app/misc/NetworkOPs.h>
43 #include <ripple/app/misc/SHAMapStore.h>
44 #include <ripple/app/misc/TxQ.h>
45 #include <ripple/app/misc/ValidatorKeys.h>
46 #include <ripple/app/misc/ValidatorSite.h>
47 #include <ripple/app/paths/PathRequests.h>
48 #include <ripple/app/rdb/Wallet.h>
49 #include <ripple/app/rdb/backend/PostgresDatabase.h>
50 #include <ripple/app/reporting/ReportingETL.h>
51 #include <ripple/app/tx/apply.h>
52 #include <ripple/basics/ByteUtilities.h>
53 #include <ripple/basics/PerfLog.h>
54 #include <ripple/basics/ResolverAsio.h>
55 #include <ripple/basics/random.h>
56 #include <ripple/basics/safe_cast.h>
57 #include <ripple/beast/asio/io_latency_probe.h>
58 #include <ripple/beast/core/LexicalCast.h>
59 #include <ripple/core/DatabaseCon.h>
60 #include <ripple/crypto/csprng.h>
61 #include <ripple/json/json_reader.h>
62 #include <ripple/nodestore/DatabaseShard.h>
63 #include <ripple/nodestore/DummyScheduler.h>
64 #include <ripple/overlay/Cluster.h>
65 #include <ripple/overlay/PeerReservationTable.h>
66 #include <ripple/overlay/PeerSet.h>
67 #include <ripple/overlay/make_Overlay.h>
68 #include <ripple/protocol/BuildInfo.h>
69 #include <ripple/protocol/Feature.h>
70 #include <ripple/protocol/Protocol.h>
71 #include <ripple/protocol/STParsedJSON.h>
72 #include <ripple/resource/Fees.h>
73 #include <ripple/rpc/ShardArchiveHandler.h>
74 #include <ripple/rpc/impl/RPCHelpers.h>
75 #include <ripple/shamap/NodeFamily.h>
76 #include <ripple/shamap/ShardFamily.h>
77 
78 #include <boost/algorithm/string/predicate.hpp>
79 #include <boost/asio/steady_timer.hpp>
80 #include <boost/system/error_code.hpp>
81 
82 #include <date/date.h>
83 
84 #include <chrono>
85 #include <condition_variable>
86 #include <cstring>
87 #include <iostream>
88 #include <limits>
89 #include <mutex>
90 #include <optional>
91 #include <sstream>
92 #include <utility>
93 #include <variant>
94 
95 namespace ripple {
96 
97 // VFALCO TODO Move the function definitions into the class declaration
98 class ApplicationImp : public Application, public BasicApp
99 {
100 private:
102  {
103  private:
108 
109  public:
113  std::chrono::milliseconds interval,
114  boost::asio::io_service& ios)
115  : m_event(ev)
116  , m_journal(journal)
117  , m_probe(interval, ios)
118  , lastSample_{}
119  {
120  }
121 
122  void
124  {
125  m_probe.sample(std::ref(*this));
126  }
127 
128  template <class Duration>
129  void
130  operator()(Duration const& elapsed)
131  {
132  using namespace std::chrono;
133  auto const lastSample = ceil<milliseconds>(elapsed);
134 
135  lastSample_ = lastSample;
136 
137  if (lastSample >= 10ms)
138  m_event.notify(lastSample);
139  if (lastSample >= 500ms)
140  {
141  JLOG(m_journal.warn())
142  << "io_service latency = " << lastSample.count();
143  }
144  }
145 
147  get() const
148  {
149  return lastSample_.load();
150  }
151 
152  void
154  {
155  m_probe.cancel();
156  }
157 
158  void
160  {
162  }
163  };
164 
165 public:
169 
171 
175 
176  // Required by the SHAMapStore
178 
185 
190 
192 
198  // VFALCO TODO Make OrderBookDB abstract
222  boost::asio::steady_timer sweepTimer_;
223  boost::asio::steady_timer entropyTimer_;
224 
228 
229  boost::asio::signal_set m_signals;
230 
231  // Once we get C++20, we could use `std::atomic_flag` for `isTimeToStop`
232  // and eliminate the need for the condition variable and the mutex.
236 
238 
240 
242 
245 
246  //--------------------------------------------------------------------------
247 
248  static std::size_t
250  {
251 #if RIPPLE_SINGLE_IO_SERVICE_THREAD
252  return 1;
253 #else
254 
255  if (config.IO_WORKERS > 0)
256  return config.IO_WORKERS;
257 
258  auto const cores = std::thread::hardware_concurrency();
259 
260  // Use a single thread when running on under-provisioned systems
261  // or if we are configured to use minimal resources.
262  if ((cores == 1) || ((config.NODE_SIZE == 0) && (cores == 2)))
263  return 1;
264 
265  // Otherwise, prefer two threads.
266  return 2;
267 #endif
268  }
269 
270  //--------------------------------------------------------------------------
271 
277  , config_(std::move(config))
278  , logs_(std::move(logs))
279  , timeKeeper_(std::move(timeKeeper))
280  , instanceCookie_(
281  1 +
282  rand_int(
283  crypto_prng(),
284  std::numeric_limits<std::uint64_t>::max() - 1))
285  , m_journal(logs_->journal("Application"))
286 
287  // PerfLog must be started before any other threads are launched.
288  , perfLog_(perf::make_PerfLog(
289  perf::setup_PerfLog(
290  config_->section("perf"),
291  config_->CONFIG_DIR),
292  *this,
293  logs_->journal("PerfLog"),
294  [this] { signalStop(); }))
295 
296  , m_txMaster(*this)
297 
299  config_->section(SECTION_INSIGHT),
300  logs_->journal("Collector")))
301 
302  , m_jobQueue(std::make_unique<JobQueue>(
303  [](std::unique_ptr<Config> const& config) {
304  if (config->standalone() && !config->reporting() &&
306  return 1;
307 
308  if (config->WORKERS)
309  return config->WORKERS;
310 
311  auto count =
312  static_cast<int>(std::thread::hardware_concurrency());
313 
314  // Be more aggressive about the number of threads to use
315  // for the job queue if the server is configured as "large"
316  // or "huge" if there are enough cores.
317  if (config->NODE_SIZE >= 4 && count >= 16)
318  count = 6 + std::min(count, 8);
319  else if (config->NODE_SIZE >= 3 && count >= 8)
320  count = 4 + std::min(count, 6);
321  else
322  count = 2 + std::min(count, 4);
323 
324  return count;
325  }(config_),
326  m_collectorManager->group("jobq"),
327  logs_->journal("JobQueue"),
328  *logs_,
329  *perfLog_))
330 
332 
334  *this,
336  logs_->journal("SHAMapStore")))
337 
338  , m_tempNodeCache(
339  "NodeCache",
340  16384,
342  stopwatch(),
343  logs_->journal("TaggedCache"))
344 
345  , cachedSLEs_(
346  "Cached SLEs",
347  0,
349  stopwatch(),
350  logs_->journal("CachedSLEs"))
351 
353 
355  m_collectorManager->collector(),
356  logs_->journal("Resource")))
357 
358  , m_nodeStore(m_shaMapStore->makeNodeStore(
359  config_->PREFETCH_WORKERS > 0 ? config_->PREFETCH_WORKERS : 4))
360 
362 
363  // The shard store is optional and make_ShardStore can return null.
365  *this,
367  4,
368  logs_->journal("ShardStore")))
369 
370  , m_orderBookDB(*this)
371 
372  , m_pathRequests(std::make_unique<PathRequests>(
373  *this,
374  logs_->journal("PathRequest"),
375  m_collectorManager->collector()))
376 
377  , m_ledgerMaster(std::make_unique<LedgerMaster>(
378  *this,
379  stopwatch(),
380  m_collectorManager->collector(),
381  logs_->journal("LedgerMaster")))
382 
383  , ledgerCleaner_(
384  make_LedgerCleaner(*this, logs_->journal("LedgerCleaner")))
385 
386  // VFALCO NOTE must come before NetworkOPs to prevent a crash due
387  // to dependencies in the destructor.
388  //
390  *this,
391  stopwatch(),
392  m_collectorManager->collector()))
393 
395  *this,
396  m_collectorManager->collector(),
397  [this](std::shared_ptr<SHAMap> const& set, bool fromAcquire) {
398  gotTXSet(set, fromAcquire);
399  }))
400 
401  , m_ledgerReplayer(std::make_unique<LedgerReplayer>(
402  *this,
404  make_PeerSetBuilder(*this)))
405 
407  "AcceptedLedger",
408  4,
410  stopwatch(),
411  logs_->journal("TaggedCache"))
412 
414  *this,
415  stopwatch(),
416  config_->standalone(),
417  config_->NETWORK_QUORUM,
418  config_->START_VALID,
419  *m_jobQueue,
422  get_io_service(),
423  logs_->journal("NetworkOPs"),
424  m_collectorManager->collector()))
425 
426  , cluster_(std::make_unique<Cluster>(logs_->journal("Overlay")))
427 
428  , peerReservations_(std::make_unique<PeerReservationTable>(
429  logs_->journal("PeerReservationTable")))
430 
432  std::make_unique<ManifestCache>(logs_->journal("ManifestCache")))
433 
435  std::make_unique<ManifestCache>(logs_->journal("ManifestCache")))
436 
437  , validators_(std::make_unique<ValidatorList>(
440  *timeKeeper_,
441  config_->legacy("database_path"),
442  logs_->journal("ValidatorList"),
443  config_->VALIDATION_QUORUM))
444 
445  , validatorSites_(std::make_unique<ValidatorSite>(*this))
446 
448  *this,
449  get_io_service(),
450  *m_jobQueue,
451  *m_networkOPs,
454 
455  , mFeeTrack(
456  std::make_unique<LoadFeeTrack>(logs_->journal("LoadManager")))
457 
458  , hashRouter_(std::make_unique<HashRouter>(
459  stopwatch(),
461 
462  , mValidations(
463  ValidationParms(),
464  stopwatch(),
465  *this,
466  logs_->journal("Validations"))
467 
468  , m_loadManager(make_LoadManager(*this, logs_->journal("LoadManager")))
469 
470  , txQ_(
471  std::make_unique<TxQ>(setup_TxQ(*config_), logs_->journal("TxQ")))
472 
474 
476 
478 
479  , checkSigs_(true)
480 
481  , m_resolver(
482  ResolverAsio::New(get_io_service(), logs_->journal("Resolver")))
483 
485  m_collectorManager->collector()->make_event("ios_latency"),
486  logs_->journal("Application"),
488  get_io_service())
489  , grpcServer_(std::make_unique<GRPCServer>(*this))
490  , reportingETL_(
491  config_->reporting() ? std::make_unique<ReportingETL>(*this)
492  : nullptr)
493  {
495 
496  add(m_resourceManager.get());
497 
498  //
499  // VFALCO - READ THIS!
500  //
501  // Do not start threads, open sockets, or do any sort of "real work"
502  // inside the constructor. Put it in start instead. Or if you must,
503  // put it in setup (but everything in setup should be moved to start
504  // anyway.
505  //
506  // The reason is that the unit tests require an Application object to
507  // be created. But we don't actually start all the threads, sockets,
508  // and services when running the unit tests. Therefore anything which
509  // needs to be stopped will not get stopped correctly if it is
510  // started in this constructor.
511  //
512 
513  add(ledgerCleaner_.get());
514  }
515 
516  //--------------------------------------------------------------------------
517 
518  bool
519  setup(boost::program_options::variables_map const& cmdline) override;
520  void
521  start(bool withTimers) override;
522  void
523  run() override;
524  void
525  signalStop(std::string msg = "") override;
526  bool
527  checkSigs() const override;
528  void
529  checkSigs(bool) override;
530  bool
531  isStopping() const override;
532  int
533  fdRequired() const override;
534 
535  //--------------------------------------------------------------------------
536 
538  instanceID() const override
539  {
540  return instanceCookie_;
541  }
542 
543  Logs&
544  logs() override
545  {
546  return *logs_;
547  }
548 
549  Config&
550  config() override
551  {
552  return *config_;
553  }
554 
557  {
558  return *m_collectorManager;
559  }
560 
561  Family&
562  getNodeFamily() override
563  {
564  return nodeFamily_;
565  }
566 
567  // The shard store is an optional feature. If the sever is configured for
568  // shards, this function will return a valid pointer, otherwise a nullptr.
569  Family*
570  getShardFamily() override
571  {
572  return shardFamily_.get();
573  }
574 
575  TimeKeeper&
576  timeKeeper() override
577  {
578  return *timeKeeper_;
579  }
580 
581  JobQueue&
582  getJobQueue() override
583  {
584  return *m_jobQueue;
585  }
586 
588  nodeIdentity() override
589  {
590  return nodeIdentity_;
591  }
592 
593  PublicKey const&
594  getValidationPublicKey() const override
595  {
596  return validatorKeys_.publicKey;
597  }
598 
599  NetworkOPs&
600  getOPs() override
601  {
602  return *m_networkOPs;
603  }
604 
605  virtual ServerHandler&
606  getServerHandler() override
607  {
608  assert(serverHandler_);
609  return *serverHandler_;
610  }
611 
612  boost::asio::io_service&
613  getIOService() override
614  {
615  return get_io_service();
616  }
617 
619  getIOLatency() override
620  {
621  return m_io_latency_sampler.get();
622  }
623 
624  LedgerMaster&
625  getLedgerMaster() override
626  {
627  return *m_ledgerMaster;
628  }
629 
631  getLedgerCleaner() override
632  {
633  return *ledgerCleaner_;
634  }
635 
637  getLedgerReplayer() override
638  {
639  return *m_ledgerReplayer;
640  }
641 
643  getInboundLedgers() override
644  {
645  return *m_inboundLedgers;
646  }
647 
650  {
651  return *m_inboundTransactions;
652  }
653 
656  {
657  return m_acceptedLedgerCache;
658  }
659 
660  void
661  gotTXSet(std::shared_ptr<SHAMap> const& set, bool fromAcquire)
662  {
663  if (set)
664  m_networkOPs->mapComplete(set, fromAcquire);
665  }
666 
669  {
670  return m_txMaster;
671  }
672 
674  getPerfLog() override
675  {
676  return *perfLog_;
677  }
678 
679  NodeCache&
680  getTempNodeCache() override
681  {
682  return m_tempNodeCache;
683  }
684 
686  getNodeStore() override
687  {
688  return *m_nodeStore;
689  }
690 
691  // The shard store is an optional feature. If the sever is configured for
692  // shards, this function will return a valid pointer, otherwise a nullptr.
694  getShardStore() override
695  {
696  return shardStore_.get();
697  }
698 
700  getShardArchiveHandler(bool tryRecovery) override
701  {
702  static std::mutex handlerMutex;
703  std::lock_guard lock(handlerMutex);
704 
705  // After constructing the handler, try to
706  // initialize it. Log on error; set the
707  // member variable on success.
708  auto initAndSet =
710  if (!handler)
711  return false;
712 
713  if (!handler->init())
714  {
715  JLOG(m_journal.error())
716  << "Failed to initialize ShardArchiveHandler.";
717 
718  return false;
719  }
720 
721  shardArchiveHandler_ = std::move(handler);
722  return true;
723  };
724 
725  // Need to resume based on state from a previous
726  // run.
727  if (tryRecovery)
728  {
729  if (shardArchiveHandler_ != nullptr)
730  {
731  JLOG(m_journal.error())
732  << "ShardArchiveHandler already created at startup.";
733 
734  return nullptr;
735  }
736 
737  auto handler =
739 
740  if (!initAndSet(std::move(handler)))
741  return nullptr;
742  }
743 
744  // Construct the ShardArchiveHandler
745  if (shardArchiveHandler_ == nullptr)
746  {
747  auto handler =
749 
750  if (!initAndSet(std::move(handler)))
751  return nullptr;
752  }
753 
754  return shardArchiveHandler_.get();
755  }
756 
758  getMasterMutex() override
759  {
760  return m_masterMutex;
761  }
762 
763  LoadManager&
764  getLoadManager() override
765  {
766  return *m_loadManager;
767  }
768 
771  {
772  return *m_resourceManager;
773  }
774 
775  OrderBookDB&
776  getOrderBookDB() override
777  {
778  return m_orderBookDB;
779  }
780 
781  PathRequests&
782  getPathRequests() override
783  {
784  return *m_pathRequests;
785  }
786 
787  CachedSLEs&
788  cachedSLEs() override
789  {
790  return cachedSLEs_;
791  }
792 
794  getAmendmentTable() override
795  {
796  return *m_amendmentTable;
797  }
798 
799  LoadFeeTrack&
800  getFeeTrack() override
801  {
802  return *mFeeTrack;
803  }
804 
805  HashRouter&
806  getHashRouter() override
807  {
808  return *hashRouter_;
809  }
810 
812  getValidations() override
813  {
814  return mValidations;
815  }
816 
818  validators() override
819  {
820  return *validators_;
821  }
822 
824  validatorSites() override
825  {
826  return *validatorSites_;
827  }
828 
831  {
832  return *validatorManifests_;
833  }
834 
837  {
838  return *publisherManifests_;
839  }
840 
841  Cluster&
842  cluster() override
843  {
844  return *cluster_;
845  }
846 
848  peerReservations() override
849  {
850  return *peerReservations_;
851  }
852 
853  SHAMapStore&
854  getSHAMapStore() override
855  {
856  return *m_shaMapStore;
857  }
858 
859  PendingSaves&
860  pendingSaves() override
861  {
862  return pendingSaves_;
863  }
864 
865  OpenLedger&
866  openLedger() override
867  {
868  if (config_->reporting())
869  Throw<ReportingShouldProxy>();
870  return *openLedger_;
871  }
872 
873  OpenLedger const&
874  openLedger() const override
875  {
876  if (config_->reporting())
877  Throw<ReportingShouldProxy>();
878  return *openLedger_;
879  }
880 
881  Overlay&
882  overlay() override
883  {
884  assert(overlay_);
885  return *overlay_;
886  }
887 
888  TxQ&
889  getTxQ() override
890  {
891  assert(txQ_.get() != nullptr);
892  return *txQ_;
893  }
894 
897  {
898  assert(mRelationalDatabase.get() != nullptr);
899  return *mRelationalDatabase;
900  }
901 
902  DatabaseCon&
903  getWalletDB() override
904  {
905  assert(mWalletDB.get() != nullptr);
906  return *mWalletDB;
907  }
908 
909  ReportingETL&
910  getReportingETL() override
911  {
912  assert(reportingETL_.get() != nullptr);
913  return *reportingETL_;
914  }
915 
916  bool
917  serverOkay(std::string& reason) override;
918 
920  journal(std::string const& name) override;
921 
922  //--------------------------------------------------------------------------
923 
924  bool
926  {
927  assert(mWalletDB.get() == nullptr);
928 
929  try
930  {
933 
934  // wallet database
936  setup.useGlobalPragma = false;
937 
939  }
940  catch (std::exception const& e)
941  {
942  JLOG(m_journal.fatal())
943  << "Failed to initialize SQL databases: " << e.what();
944  return false;
945  }
946 
947  return true;
948  }
949 
950  bool
952  {
953  if (config_->doImport)
954  {
955  auto j = logs_->journal("NodeObject");
956  NodeStore::DummyScheduler dummyScheduler;
959  megabytes(config_->getValueFor(
960  SizedItem::burstSize, std::nullopt)),
961  dummyScheduler,
962  0,
964  j);
965 
966  JLOG(j.warn()) << "Starting node import from '" << source->getName()
967  << "' to '" << m_nodeStore->getName() << "'.";
968 
969  using namespace std::chrono;
970  auto const start = steady_clock::now();
971 
972  m_nodeStore->importDatabase(*source);
973 
974  auto const elapsed =
975  duration_cast<seconds>(steady_clock::now() - start);
976  JLOG(j.warn()) << "Node import from '" << source->getName()
977  << "' took " << elapsed.count() << " seconds.";
978  }
979 
980  return true;
981  }
982 
983  //--------------------------------------------------------------------------
984  //
985  // PropertyStream
986  //
987 
988  void
990  {
991  }
992 
993  //--------------------------------------------------------------------------
994 
995  void
997  {
998  // Only start the timer if waitHandlerCounter_ is not yet joined.
999  if (auto optionalCountedHandler = waitHandlerCounter_.wrap(
1000  [this](boost::system::error_code const& e) {
1001  if (e.value() == boost::system::errc::success)
1002  {
1003  m_jobQueue->addJob(
1004  jtSWEEP, "sweep", [this]() { doSweep(); });
1005  }
1006  // Recover as best we can if an unexpected error occurs.
1007  if (e.value() != boost::system::errc::success &&
1008  e.value() != boost::asio::error::operation_aborted)
1009  {
1010  // Try again later and hope for the best.
1011  JLOG(m_journal.error())
1012  << "Sweep timer got error '" << e.message()
1013  << "'. Restarting timer.";
1014  setSweepTimer();
1015  }
1016  }))
1017  {
1018  using namespace std::chrono;
1019  sweepTimer_.expires_from_now(
1020  seconds{config_->SWEEP_INTERVAL.value_or(
1021  config_->getValueFor(SizedItem::sweepInterval))});
1022  sweepTimer_.async_wait(std::move(*optionalCountedHandler));
1023  }
1024  }
1025 
1026  void
1028  {
1029  // Only start the timer if waitHandlerCounter_ is not yet joined.
1030  if (auto optionalCountedHandler = waitHandlerCounter_.wrap(
1031  [this](boost::system::error_code const& e) {
1032  if (e.value() == boost::system::errc::success)
1033  {
1034  crypto_prng().mix_entropy();
1035  setEntropyTimer();
1036  }
1037  // Recover as best we can if an unexpected error occurs.
1038  if (e.value() != boost::system::errc::success &&
1039  e.value() != boost::asio::error::operation_aborted)
1040  {
1041  // Try again later and hope for the best.
1042  JLOG(m_journal.error())
1043  << "Entropy timer got error '" << e.message()
1044  << "'. Restarting timer.";
1045  setEntropyTimer();
1046  }
1047  }))
1048  {
1049  using namespace std::chrono_literals;
1050  entropyTimer_.expires_from_now(5min);
1051  entropyTimer_.async_wait(std::move(*optionalCountedHandler));
1052  }
1053  }
1054 
1055  void
1057  {
1058  if (!config_->standalone() &&
1059  !getRelationalDatabase().transactionDbHasSpace(*config_))
1060  {
1061  signalStop();
1062  }
1063 
1064  // VFALCO NOTE Does the order of calls matter?
1065  // VFALCO TODO fix the dependency inversion using an observer,
1066  // have listeners register for "onSweep ()" notification.
1067 
1068  {
1069  std::shared_ptr<FullBelowCache const> const fullBelowCache =
1071 
1072  std::shared_ptr<TreeNodeCache const> const treeNodeCache =
1074 
1075  std::size_t const oldFullBelowSize = fullBelowCache->size();
1076  std::size_t const oldTreeNodeSize = treeNodeCache->size();
1077 
1078  nodeFamily_.sweep();
1079 
1080  JLOG(m_journal.debug())
1081  << "NodeFamily::FullBelowCache sweep. Size before: "
1082  << oldFullBelowSize
1083  << "; size after: " << fullBelowCache->size();
1084 
1085  JLOG(m_journal.debug())
1086  << "NodeFamily::TreeNodeCache sweep. Size before: "
1087  << oldTreeNodeSize << "; size after: " << treeNodeCache->size();
1088  }
1089  if (shardFamily_)
1090  {
1091  std::size_t const oldFullBelowSize =
1092  shardFamily_->getFullBelowCacheSize();
1093  std::size_t const oldTreeNodeSize =
1094  shardFamily_->getTreeNodeCacheSize().second;
1095 
1096  shardFamily_->sweep();
1097 
1098  JLOG(m_journal.debug())
1099  << "ShardFamily::FullBelowCache sweep. Size before: "
1100  << oldFullBelowSize
1101  << "; size after: " << shardFamily_->getFullBelowCacheSize();
1102 
1103  JLOG(m_journal.debug())
1104  << "ShardFamily::TreeNodeCache sweep. Size before: "
1105  << oldTreeNodeSize << "; size after: "
1106  << shardFamily_->getTreeNodeCacheSize().second;
1107  }
1108  {
1109  TaggedCache<uint256, Transaction> const& masterTxCache =
1111 
1112  std::size_t const oldMasterTxSize = masterTxCache.size();
1113 
1115 
1116  JLOG(m_journal.debug())
1117  << "MasterTransaction sweep. Size before: " << oldMasterTxSize
1118  << "; size after: " << masterTxCache.size();
1119  }
1120  {
1121  // Does not appear to have an associated cache.
1122  getNodeStore().sweep();
1123  }
1124  if (shardStore_)
1125  {
1126  // Does not appear to have an associated cache.
1127  shardStore_->sweep();
1128  }
1129  {
1130  std::size_t const oldLedgerMasterCacheSize =
1132 
1133  getLedgerMaster().sweep();
1134 
1135  JLOG(m_journal.debug())
1136  << "LedgerMaster sweep. Size before: "
1137  << oldLedgerMasterCacheSize << "; size after: "
1139  }
1140  {
1141  // NodeCache == TaggedCache<SHAMapHash, Blob>
1142  std::size_t const oldTempNodeCacheSize = getTempNodeCache().size();
1143 
1144  getTempNodeCache().sweep();
1145 
1146  JLOG(m_journal.debug())
1147  << "TempNodeCache sweep. Size before: " << oldTempNodeCacheSize
1148  << "; size after: " << getTempNodeCache().size();
1149  }
1150  {
1151  std::size_t const oldCurrentCacheSize =
1153  std::size_t const oldSizeSeqEnforcesSize =
1155  std::size_t const oldByLedgerSize =
1157  std::size_t const oldBySequenceSize =
1159 
1161 
1162  JLOG(m_journal.debug())
1163  << "Validations Current expire. Size before: "
1164  << oldCurrentCacheSize
1165  << "; size after: " << getValidations().sizeOfCurrentCache();
1166 
1167  JLOG(m_journal.debug())
1168  << "Validations SeqEnforcer expire. Size before: "
1169  << oldSizeSeqEnforcesSize << "; size after: "
1171 
1172  JLOG(m_journal.debug())
1173  << "Validations ByLedger expire. Size before: "
1174  << oldByLedgerSize
1175  << "; size after: " << getValidations().sizeOfByLedgerCache();
1176 
1177  JLOG(m_journal.debug())
1178  << "Validations BySequence expire. Size before: "
1179  << oldBySequenceSize
1180  << "; size after: " << getValidations().sizeOfBySequenceCache();
1181  }
1182  {
1183  std::size_t const oldInboundLedgersSize =
1185 
1187 
1188  JLOG(m_journal.debug())
1189  << "InboundLedgers sweep. Size before: "
1190  << oldInboundLedgersSize
1191  << "; size after: " << getInboundLedgers().cacheSize();
1192  }
1193  {
1194  size_t const oldTasksSize = getLedgerReplayer().tasksSize();
1195  size_t const oldDeltasSize = getLedgerReplayer().deltasSize();
1196  size_t const oldSkipListsSize = getLedgerReplayer().skipListsSize();
1197 
1199 
1200  JLOG(m_journal.debug())
1201  << "LedgerReplayer tasks sweep. Size before: " << oldTasksSize
1202  << "; size after: " << getLedgerReplayer().tasksSize();
1203 
1204  JLOG(m_journal.debug())
1205  << "LedgerReplayer deltas sweep. Size before: "
1206  << oldDeltasSize
1207  << "; size after: " << getLedgerReplayer().deltasSize();
1208 
1209  JLOG(m_journal.debug())
1210  << "LedgerReplayer skipLists sweep. Size before: "
1211  << oldSkipListsSize
1212  << "; size after: " << getLedgerReplayer().skipListsSize();
1213  }
1214  {
1215  std::size_t const oldAcceptedLedgerSize =
1216  m_acceptedLedgerCache.size();
1217 
1218  m_acceptedLedgerCache.sweep();
1219 
1220  JLOG(m_journal.debug())
1221  << "AcceptedLedgerCache sweep. Size before: "
1222  << oldAcceptedLedgerSize
1223  << "; size after: " << m_acceptedLedgerCache.size();
1224  }
1225  {
1226  std::size_t const oldCachedSLEsSize = cachedSLEs_.size();
1227 
1228  cachedSLEs_.sweep();
1229 
1230  JLOG(m_journal.debug())
1231  << "CachedSLEs sweep. Size before: " << oldCachedSLEsSize
1232  << "; size after: " << cachedSLEs_.size();
1233  }
1234 
1235 #ifdef RIPPLED_REPORTING
1236  if (auto pg = dynamic_cast<PostgresDatabase*>(&*mRelationalDatabase))
1237  pg->sweep();
1238 #endif
1239 
1240  // Set timer to do another sweep later.
1241  setSweepTimer();
1242  }
1243 
1244  LedgerIndex
1246  {
1247  return maxDisallowedLedger_;
1248  }
1249 
1250 private:
1251  // For a newly-started validator, this is the greatest persisted ledger
1252  // and new validations must be greater than this.
1254 
1255  bool
1256  nodeToShards();
1257 
1258  void
1260 
1263 
1265  loadLedgerFromFile(std::string const& ledgerID);
1266 
1267  bool
1268  loadOldLedger(std::string const& ledgerID, bool replay, bool isFilename);
1269 
1270  void
1272 };
1273 
1274 //------------------------------------------------------------------------------
1275 
1276 // TODO Break this up into smaller, more digestible initialization segments.
1277 bool
1278 ApplicationImp::setup(boost::program_options::variables_map const& cmdline)
1279 {
1280  // We want to intercept CTRL-C and the standard termination signal SIGTERM
1281  // and terminate the process. This handler will NEVER be invoked twice.
1282  //
1283  // Note that async_wait is "one-shot": for each call, the handler will be
1284  // invoked exactly once, either when one of the registered signals in the
1285  // signal set occurs or the signal set is cancelled. Subsequent signals are
1286  // effectively ignored (technically, they are queued up, waiting for a call
1287  // to async_wait).
1288  m_signals.add(SIGINT);
1289  m_signals.add(SIGTERM);
1290  m_signals.async_wait(
1291  [this](boost::system::error_code const& ec, int signum) {
1292  // Indicates the signal handler has been aborted; do nothing
1293  if (ec == boost::asio::error::operation_aborted)
1294  return;
1295 
1296  JLOG(m_journal.info()) << "Received signal " << signum;
1297 
1298  if (signum == SIGTERM || signum == SIGINT)
1299  signalStop();
1300  });
1301 
1302  auto debug_log = config_->getDebugLogFile();
1303 
1304  if (!debug_log.empty())
1305  {
1306  // Let debug messages go to the file but only WARNING or higher to
1307  // regular output (unless verbose)
1308 
1309  if (!logs_->open(debug_log))
1310  std::cerr << "Can't open log file " << debug_log << '\n';
1311 
1312  using namespace beast::severities;
1313  if (logs_->threshold() > kDebug)
1314  logs_->threshold(kDebug);
1315  }
1316 
1317  JLOG(m_journal.info()) << "Process starting: "
1319  << ", Instance Cookie: " << instanceCookie_;
1320 
1321  if (numberOfThreads(*config_) < 2)
1322  {
1323  JLOG(m_journal.warn()) << "Limited to a single I/O service thread by "
1324  "system configuration.";
1325  }
1326 
1327  // Optionally turn off logging to console.
1328  logs_->silent(config_->silent());
1329 
1331  return false;
1332 
1333  if (shardStore_)
1334  {
1335  shardFamily_ =
1336  std::make_unique<ShardFamily>(*this, *m_collectorManager);
1337 
1338  if (!shardStore_->init())
1339  return false;
1340  }
1341 
1342  if (!peerReservations_->load(getWalletDB()))
1343  {
1344  JLOG(m_journal.fatal()) << "Cannot find peer reservations!";
1345  return false;
1346  }
1347 
1350 
1351  // Configure the amendments the server supports
1352  {
1353  auto const supported = []() {
1354  auto const& amendments = detail::supportedAmendments();
1356  supported.reserve(amendments.size());
1357  for (auto const& [a, vote] : amendments)
1358  {
1359  auto const f = ripple::getRegisteredFeature(a);
1360  assert(f);
1361  if (f)
1362  supported.emplace_back(a, *f, vote);
1363  }
1364  return supported;
1365  }();
1366  Section const& downVoted = config_->section(SECTION_VETO_AMENDMENTS);
1367 
1368  Section const& upVoted = config_->section(SECTION_AMENDMENTS);
1369 
1371  *this,
1372  config().AMENDMENT_MAJORITY_TIME,
1373  supported,
1374  upVoted,
1375  downVoted,
1376  logs_->journal("Amendments"));
1377  }
1378 
1380 
1381  auto const startUp = config_->START_UP;
1382  JLOG(m_journal.debug()) << "startUp: " << startUp;
1383  if (!config_->reporting())
1384  {
1385  if (startUp == Config::FRESH)
1386  {
1387  JLOG(m_journal.info()) << "Starting new Ledger";
1388 
1390  }
1391  else if (
1392  startUp == Config::LOAD || startUp == Config::LOAD_FILE ||
1393  startUp == Config::REPLAY)
1394  {
1395  JLOG(m_journal.info()) << "Loading specified Ledger";
1396 
1397  if (!loadOldLedger(
1398  config_->START_LEDGER,
1399  startUp == Config::REPLAY,
1400  startUp == Config::LOAD_FILE))
1401  {
1402  JLOG(m_journal.error())
1403  << "The specified ledger could not be loaded.";
1404  if (config_->FAST_LOAD)
1405  {
1406  // Fall back to syncing from the network, such as
1407  // when there's no existing data.
1409  }
1410  else
1411  {
1412  return false;
1413  }
1414  }
1415  }
1416  else if (startUp == Config::NETWORK)
1417  {
1418  // This should probably become the default once we have a stable
1419  // network.
1420  if (!config_->standalone())
1421  m_networkOPs->setNeedNetworkLedger();
1422 
1424  }
1425  else
1426  {
1428  }
1429  }
1430 
1431  if (auto const& forcedRange = config().FORCED_LEDGER_RANGE_PRESENT)
1432  {
1433  m_ledgerMaster->setLedgerRangePresent(
1434  forcedRange->first, forcedRange->second);
1435  }
1436 
1437  if (!config().reporting())
1438  m_orderBookDB.setup(getLedgerMaster().getCurrentLedger());
1439 
1440  nodeIdentity_ = getNodeIdentity(*this, cmdline);
1441 
1442  if (!cluster_->load(config().section(SECTION_CLUSTER_NODES)))
1443  {
1444  JLOG(m_journal.fatal()) << "Invalid entry in cluster configuration.";
1445  return false;
1446  }
1447 
1448  if (!config().reporting())
1449  {
1450  {
1452  return false;
1453 
1454  if (!validatorManifests_->load(
1455  getWalletDB(),
1456  "ValidatorManifests",
1458  config()
1459  .section(SECTION_VALIDATOR_KEY_REVOCATION)
1460  .values()))
1461  {
1462  JLOG(m_journal.fatal())
1463  << "Invalid configured validator manifest.";
1464  return false;
1465  }
1466 
1467  publisherManifests_->load(getWalletDB(), "PublisherManifests");
1468 
1469  // Setup trusted validators
1470  if (!validators_->load(
1472  config().section(SECTION_VALIDATORS).values(),
1473  config().section(SECTION_VALIDATOR_LIST_KEYS).values()))
1474  {
1475  JLOG(m_journal.fatal())
1476  << "Invalid entry in validator configuration.";
1477  return false;
1478  }
1479  }
1480 
1481  if (!validatorSites_->load(
1482  config().section(SECTION_VALIDATOR_LIST_SITES).values()))
1483  {
1484  JLOG(m_journal.fatal())
1485  << "Invalid entry in [" << SECTION_VALIDATOR_LIST_SITES << "]";
1486  return false;
1487  }
1488 
1489  // Tell the AmendmentTable who the trusted validators are.
1490  m_amendmentTable->trustChanged(validators_->getQuorumKeys().second);
1491  }
1492  //----------------------------------------------------------------------
1493  //
1494  // Server
1495  //
1496  //----------------------------------------------------------------------
1497 
1498  // VFALCO NOTE Unfortunately, in stand-alone mode some code still
1499  // foolishly calls overlay(). When this is fixed we can
1500  // move the instantiation inside a conditional:
1501  //
1502  // if (!config_.standalone())
1503  if (!config_->reporting())
1504  {
1506  *this,
1508  *serverHandler_,
1510  *m_resolver,
1511  get_io_service(),
1512  *config_,
1513  m_collectorManager->collector());
1514  add(*overlay_); // add to PropertyStream
1515  }
1516 
1517  if (!config_->standalone())
1518  {
1519  // NodeStore import into the ShardStore requires the SQLite database
1520  if (config_->nodeToShard && !nodeToShards())
1521  return false;
1522  }
1523 
1524  // start first consensus round
1525  if (!config_->reporting() &&
1526  !m_networkOPs->beginConsensus(
1527  m_ledgerMaster->getClosedLedger()->info().hash))
1528  {
1529  JLOG(m_journal.fatal()) << "Unable to start consensus";
1530  return false;
1531  }
1532 
1533  {
1534  try
1535  {
1536  auto setup = setup_ServerHandler(
1538  setup.makeContexts();
1539  serverHandler_->setup(setup, m_journal);
1540  }
1541  catch (std::exception const& e)
1542  {
1543  if (auto stream = m_journal.fatal())
1544  {
1545  stream << "Unable to setup server handler";
1546  if (std::strlen(e.what()) > 0)
1547  stream << ": " << e.what();
1548  }
1549  return false;
1550  }
1551  }
1552 
1553  // Begin connecting to network.
1554  if (!config_->standalone())
1555  {
1556  // Should this message be here, conceptually? In theory this sort
1557  // of message, if displayed, should be displayed from PeerFinder.
1558  if (config_->PEER_PRIVATE && config_->IPS_FIXED.empty())
1559  {
1560  JLOG(m_journal.warn())
1561  << "No outbound peer connections will be made";
1562  }
1563 
1564  // VFALCO NOTE the state timer resets the deadlock detector.
1565  //
1566  m_networkOPs->setStateTimer();
1567  }
1568  else
1569  {
1570  JLOG(m_journal.warn()) << "Running in standalone mode";
1571 
1572  m_networkOPs->setStandAlone();
1573  }
1574 
1575  if (config_->canSign())
1576  {
1577  JLOG(m_journal.warn()) << "*** The server is configured to allow the "
1578  "'sign' and 'sign_for'";
1579  JLOG(m_journal.warn()) << "*** commands. These commands have security "
1580  "implications and have";
1581  JLOG(m_journal.warn()) << "*** been deprecated. They will be removed "
1582  "in a future release of";
1583  JLOG(m_journal.warn()) << "*** rippled.";
1584  JLOG(m_journal.warn()) << "*** If you do not use them to sign "
1585  "transactions please edit your";
1586  JLOG(m_journal.warn())
1587  << "*** configuration file and remove the [enable_signing] stanza.";
1588  JLOG(m_journal.warn()) << "*** If you do use them to sign transactions "
1589  "please migrate to a";
1590  JLOG(m_journal.warn())
1591  << "*** standalone signing solution as soon as possible.";
1592  }
1593 
1594  //
1595  // Execute start up rpc commands.
1596  //
1597  for (auto cmd : config_->section(SECTION_RPC_STARTUP).lines())
1598  {
1599  Json::Reader jrReader;
1600  Json::Value jvCommand;
1601 
1602  if (!jrReader.parse(cmd, jvCommand))
1603  {
1604  JLOG(m_journal.fatal()) << "Couldn't parse entry in ["
1605  << SECTION_RPC_STARTUP << "]: '" << cmd;
1606  }
1607 
1608  if (!config_->quiet())
1609  {
1610  JLOG(m_journal.fatal())
1611  << "Startup RPC: " << jvCommand << std::endl;
1612  }
1613 
1616  RPC::JsonContext context{
1617  {journal("RPCHandler"),
1618  *this,
1619  loadType,
1620  getOPs(),
1621  getLedgerMaster(),
1622  c,
1623  Role::ADMIN,
1624  {},
1625  {},
1627  jvCommand};
1628 
1629  Json::Value jvResult;
1630  RPC::doCommand(context, jvResult);
1631 
1632  if (!config_->quiet())
1633  {
1634  JLOG(m_journal.fatal()) << "Result: " << jvResult << std::endl;
1635  }
1636  }
1637 
1638  RPC::ShardArchiveHandler* shardArchiveHandler = nullptr;
1639  if (shardStore_)
1640  {
1641  try
1642  {
1643  // Create a ShardArchiveHandler if recovery
1644  // is needed (there's a state database left
1645  // over from a previous run).
1646  auto handler = getShardArchiveHandler(true);
1647 
1648  // Recovery is needed.
1649  if (handler)
1650  shardArchiveHandler = handler;
1651  }
1652  catch (std::exception const& e)
1653  {
1654  JLOG(m_journal.fatal())
1655  << "Exception when starting ShardArchiveHandler from "
1656  "state database: "
1657  << e.what();
1658 
1659  return false;
1660  }
1661  }
1662 
1663  if (shardArchiveHandler && !shardArchiveHandler->start())
1664  {
1665  JLOG(m_journal.fatal()) << "Failed to start ShardArchiveHandler.";
1666 
1667  return false;
1668  }
1669 
1670  validatorSites_->start();
1671 
1672  if (reportingETL_)
1673  reportingETL_->start();
1674 
1675  return true;
1676 }
1677 
1678 void
1679 ApplicationImp::start(bool withTimers)
1680 {
1681  JLOG(m_journal.info()) << "Application starting. Version is "
1683 
1684  if (withTimers)
1685  {
1686  setSweepTimer();
1687  setEntropyTimer();
1688  }
1689 
1691  m_resolver->start();
1692  m_loadManager->start();
1693  m_shaMapStore->start();
1694  if (overlay_)
1695  overlay_->start();
1696  grpcServer_->start();
1697  ledgerCleaner_->start();
1698  perfLog_->start();
1699 }
1700 
1701 void
1703 {
1704  if (!config_->standalone())
1705  {
1706  // VFALCO NOTE This seems unnecessary. If we properly refactor the load
1707  // manager then the deadlock detector can just always be
1708  // "armed"
1709  //
1711  }
1712 
1713  {
1715  stoppingCondition_.wait(lk, [this] { return isTimeToStop.load(); });
1716  }
1717 
1718  JLOG(m_journal.debug()) << "Application stopping";
1719 
1721 
1722  // VFALCO Enormous hack, we have to force the probe to cancel
1723  // before we stop the io_service queue or else it never
1724  // unblocks in its destructor. The fix is to make all
1725  // io_objects gracefully handle exit so that we can
1726  // naturally return from io_service::run() instead of
1727  // forcing a call to io_service::stop()
1729 
1730  m_resolver->stop_async();
1731 
1732  // NIKB This is a hack - we need to wait for the resolver to
1733  // stop. before we stop the io_server_queue or weird
1734  // things will happen.
1735  m_resolver->stop();
1736 
1737  {
1738  boost::system::error_code ec;
1739  sweepTimer_.cancel(ec);
1740  if (ec)
1741  {
1742  JLOG(m_journal.error())
1743  << "Application: sweepTimer cancel error: " << ec.message();
1744  }
1745 
1746  ec.clear();
1747  entropyTimer_.cancel(ec);
1748  if (ec)
1749  {
1750  JLOG(m_journal.error())
1751  << "Application: entropyTimer cancel error: " << ec.message();
1752  }
1753  }
1754 
1755  // Make sure that any waitHandlers pending in our timers are done
1756  // before we declare ourselves stopped.
1757  using namespace std::chrono_literals;
1758 
1759  waitHandlerCounter_.join("Application", 1s, m_journal);
1760 
1761  mValidations.flush();
1762 
1763  validatorSites_->stop();
1764 
1765  // TODO Store manifests in manifests.sqlite instead of wallet.db
1766  validatorManifests_->save(
1767  getWalletDB(), "ValidatorManifests", [this](PublicKey const& pubKey) {
1768  return validators().listed(pubKey);
1769  });
1770 
1771  publisherManifests_->save(
1772  getWalletDB(), "PublisherManifests", [this](PublicKey const& pubKey) {
1773  return validators().trustedPublisher(pubKey);
1774  });
1775 
1776  // The order of these stop calls is delicate.
1777  // Re-ordering them risks undefined behavior.
1778  m_loadManager->stop();
1779  m_shaMapStore->stop();
1780  m_jobQueue->stop();
1782  shardArchiveHandler_->stop();
1783  if (overlay_)
1784  overlay_->stop();
1785  if (shardStore_)
1786  shardStore_->stop();
1787  grpcServer_->stop();
1788  m_networkOPs->stop();
1789  serverHandler_->stop();
1790  m_ledgerReplayer->stop();
1791  m_inboundTransactions->stop();
1792  m_inboundLedgers->stop();
1793  ledgerCleaner_->stop();
1794  if (reportingETL_)
1795  reportingETL_->stop();
1796  if (auto pg = dynamic_cast<PostgresDatabase*>(&*mRelationalDatabase))
1797  pg->stop();
1798  m_nodeStore->stop();
1799  perfLog_->stop();
1800 
1801  JLOG(m_journal.info()) << "Done.";
1802 }
1803 
1804 void
1806 {
1807  if (!isTimeToStop.exchange(true))
1808  {
1809  if (msg.empty())
1810  JLOG(m_journal.warn()) << "Server stopping";
1811  else
1812  JLOG(m_journal.warn()) << "Server stopping: " << msg;
1813 
1815  }
1816 }
1817 
1818 bool
1820 {
1821  return checkSigs_;
1822 }
1823 
1824 void
1826 {
1827  checkSigs_ = check;
1828 }
1829 
1830 bool
1832 {
1833  return isTimeToStop.load();
1834 }
1835 
1836 int
1838 {
1839  // Standard handles, config file, misc I/O etc:
1840  int needed = 128;
1841 
1842  // 2x the configured peer limit for peer connections:
1843  if (overlay_)
1844  needed += 2 * overlay_->limit();
1845 
1846  // the number of fds needed by the backend (internally
1847  // doubled if online delete is enabled).
1848  needed += std::max(5, m_shaMapStore->fdRequired());
1849 
1850  if (shardStore_)
1851  needed += shardStore_->fdRequired();
1852 
1853  // One fd per incoming connection a port can accept, or
1854  // if no limit is set, assume it'll handle 256 clients.
1855  for (auto const& p : serverHandler_->setup().ports)
1856  needed += std::max(256, p.limit);
1857 
1858  // The minimum number of file descriptors we need is 1024:
1859  return std::max(1024, needed);
1860 }
1861 
1862 //------------------------------------------------------------------------------
1863 
1864 void
1866 {
1867  std::vector<uint256> const initialAmendments =
1868  (config_->START_UP == Config::FRESH) ? m_amendmentTable->getDesired()
1870 
1871  std::shared_ptr<Ledger> const genesis = std::make_shared<Ledger>(
1872  create_genesis, *config_, initialAmendments, nodeFamily_);
1873  m_ledgerMaster->storeLedger(genesis);
1874 
1875  auto const next =
1876  std::make_shared<Ledger>(*genesis, timeKeeper().closeTime());
1877  next->updateSkipList();
1878  assert(
1879  next->info().seq < XRP_LEDGER_EARLIEST_FEES ||
1880  next->read(keylet::fees()));
1881  next->setImmutable();
1882  openLedger_.emplace(next, cachedSLEs_, logs_->journal("OpenLedger"));
1883  m_ledgerMaster->storeLedger(next);
1884  m_ledgerMaster->switchLCL(next);
1885 }
1886 
1889 {
1890  auto j = journal("Ledger");
1891 
1892  try
1893  {
1894  auto const [ledger, seq, hash] = getLatestLedger(*this);
1895 
1896  if (!ledger)
1897  return ledger;
1898 
1899  assert(
1900  ledger->info().seq < XRP_LEDGER_EARLIEST_FEES ||
1901  ledger->read(keylet::fees()));
1902  ledger->setImmutable();
1903 
1904  if (getLedgerMaster().haveLedger(seq))
1905  ledger->setValidated();
1906 
1907  if (ledger->info().hash == hash)
1908  {
1909  JLOG(j.trace()) << "Loaded ledger: " << hash;
1910  return ledger;
1911  }
1912 
1913  if (auto stream = j.error())
1914  {
1915  stream << "Failed on ledger";
1916  Json::Value p;
1917  addJson(p, {*ledger, nullptr, LedgerFill::full});
1918  stream << p;
1919  }
1920 
1921  return {};
1922  }
1923  catch (SHAMapMissingNode const& mn)
1924  {
1925  JLOG(j.warn()) << "Ledger in database: " << mn.what();
1926  return {};
1927  }
1928 }
1929 
1932 {
1933  try
1934  {
1935  std::ifstream ledgerFile(name, std::ios::in);
1936 
1937  if (!ledgerFile)
1938  {
1939  JLOG(m_journal.fatal()) << "Unable to open file '" << name << "'";
1940  return nullptr;
1941  }
1942 
1943  Json::Reader reader;
1944  Json::Value jLedger;
1945 
1946  if (!reader.parse(ledgerFile, jLedger))
1947  {
1948  JLOG(m_journal.fatal()) << "Unable to parse ledger JSON";
1949  return nullptr;
1950  }
1951 
1952  std::reference_wrapper<Json::Value> ledger(jLedger);
1953 
1954  // accept a wrapped ledger
1955  if (ledger.get().isMember("result"))
1956  ledger = ledger.get()["result"];
1957 
1958  if (ledger.get().isMember("ledger"))
1959  ledger = ledger.get()["ledger"];
1960 
1961  std::uint32_t seq = 1;
1962  auto closeTime = timeKeeper().closeTime();
1963  using namespace std::chrono_literals;
1964  auto closeTimeResolution = 30s;
1965  bool closeTimeEstimated = false;
1966  std::uint64_t totalDrops = 0;
1967 
1968  if (ledger.get().isMember("accountState"))
1969  {
1970  if (ledger.get().isMember(jss::ledger_index))
1971  {
1972  seq = ledger.get()[jss::ledger_index].asUInt();
1973  }
1974 
1975  if (ledger.get().isMember("close_time"))
1976  {
1977  using tp = NetClock::time_point;
1978  using d = tp::duration;
1979  closeTime = tp{d{ledger.get()["close_time"].asUInt()}};
1980  }
1981  if (ledger.get().isMember("close_time_resolution"))
1982  {
1983  using namespace std::chrono;
1984  closeTimeResolution =
1985  seconds{ledger.get()["close_time_resolution"].asUInt()};
1986  }
1987  if (ledger.get().isMember("close_time_estimated"))
1988  {
1989  closeTimeEstimated =
1990  ledger.get()["close_time_estimated"].asBool();
1991  }
1992  if (ledger.get().isMember("total_coins"))
1993  {
1994  totalDrops = beast::lexicalCastThrow<std::uint64_t>(
1995  ledger.get()["total_coins"].asString());
1996  }
1997 
1998  ledger = ledger.get()["accountState"];
1999  }
2000 
2001  if (!ledger.get().isArrayOrNull())
2002  {
2003  JLOG(m_journal.fatal()) << "State nodes must be an array";
2004  return nullptr;
2005  }
2006 
2007  auto loadLedger =
2008  std::make_shared<Ledger>(seq, closeTime, *config_, nodeFamily_);
2009  loadLedger->setTotalDrops(totalDrops);
2010 
2011  for (Json::UInt index = 0; index < ledger.get().size(); ++index)
2012  {
2013  Json::Value& entry = ledger.get()[index];
2014 
2015  if (!entry.isObjectOrNull())
2016  {
2017  JLOG(m_journal.fatal()) << "Invalid entry in ledger";
2018  return nullptr;
2019  }
2020 
2021  uint256 uIndex;
2022 
2023  if (!uIndex.parseHex(entry[jss::index].asString()))
2024  {
2025  JLOG(m_journal.fatal()) << "Invalid entry in ledger";
2026  return nullptr;
2027  }
2028 
2029  entry.removeMember(jss::index);
2030 
2031  STParsedJSONObject stp("sle", ledger.get()[index]);
2032 
2033  if (!stp.object || uIndex.isZero())
2034  {
2035  JLOG(m_journal.fatal()) << "Invalid entry in ledger";
2036  return nullptr;
2037  }
2038 
2039  // VFALCO TODO This is the only place that
2040  // constructor is used, try to remove it
2041  STLedgerEntry sle(*stp.object, uIndex);
2042 
2043  if (!loadLedger->addSLE(sle))
2044  {
2045  JLOG(m_journal.fatal())
2046  << "Couldn't add serialized ledger: " << uIndex;
2047  return nullptr;
2048  }
2049  }
2050 
2051  loadLedger->stateMap().flushDirty(hotACCOUNT_NODE);
2052 
2053  assert(
2054  loadLedger->info().seq < XRP_LEDGER_EARLIEST_FEES ||
2055  loadLedger->read(keylet::fees()));
2056  loadLedger->setAccepted(
2057  closeTime, closeTimeResolution, !closeTimeEstimated);
2058 
2059  return loadLedger;
2060  }
2061  catch (std::exception const& x)
2062  {
2063  JLOG(m_journal.fatal()) << "Ledger contains invalid data: " << x.what();
2064  return nullptr;
2065  }
2066 }
2067 
2068 bool
2070  std::string const& ledgerID,
2071  bool replay,
2072  bool isFileName)
2073 {
2074  try
2075  {
2076  std::shared_ptr<Ledger const> loadLedger, replayLedger;
2077 
2078  if (isFileName)
2079  {
2080  if (!ledgerID.empty())
2081  loadLedger = loadLedgerFromFile(ledgerID);
2082  }
2083  else if (ledgerID.length() == 64)
2084  {
2085  uint256 hash;
2086 
2087  if (hash.parseHex(ledgerID))
2088  {
2089  loadLedger = loadByHash(hash, *this);
2090 
2091  if (!loadLedger)
2092  {
2093  // Try to build the ledger from the back end
2094  auto il = std::make_shared<InboundLedger>(
2095  *this,
2096  hash,
2097  0,
2099  stopwatch(),
2100  make_DummyPeerSet(*this));
2101  if (il->checkLocal())
2102  loadLedger = il->getLedger();
2103  }
2104  }
2105  }
2106  else if (ledgerID.empty() || boost::iequals(ledgerID, "latest"))
2107  {
2108  loadLedger = getLastFullLedger();
2109  }
2110  else
2111  {
2112  // assume by sequence
2113  std::uint32_t index;
2114 
2115  if (beast::lexicalCastChecked(index, ledgerID))
2116  loadLedger = loadByIndex(index, *this);
2117  }
2118 
2119  if (!loadLedger)
2120  return false;
2121 
2122  if (replay)
2123  {
2124  // Replay a ledger close with same prior ledger and transactions
2125 
2126  // this ledger holds the transactions we want to replay
2127  replayLedger = loadLedger;
2128 
2129  JLOG(m_journal.info()) << "Loading parent ledger";
2130 
2131  loadLedger = loadByHash(replayLedger->info().parentHash, *this);
2132  if (!loadLedger)
2133  {
2134  JLOG(m_journal.info())
2135  << "Loading parent ledger from node store";
2136 
2137  // Try to build the ledger from the back end
2138  auto il = std::make_shared<InboundLedger>(
2139  *this,
2140  replayLedger->info().parentHash,
2141  0,
2143  stopwatch(),
2144  make_DummyPeerSet(*this));
2145 
2146  if (il->checkLocal())
2147  loadLedger = il->getLedger();
2148 
2149  if (!loadLedger)
2150  {
2151  JLOG(m_journal.fatal()) << "Replay ledger missing/damaged";
2152  assert(false);
2153  return false;
2154  }
2155  }
2156  }
2157  using namespace std::chrono_literals;
2158  using namespace date;
2159  static constexpr NetClock::time_point ledgerWarnTimePoint{
2160  sys_days{January / 1 / 2018} - sys_days{January / 1 / 2000}};
2161  if (loadLedger->info().closeTime < ledgerWarnTimePoint)
2162  {
2163  JLOG(m_journal.fatal())
2164  << "\n\n*** WARNING ***\n"
2165  "You are replaying a ledger from before "
2166  << to_string(ledgerWarnTimePoint)
2167  << " UTC.\n"
2168  "This replay will not handle your ledger as it was "
2169  "originally "
2170  "handled.\nConsider running an earlier version of rippled "
2171  "to "
2172  "get the older rules.\n*** CONTINUING ***\n";
2173  }
2174 
2175  JLOG(m_journal.info()) << "Loading ledger " << loadLedger->info().hash
2176  << " seq:" << loadLedger->info().seq;
2177 
2178  if (loadLedger->info().accountHash.isZero())
2179  {
2180  JLOG(m_journal.fatal()) << "Ledger is empty.";
2181  assert(false);
2182  return false;
2183  }
2184 
2185  if (!loadLedger->walkLedger(journal("Ledger"), true))
2186  {
2187  JLOG(m_journal.fatal()) << "Ledger is missing nodes.";
2188  assert(false);
2189  return false;
2190  }
2191 
2192  if (!loadLedger->assertSensible(journal("Ledger")))
2193  {
2194  JLOG(m_journal.fatal()) << "Ledger is not sensible.";
2195  assert(false);
2196  return false;
2197  }
2198 
2199  m_ledgerMaster->setLedgerRangePresent(
2200  loadLedger->info().seq, loadLedger->info().seq);
2201 
2202  m_ledgerMaster->switchLCL(loadLedger);
2203  loadLedger->setValidated();
2204  m_ledgerMaster->setFullLedger(loadLedger, true, false);
2205  openLedger_.emplace(
2206  loadLedger, cachedSLEs_, logs_->journal("OpenLedger"));
2207 
2208  if (replay)
2209  {
2210  // inject transaction(s) from the replayLedger into our open ledger
2211  // and build replay structure
2212  auto replayData =
2213  std::make_unique<LedgerReplay>(loadLedger, replayLedger);
2214 
2215  for (auto const& [_, tx] : replayData->orderedTxns())
2216  {
2217  (void)_;
2218  auto txID = tx->getTransactionID();
2219 
2220  auto s = std::make_shared<Serializer>();
2221  tx->add(*s);
2222 
2224 
2225  openLedger_->modify(
2226  [&txID, &s](OpenView& view, beast::Journal j) {
2227  view.rawTxInsert(txID, std::move(s), nullptr);
2228  return true;
2229  });
2230  }
2231 
2232  m_ledgerMaster->takeReplay(std::move(replayData));
2233  }
2234  }
2235  catch (SHAMapMissingNode const& mn)
2236  {
2237  JLOG(m_journal.fatal())
2238  << "While loading specified ledger: " << mn.what();
2239  return false;
2240  }
2241  catch (boost::bad_lexical_cast&)
2242  {
2243  JLOG(m_journal.fatal())
2244  << "Ledger specified '" << ledgerID << "' is not valid";
2245  return false;
2246  }
2247 
2248  return true;
2249 }
2250 
2251 bool
2253 {
2254  if (!config().ELB_SUPPORT)
2255  return true;
2256 
2257  if (isStopping())
2258  {
2259  reason = "Server is shutting down";
2260  return false;
2261  }
2262 
2263  if (getOPs().isNeedNetworkLedger())
2264  {
2265  reason = "Not synchronized with network yet";
2266  return false;
2267  }
2268 
2269  if (getOPs().isAmendmentBlocked())
2270  {
2271  reason = "Server version too old";
2272  return false;
2273  }
2274 
2275  if (getOPs().isUNLBlocked())
2276  {
2277  reason = "No valid validator list available";
2278  return false;
2279  }
2280 
2281  if (getOPs().getOperatingMode() < OperatingMode::SYNCING)
2282  {
2283  reason = "Not synchronized with network";
2284  return false;
2285  }
2286 
2287  if (!getLedgerMaster().isCaughtUp(reason))
2288  return false;
2289 
2290  if (getFeeTrack().isLoadedLocal())
2291  {
2292  reason = "Too much load";
2293  return false;
2294  }
2295 
2296  return true;
2297 }
2298 
2301 {
2302  return logs_->journal(name);
2303 }
2304 
2305 bool
2307 {
2308  assert(overlay_);
2309  assert(!config_->standalone());
2310 
2311  if (config_->section(ConfigSection::shardDatabase()).empty())
2312  {
2313  JLOG(m_journal.fatal())
2314  << "The [shard_db] configuration setting must be set";
2315  return false;
2316  }
2317  if (!shardStore_)
2318  {
2319  JLOG(m_journal.fatal()) << "Invalid [shard_db] configuration";
2320  return false;
2321  }
2322  shardStore_->importDatabase(getNodeStore());
2323  return true;
2324 }
2325 
2326 void
2328 {
2329  auto seq = getRelationalDatabase().getMaxLedgerSeq();
2330  if (seq)
2331  maxDisallowedLedger_ = *seq;
2332 
2333  JLOG(m_journal.trace())
2334  << "Max persisted ledger is " << maxDisallowedLedger_;
2335 }
2336 
2337 //------------------------------------------------------------------------------
2338 
2339 Application::Application() : beast::PropertyStream::Source("app")
2340 {
2341 }
2342 
2343 //------------------------------------------------------------------------------
2344 
2347  std::unique_ptr<Config> config,
2348  std::unique_ptr<Logs> logs,
2349  std::unique_ptr<TimeKeeper> timeKeeper)
2350 {
2351  return std::make_unique<ApplicationImp>(
2352  std::move(config), std::move(logs), std::move(timeKeeper));
2353 }
2354 
2355 } // namespace ripple
ripple::NodeStoreScheduler
A NodeStore::Scheduler which uses the JobQueue.
Definition: NodeStoreScheduler.h:30
beast::PropertyStream::Source::name
std::string const & name() const
Returns the name of this source.
Definition: beast_PropertyStream.cpp:190
ripple::ApplicationImp::m_resourceManager
std::unique_ptr< Resource::Manager > m_resourceManager
Definition: Application.cpp:191
ripple::ValidatorKeys::publicKey
PublicKey publicKey
Definition: ValidatorKeys.h:40
beast::Journal::fatal
Stream fatal() const
Definition: Journal.h:338
ripple::setup_TxQ
TxQ::Setup setup_TxQ(Config const &config)
Build a TxQ::Setup object from application configuration.
Definition: TxQ.cpp:1885
ripple::ApplicationImp::getReportingETL
ReportingETL & getReportingETL() override
Definition: Application.cpp:910
ripple::NodeStore::DummyScheduler
Simple NodeStore Scheduler that just peforms the tasks synchronously.
Definition: DummyScheduler.h:29
ripple::ApplicationImp::getValidationPublicKey
PublicKey const & getValidationPublicKey() const override
Definition: Application.cpp:594
ripple::ApplicationImp::m_tempNodeCache
NodeCache m_tempNodeCache
Definition: Application.cpp:186
ripple::Section
Holds a collection of configuration values.
Definition: BasicConfig.h:42
ripple::NetworkOPs
Provides server functionality for clients.
Definition: NetworkOPs.h:86
ripple::ApplicationImp::openLedger_
std::optional< OpenLedger > openLedger_
Definition: Application.cpp:184
ripple::RelationalDatabase::init
static std::unique_ptr< RelationalDatabase > init(Application &app, Config const &config, JobQueue &jobQueue)
init Creates and returns an appropriate RelationalDatabase instance based on configuration.
Definition: RelationalDatabase.cpp:34
ripple::ApplicationImp::m_ledgerReplayer
std::unique_ptr< LedgerReplayer > m_ledgerReplayer
Definition: Application.cpp:205
ripple::ApplicationImp::shardStore_
std::unique_ptr< NodeStore::DatabaseShard > shardStore_
Definition: Application.cpp:195
ripple::make_DummyPeerSet
std::unique_ptr< PeerSet > make_DummyPeerSet(Application &app)
Make a dummy PeerSet that does not do anything.
Definition: PeerSet.cpp:187
ripple::RelationalDatabase::getMaxLedgerSeq
virtual std::optional< LedgerIndex > getMaxLedgerSeq()=0
getMaxLedgerSeq Returns the maximum ledger sequence in the Ledgers table.
ripple::Application
Definition: Application.h:116
sstream
ripple::RPC::JsonContext
Definition: Context.h:53
ripple::ApplicationImp::ledgerCleaner_
std::unique_ptr< LedgerCleaner > ledgerCleaner_
Definition: Application.cpp:202
ripple::LoadManager::activateDeadlockDetector
void activateDeadlockDetector()
Turn on deadlock detection.
Definition: LoadManager.cpp:55
ripple::ApplicationImp::m_inboundTransactions
std::unique_ptr< InboundTransactions > m_inboundTransactions
Definition: Application.cpp:204
ripple::NodeStore::make_ShardStore
std::unique_ptr< DatabaseShard > make_ShardStore(Application &app, Scheduler &scheduler, int readThreads, beast::Journal j)
Definition: DatabaseShardImp.cpp:2237
ripple::NodeFamily::sweep
void sweep() override
Definition: NodeFamily.cpp:50
ripple::ApplicationImp::getShardFamily
Family * getShardFamily() override
Definition: Application.cpp:570
ripple::LoadManager
Manages load sources.
Definition: LoadManager.h:45
ripple::ApplicationImp::validators
ValidatorList & validators() override
Definition: Application.cpp:818
ripple::TaggedCache::sweep
void sweep()
Definition: TaggedCache.h:204
std::strlen
T strlen(T... args)
ripple::Validations::sizeOfBySequenceCache
std::size_t sizeOfBySequenceCache() const
Definition: Validations.h:1168
ripple::STLedgerEntry
Definition: STLedgerEntry.h:30
ripple::NodeStore::Database
Persistency layer for NodeObject.
Definition: Database.h:51
ripple::RPC::ShardArchiveHandler::makeShardArchiveHandler
static std::unique_ptr< ShardArchiveHandler > makeShardArchiveHandler(Application &app)
Definition: ShardArchiveHandler.cpp:50
std::string
STL class.
ripple::ApplicationImp::cachedSLEs
CachedSLEs & cachedSLEs() override
Definition: Application.cpp:788
std::shared_ptr
STL class.
ripple::ApplicationImp::getNodeStore
NodeStore::Database & getNodeStore() override
Definition: Application.cpp:686
ripple::RPC::ShardArchiveHandler::start
bool start()
Starts downloading and importing archives.
Definition: ShardArchiveHandler.cpp:236
ripple::TaggedCache< SHAMapHash, Blob >
ripple::ApplicationImp::getRelationalDatabase
RelationalDatabase & getRelationalDatabase() override
Definition: Application.cpp:896
ripple::ApplicationImp::serverOkay
bool serverOkay(std::string &reason) override
Definition: Application.cpp:2252
ripple::loadByIndex
std::shared_ptr< Ledger > loadByIndex(std::uint32_t ledgerIndex, Application &app, bool acquire)
Definition: Ledger.cpp:1123
ripple::ApplicationImp::mRelationalDatabase
std::unique_ptr< RelationalDatabase > mRelationalDatabase
Definition: Application.cpp:225
utility
ripple::LedgerMaster::sweep
void sweep()
Definition: LedgerMaster.cpp:1927
ripple::ApplicationImp::mValidations
RCLValidations mValidations
Definition: Application.cpp:218
ripple::TransactionMaster::sweep
void sweep(void)
Definition: TransactionMaster.cpp:156
std::exception
STL class.
ripple::Logs
Manages partitions for logging.
Definition: Log.h:48
ripple::ApplicationImp::getAcceptedLedgerCache
TaggedCache< uint256, AcceptedLedger > & getAcceptedLedgerCache() override
Definition: Application.cpp:655
ripple::make_Overlay
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
Definition: OverlayImpl.cpp:1642
cstring
ripple::ApplicationImp::getHashRouter
HashRouter & getHashRouter() override
Definition: Application.cpp:806
beast::Journal::trace
Stream trace() const
Severity stream access functions.
Definition: Journal.h:308
beast::PropertyStream::Map
Definition: PropertyStream.h:224
ripple::ApplicationImp::validatorSites_
std::unique_ptr< ValidatorSite > validatorSites_
Definition: Application.cpp:213
ripple::ApplicationImp::mWalletDB
std::unique_ptr< DatabaseCon > mWalletDB
Definition: Application.cpp:226
ripple::ApplicationImp::getPathRequests
PathRequests & getPathRequests() override
Definition: Application.cpp:782
ripple::ApplicationImp::m_orderBookDB
OrderBookDB m_orderBookDB
Definition: Application.cpp:199
ripple::make_LoadManager
std::unique_ptr< LoadManager > make_LoadManager(Application &app, beast::Journal journal)
Definition: LoadManager.cpp:197
ripple::TransactionMaster
Definition: TransactionMaster.h:36
ripple::ValidatorSite
Definition: ValidatorSite.h:69
std::pair
ripple::ApplicationImp::onWrite
void onWrite(beast::PropertyStream::Map &stream) override
Subclass override.
Definition: Application.cpp:989
ripple::LedgerMaster
Definition: LedgerMaster.h:70
ripple::ApplicationImp::getInboundLedgers
InboundLedgers & getInboundLedgers() override
Definition: Application.cpp:643
ripple::SizedItem::accountIdCacheSize
@ accountIdCacheSize
ripple::OpenView
Writable ledger view that accumulates state and tx changes.
Definition: OpenView.h:55
ripple::ApplicationImp::io_latency_sampler::cancel_async
void cancel_async()
Definition: Application.cpp:159
Json::UInt
unsigned int UInt
Definition: json_forwards.h:27
ripple::hotACCOUNT_NODE
@ hotACCOUNT_NODE
Definition: NodeObject.h:35
ripple::setup_DatabaseCon
DatabaseCon::Setup setup_DatabaseCon(Config const &c, std::optional< beast::Journal > j=std::nullopt)
Definition: DatabaseCon.cpp:106
ripple::ApplicationImp::getLedgerReplayer
LedgerReplayer & getLedgerReplayer() override
Definition: Application.cpp:637
ripple::InboundLedger::Reason::GENERIC
@ GENERIC
std::vector
STL class.
ripple::ConfigSection::shardDatabase
static std::string shardDatabase()
Definition: ConfigSections.h:38
std::string::length
T length(T... args)
ripple::ValidatorList::trustedPublisher
bool trustedPublisher(PublicKey const &identity) const
Returns true if public key is a trusted publisher.
Definition: ValidatorList.cpp:1404
ripple::ApplicationImp::waitHandlerCounter_
ClosureCounter< void, boost::system::error_code const & > waitHandlerCounter_
Definition: Application.cpp:221
ripple::ApplicationImp::getOPs
NetworkOPs & getOPs() override
Definition: Application.cpp:600
ripple::ApplicationImp::run
void run() override
Definition: Application.cpp:1702
ripple::make_InboundLedgers
std::unique_ptr< InboundLedgers > make_InboundLedgers(Application &app, InboundLedgers::clock_type &clock, beast::insight::Collector::ptr const &collector)
Definition: InboundLedgers.cpp:441
ripple::CollectorManager
Provides the beast::insight::Collector service.
Definition: CollectorManager.h:29
ripple::ConfigSection::importNodeDatabase
static std::string importNodeDatabase()
Definition: ConfigSections.h:43
std::chrono::milliseconds
ripple::Config::NODE_SIZE
std::size_t NODE_SIZE
Definition: Config.h:223
ripple::crypto_prng
csprng_engine & crypto_prng()
The default cryptographically secure PRNG.
Definition: csprng.cpp:99
ripple::ApplicationImp::isTimeToStop
std::atomic< bool > isTimeToStop
Definition: Application.cpp:235
ripple::ApplicationImp::m_acceptedLedgerCache
TaggedCache< uint256, AcceptedLedger > m_acceptedLedgerCache
Definition: Application.cpp:206
ripple::SHAMapStore
class to create database, launch online delete thread, and related SQLite database
Definition: SHAMapStore.h:36
ripple::ApplicationImp::validatorManifests
ManifestCache & validatorManifests() override
Definition: Application.cpp:830
ripple::ApplicationImp::getWalletDB
DatabaseCon & getWalletDB() override
Retrieve the "wallet database".
Definition: Application.cpp:903
ripple::getLatestLedger
std::tuple< std::shared_ptr< Ledger >, std::uint32_t, uint256 > getLatestLedger(Application &app)
Definition: Ledger.cpp:1113
ripple::ApplicationImp::getCollectorManager
CollectorManager & getCollectorManager() override
Definition: Application.cpp:556
ripple::ApplicationImp::sweepTimer_
boost::asio::steady_timer sweepTimer_
Definition: Application.cpp:222
ripple::ApplicationImp::cluster_
std::unique_ptr< Cluster > cluster_
Definition: Application.cpp:208
ripple::ApplicationImp::getShardStore
NodeStore::DatabaseShard * getShardStore() override
Definition: Application.cpp:694
ripple::ApplicationImp::openLedger
OpenLedger const & openLedger() const override
Definition: Application.cpp:874
ripple::ApplicationImp::getIOLatency
std::chrono::milliseconds getIOLatency() override
Definition: Application.cpp:619
ripple::ApplicationImp::m_shaMapStore
std::unique_ptr< SHAMapStore > m_shaMapStore
Definition: Application.cpp:182
ripple::make_CollectorManager
std::unique_ptr< CollectorManager > make_CollectorManager(Section const &params, beast::Journal journal)
Definition: CollectorManager.cpp:72
ripple::Config::LOAD
@ LOAD
Definition: Config.h:158
beast::Journal::warn
Stream warn() const
Definition: Journal.h:326
std::recursive_mutex
STL class.
std::reference_wrapper::get
T get(T... args)
ripple::ApplicationImp::getIOService
boost::asio::io_service & getIOService() override
Definition: Application.cpp:613
ripple::ApplicationImp::shardArchiveHandler_
std::unique_ptr< RPC::ShardArchiveHandler > shardArchiveHandler_
Definition: Application.cpp:197
std::lock_guard
STL class.
beast::severities
A namespace for easy access to logging severity values.
Definition: Journal.h:29
ripple::perf::PerfLog
Singleton class that maintains performance counters and optionally writes Json-formatted data to a di...
Definition: PerfLog.h:48
ripple::STParsedJSONObject
Holds the serialized result of parsing an input JSON object.
Definition: STParsedJSON.h:31
ripple::PendingSaves
Keeps track of which ledgers haven't been fully saved.
Definition: PendingSaves.h:36
ripple::Resource::feeReferenceRPC
const Charge feeReferenceRPC
ripple::make_LedgerCleaner
std::unique_ptr< LedgerCleaner > make_LedgerCleaner(Application &app, beast::Journal journal)
Definition: LedgerCleaner.cpp:455
ripple::Pathfinder::initPathTable
static void initPathTable()
Definition: Pathfinder.cpp:1300
std::cerr
ripple::ApplicationImp::ApplicationImp
ApplicationImp(std::unique_ptr< Config > config, std::unique_ptr< Logs > logs, std::unique_ptr< TimeKeeper > timeKeeper)
Definition: Application.cpp:272
ripple::ApplicationImp::cluster
Cluster & cluster() override
Definition: Application.cpp:842
ripple::stopwatch
Stopwatch & stopwatch()
Returns an instance of a wall clock.
Definition: chrono.h:120
ripple::make_NetworkOPs
std::unique_ptr< NetworkOPs > make_NetworkOPs(Application &app, NetworkOPs::clock_type &clock, bool standalone, std::size_t minPeerCount, bool startvalid, JobQueue &job_queue, LedgerMaster &ledgerMaster, ValidatorKeys const &validatorKeys, boost::asio::io_service &io_svc, beast::Journal journal, beast::insight::Collector::ptr const &collector)
Definition: NetworkOPs.cpp:4729
ripple::make_InboundTransactions
std::unique_ptr< InboundTransactions > make_InboundTransactions(Application &app, beast::insight::Collector::ptr const &collector, std::function< void(std::shared_ptr< SHAMap > const &, bool)> gotSet)
Definition: InboundTransactions.cpp:269
ripple::ApplicationImp::getLedgerMaster
LedgerMaster & getLedgerMaster() override
Definition: Application.cpp:625
Json::Reader
Unserialize a JSON document into a Value.
Definition: json_reader.h:36
ripple::ApplicationImp::instanceID
std::uint64_t instanceID() const override
Returns a 64-bit instance identifier, generated at startup.
Definition: Application.cpp:538
ripple::NodeFamily
Definition: NodeFamily.h:30
ripple::STParsedJSONObject::object
std::optional< STObject > object
The STObject if the parse was successful.
Definition: STParsedJSON.h:50
ripple::ResolverAsio::New
static std::unique_ptr< ResolverAsio > New(boost::asio::io_service &, beast::Journal)
Definition: ResolverAsio.cpp:406
iostream
ripple::ApplicationImp::m_nodeStore
std::unique_ptr< NodeStore::Database > m_nodeStore
Definition: Application.cpp:193
ripple::ApplicationImp::initRelationalDatabase
bool initRelationalDatabase()
Definition: Application.cpp:925
ripple::TimeKeeper::closeTime
time_point closeTime() const
Returns the predicted close time, in network time.
Definition: TimeKeeper.h:76
ripple::XRP_LEDGER_EARLIEST_FEES
static constexpr std::uint32_t XRP_LEDGER_EARLIEST_FEES
The XRP Ledger mainnet's earliest ledger with a FeeSettings object.
Definition: SystemParameters.h:73
ripple::ApplicationImp::perfLog_
std::unique_ptr< perf::PerfLog > perfLog_
Definition: Application.cpp:173
ripple::ApplicationImp::nodeIdentity_
std::pair< PublicKey, SecretKey > nodeIdentity_
Definition: Application.cpp:188
ripple::InboundLedgers::sweep
virtual void sweep()=0
ripple::ValidatorKeys
Validator keys and manifest as set in configuration file.
Definition: ValidatorKeys.h:36
ripple::HashRouter
Routing table for objects identified by hash.
Definition: HashRouter.h:53
ripple::forceValidity
void forceValidity(HashRouter &router, uint256 const &txid, Validity validity)
Sets the validity of a given transaction in the cache.
Definition: apply.cpp:89
ripple::ApplicationImp::validatorKeys_
const ValidatorKeys validatorKeys_
Definition: Application.cpp:189
ripple::ApplicationImp::timeKeeper_
std::unique_ptr< TimeKeeper > timeKeeper_
Definition: Application.cpp:168
ripple::OperatingMode::SYNCING
@ SYNCING
fallen slightly behind
ripple::ApplicationImp::instanceCookie_
const std::uint64_t instanceCookie_
Definition: Application.cpp:170
ripple::Config::IO_WORKERS
int IO_WORKERS
Definition: Config.h:245
ripple::SHAMapMissingNode
Definition: SHAMapMissingNode.h:55
ripple::Validity::SigGoodOnly
@ SigGoodOnly
Signature is good, but local checks fail.
ripple::ApplicationImp::getShardArchiveHandler
RPC::ShardArchiveHandler * getShardArchiveHandler(bool tryRecovery) override
Definition: Application.cpp:700
ripple::ApplicationImp::m_inboundLedgers
std::unique_ptr< InboundLedgers > m_inboundLedgers
Definition: Application.cpp:203
ripple::ApplicationImp::peerReservations_
std::unique_ptr< PeerReservationTable > peerReservations_
Definition: Application.cpp:209
ripple::setup_ServerHandler
ServerHandler::Setup setup_ServerHandler(Config const &config, std::ostream &&log)
Definition: ServerHandler.cpp:1236
ripple::ApplicationImp::loadLedgerFromFile
std::shared_ptr< Ledger > loadLedgerFromFile(std::string const &ledgerID)
Definition: Application.cpp:1931
ripple::ApplicationImp::checkSigs
bool checkSigs() const override
Definition: Application.cpp:1819
ripple::ApplicationImp::journal
beast::Journal journal(std::string const &name) override
Definition: Application.cpp:2300
ripple::base_uint< 256 >
ripple::ApplicationImp::entropyTimer_
boost::asio::steady_timer entropyTimer_
Definition: Application.cpp:223
ripple::ApplicationImp::getMaxDisallowedLedger
LedgerIndex getMaxDisallowedLedger() override
Ensure that a newly-started validator does not sign proposals older than the last ledger it persisted...
Definition: Application.cpp:1245
ripple::ApplicationImp::nodeToShards
bool nodeToShards()
Definition: Application.cpp:2306
ripple::ApplicationImp::hashRouter_
std::unique_ptr< HashRouter > hashRouter_
Definition: Application.cpp:217
ripple::ApplicationImp::getMasterMutex
Application::MutexType & getMasterMutex() override
Definition: Application.cpp:758
ripple::ApplicationImp::m_ledgerMaster
std::unique_ptr< LedgerMaster > m_ledgerMaster
Definition: Application.cpp:201
ripple::RPC::doCommand
Status doCommand(RPC::JsonContext &context, Json::Value &result)
Execute an RPC command and store the results in a Json::Value.
Definition: RPCHandler.cpp:250
ripple::setup_Overlay
Overlay::Setup setup_Overlay(BasicConfig const &config)
Definition: OverlayImpl.cpp:1537
ripple::ApplicationImp::logs
Logs & logs() override
Definition: Application.cpp:544
ripple::Config::reporting
bool reporting() const
Definition: Config.h:350
ripple::ApplicationImp::getPerfLog
perf::PerfLog & getPerfLog() override
Definition: Application.cpp:674
ripple::ApplicationImp::m_jobQueue
std::unique_ptr< JobQueue > m_jobQueue
Definition: Application.cpp:180
ripple::ApplicationImp::checkSigs_
std::atomic< bool > checkSigs_
Definition: Application.cpp:237
std::reference_wrapper
ripple::make_ServerHandler
std::unique_ptr< ServerHandler > make_ServerHandler(Application &app, boost::asio::io_service &io_service, JobQueue &jobQueue, NetworkOPs &networkOPs, Resource::Manager &resourceManager, CollectorManager &cm)
Definition: ServerHandler.cpp:1248
ripple::rand_int
std::enable_if_t< std::is_integral< Integral >::value &&detail::is_engine< Engine >::value, Integral > rand_int(Engine &engine, Integral min, Integral max)
Return a uniformly distributed random integer.
Definition: ripple/basics/random.h:115
ripple::loadByHash
std::shared_ptr< Ledger > loadByHash(uint256 const &ledgerHash, Application &app, bool acquire)
Definition: Ledger.cpp:1136
ripple::InboundLedgers::cacheSize
virtual std::size_t cacheSize()=0
ripple::LedgerReplayer::tasksSize
std::size_t tasksSize() const
Definition: LedgerReplayer.h:129
ripple::TxQ
Transaction Queue.
Definition: TxQ.h:57
ripple::Config::FORCE_MULTI_THREAD
bool FORCE_MULTI_THREAD
Definition: Config.h:249
ripple::ApplicationImp::numberOfThreads
static std::size_t numberOfThreads(Config const &config)
Definition: Application.cpp:249
ripple::base_uint::isZero
bool isZero() const
Definition: base_uint.h:532
ripple::ApplicationImp::getSHAMapStore
SHAMapStore & getSHAMapStore() override
Definition: Application.cpp:854
ripple::Role::ADMIN
@ ADMIN
ripple::ServerHandler
Definition: ServerHandler.h:47
beast::PropertyStream::Source::add
void add(Source &source)
Add a child source.
Definition: beast_PropertyStream.cpp:196
ripple::ApplicationImp::getAmendmentTable
AmendmentTable & getAmendmentTable() override
Definition: Application.cpp:794
ripple::ApplicationImp::loadOldLedger
bool loadOldLedger(std::string const &ledgerID, bool replay, bool isFilename)
Definition: Application.cpp:2069
ripple::PublicKey
A public key.
Definition: PublicKey.h:61
std::atomic::load
T load(T... args)
ripple::Config
Definition: Config.h:92
ripple::ApplicationImp::io_latency_sampler::cancel
void cancel()
Definition: Application.cpp:153
ripple::PublicKey::size
std::size_t size() const noexcept
Definition: PublicKey.h:89
ripple::Cluster
Definition: Cluster.h:38
std::thread::hardware_concurrency
T hardware_concurrency(T... args)
ripple::ValidatorList
Definition: ValidatorList.h:172
chrono
ripple::ApplicationImp::getResourceManager
Resource::Manager & getResourceManager() override
Definition: Application.cpp:770
ripple::ApplicationImp::peerReservations
PeerReservationTable & peerReservations() override
Definition: Application.cpp:848
ripple::ApplicationImp::publisherManifests
ManifestCache & publisherManifests() override
Definition: Application.cpp:836
ripple::ApplicationImp::m_amendmentTable
std::unique_ptr< AmendmentTable > m_amendmentTable
Definition: Application.cpp:215
ripple::Config::NETWORK
@ NETWORK
Definition: Config.h:158
ripple::ApplicationImp::overlay
Overlay & overlay() override
Definition: Application.cpp:882
ripple::megabytes
constexpr auto megabytes(T value) noexcept
Definition: ByteUtilities.h:34
ripple::ApplicationImp::pendingSaves
PendingSaves & pendingSaves() override
Definition: Application.cpp:860
ripple::ApplicationImp::m_collectorManager
std::unique_ptr< CollectorManager > m_collectorManager
Definition: Application.cpp:179
ripple::Config::standalone
bool standalone() const
Definition: Config.h:345
ripple::ApplicationImp::nodeFamily_
NodeFamily nodeFamily_
Definition: Application.cpp:194
ripple::HashRouter::getDefaultHoldTime
static std::chrono::seconds getDefaultHoldTime()
Definition: HashRouter.h:139
ripple::LedgerFill::full
@ full
Definition: LedgerToJson.h:54
std::unique_lock
STL class.
beast::io_latency_probe::sample
void sample(Handler &&handler)
Initiate continuous i/o latency sampling.
Definition: io_latency_probe.h:119
ripple::ApplicationImp::m_txMaster
TransactionMaster m_txMaster
Definition: Application.cpp:177
ripple::NodeStore::DatabaseShard
A collection of historical shards.
Definition: DatabaseShard.h:37
ripple::LoadFeeTrack
Manages the current fee schedule.
Definition: LoadFeeTrack.h:44
ripple::set
bool set(T &target, std::string const &name, Section const &section)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
Definition: BasicConfig.h:313
ripple::ValidatorList::listed
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
Definition: ValidatorList.cpp:1349
ripple::ApplicationImp::validatorSites
ValidatorSite & validatorSites() override
Definition: Application.cpp:824
ripple::ApplicationImp::nodeIdentity
std::pair< PublicKey, SecretKey > const & nodeIdentity() override
Definition: Application.cpp:588
beast::Journal::error
Stream error() const
Definition: Journal.h:332
beast::Journal::info
Stream info() const
Definition: Journal.h:320
ripple::ApplicationImp::io_latency_sampler::m_event
beast::insight::Event m_event
Definition: Application.cpp:104
std::chrono::time_point
beast::insight::Event
A metric for reporting event timing.
Definition: Event.h:40
ripple::ApplicationImp::config_
std::unique_ptr< Config > config_
Definition: Application.cpp:166
ripple::BuildInfo::getVersionString
std::string const & getVersionString()
Server version.
Definition: BuildInfo.cpp:65
ripple::OrderBookDB::setup
void setup(std::shared_ptr< ReadView const > const &ledger)
Definition: OrderBookDB.cpp:38
beast::basic_logstream
Definition: Journal.h:427
ripple::ReportingETL
This class is responsible for continuously extracting data from a p2p node, and writing that data to ...
Definition: ReportingETL.h:70
ripple::ApplicationImp::getLastFullLedger
std::shared_ptr< Ledger > getLastFullLedger()
Definition: Application.cpp:1888
ripple::Family
Definition: Family.h:32
ripple::ValidatorKeys::configInvalid
bool configInvalid() const
Definition: ValidatorKeys.h:49
ripple::ClosureCounter
The role of a ClosureCounter is to assist in shutdown by letting callers wait for the completion of c...
Definition: ClosureCounter.h:54
ripple::TransactionMaster::getCache
TaggedCache< uint256, Transaction > & getCache()
Definition: TransactionMaster.cpp:162
ripple::ApplicationImp::m_io_latency_sampler
io_latency_sampler m_io_latency_sampler
Definition: Application.cpp:241
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::SizedItem::burstSize
@ burstSize
std::uint64_t
ripple::Config::WORKERS
int WORKERS
Definition: Config.h:244
std::condition_variable::wait
T wait(T... args)
ripple::ApplicationImp::gotTXSet
void gotTXSet(std::shared_ptr< SHAMap > const &set, bool fromAcquire)
Definition: Application.cpp:661
std::atomic< std::chrono::milliseconds >
ripple::ApplicationImp::startGenesisLedger
void startGenesisLedger()
Definition: Application.cpp:1865
ripple::ApplicationImp::m_signals
boost::asio::signal_set m_signals
Definition: Application.cpp:229
ripple::TimeKeeper
Manages various times used by the server.
Definition: TimeKeeper.h:31
ripple::ApplicationImp::timeKeeper
TimeKeeper & timeKeeper() override
Definition: Application.cpp:576
beast::io_latency_probe< std::chrono::steady_clock >
ripple::OrderBookDB
Definition: OrderBookDB.h:32
ripple::ApplicationImp::io_latency_sampler::operator()
void operator()(Duration const &elapsed)
Definition: Application.cpp:130
ripple::NodeStore::Database::sweep
virtual void sweep()=0
Remove expired entries from the positive and negative caches.
ripple::InboundLedgers
Manages the lifetime of inbound ledgers.
Definition: InboundLedgers.h:33
ripple::OpenLedger
Represents the open ledger.
Definition: OpenLedger.h:49
ripple::ApplicationImp::getServerHandler
virtual ServerHandler & getServerHandler() override
Definition: Application.cpp:606
ripple::TaggedCache::size
std::size_t size() const
Returns the number of items in the container.
Definition: TaggedCache.h:98
ripple::Validations::flush
void flush()
Flush all current validations.
Definition: Validations.h:1103
ripple::JobQueue
A pool of threads to perform work.
Definition: JobQueue.h:55
ripple::Application::Application
Application()
Definition: Application.cpp:2339
std::min
T min(T... args)
ripple::ApplicationImp::setMaxDisallowedLedger
void setMaxDisallowedLedger()
Definition: Application.cpp:2327
ripple::Resource::Manager
Tracks load and resource consumption.
Definition: ResourceManager.h:36
ripple::LedgerMaster::getFetchPackCacheSize
std::size_t getFetchPackCacheSize() const
Definition: LedgerMaster.cpp:2413
ripple::ApplicationImp::shardFamily_
std::unique_ptr< ShardFamily > shardFamily_
Definition: Application.cpp:196
ripple::ApplicationImp::io_latency_sampler::lastSample_
std::atomic< std::chrono::milliseconds > lastSample_
Definition: Application.cpp:107
ripple::ApplicationImp::setSweepTimer
void setSweepTimer()
Definition: Application.cpp:996
ripple::ApplicationImp::overlay_
std::unique_ptr< Overlay > overlay_
Definition: Application.cpp:227
ripple::BuildInfo::getFullVersionString
std::string const & getFullVersionString()
Full server version string.
Definition: BuildInfo.cpp:78
ripple::ApplicationImp::openLedger
OpenLedger & openLedger() override
Definition: Application.cpp:866
ripple::ApplicationImp::pendingSaves_
PendingSaves pendingSaves_
Definition: Application.cpp:183
ripple::ApplicationImp::m_resolver
std::unique_ptr< ResolverAsio > m_resolver
Definition: Application.cpp:239
ripple::ApplicationImp::getTxQ
TxQ & getTxQ() override
Definition: Application.cpp:889
ripple::PeerReservationTable
Definition: PeerReservationTable.h:76
ripple::ManifestCache
Remembers manifests with the highest sequence number.
Definition: Manifest.h:231
ripple::LedgerReplayer::sweep
void sweep()
Remove completed tasks.
Definition: LedgerReplayer.cpp:219
ripple::LedgerReplayer::deltasSize
std::size_t deltasSize() const
Definition: LedgerReplayer.h:136
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::initAccountIdCache
void initAccountIdCache(std::size_t count)
Initialize the global cache used to map AccountID to base58 conversions.
Definition: AccountID.cpp:97
ripple::Config::FRESH
@ FRESH
Definition: Config.h:158
ripple::Resource::make_Manager
std::unique_ptr< Manager > make_Manager(beast::insight::Collector::ptr const &collector, beast::Journal journal)
Definition: ResourceManager.cpp:175
std::atomic::exchange
T exchange(T... args)
ripple::ApplicationImp::getTempNodeCache
NodeCache & getTempNodeCache() override
Definition: Application.cpp:680
ripple::ApplicationImp::io_latency_sampler::get
std::chrono::milliseconds get() const
Definition: Application.cpp:147
beast::io_latency_probe::cancel
void cancel()
Cancel all pending i/o.
Definition: io_latency_probe.h:84
Json::Value::removeMember
Value removeMember(const char *key)
Remove and return the named member.
Definition: json_value.cpp:907
ripple::ApplicationImp::grpcServer_
std::unique_ptr< GRPCServer > grpcServer_
Definition: Application.cpp:243
std::endl
T endl(T... args)
ripple::ApplicationImp::stoppingCondition_
std::condition_variable stoppingCondition_
Definition: Application.cpp:233
ripple::OpenView::rawTxInsert
void rawTxInsert(key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData) override
Add a transaction to the tx map.
Definition: OpenView.cpp:261
ripple::RPC::ShardArchiveHandler::tryMakeRecoveryHandler
static std::unique_ptr< ShardArchiveHandler > tryMakeRecoveryHandler(Application &app)
Definition: ShardArchiveHandler.cpp:56
ripple::ApplicationImp::getJobQueue
JobQueue & getJobQueue() override
Definition: Application.cpp:582
ripple::ApplicationImp::fdRequired
int fdRequired() const override
Definition: Application.cpp:1837
ripple::ApplicationImp::doSweep
void doSweep()
Definition: Application.cpp:1056
beast::PropertyStream::Source::Source
Source(std::string const &name)
Definition: beast_PropertyStream.cpp:176
ripple::Overlay
Manages the set of connected peers.
Definition: Overlay.h:51
ripple::ApplicationImp::io_latency_sampler
Definition: Application.cpp:101
limits
ripple::ApplicationImp::getOrderBookDB
OrderBookDB & getOrderBookDB() override
Definition: Application.cpp:776
ripple::ApplicationImp
Definition: Application.cpp:98
ripple::ApplicationImp::getLoadManager
LoadManager & getLoadManager() override
Definition: Application.cpp:764
beast::lexicalCastChecked
bool lexicalCastChecked(Out &out, In in)
Intelligently convert from one type to another.
Definition: LexicalCast.h:164
ripple::make_PeerSetBuilder
std::unique_ptr< PeerSetBuilder > make_PeerSetBuilder(Application &app)
Definition: PeerSet.cpp:144
ripple::ApplicationImp::io_latency_sampler::m_probe
beast::io_latency_probe< std::chrono::steady_clock > m_probe
Definition: Application.cpp:106
ripple::ApplicationImp::isStopping
bool isStopping() const override
Definition: Application.cpp:1831
std
STL namespace.
ripple::ApplicationImp::m_nodeStoreScheduler
NodeStoreScheduler m_nodeStoreScheduler
Definition: Application.cpp:181
ripple::ApplicationImp::m_loadManager
std::unique_ptr< LoadManager > m_loadManager
Definition: Application.cpp:219
ripple::create_genesis
const create_genesis_t create_genesis
Definition: Ledger.cpp:62
ripple::Config::REPLAY
@ REPLAY
Definition: Config.h:158
ripple::ApplicationImp::getInboundTransactions
InboundTransactions & getInboundTransactions() override
Definition: Application.cpp:649
ripple::makeWalletDB
std::unique_ptr< DatabaseCon > makeWalletDB(DatabaseCon::Setup const &setup)
makeWalletDB Opens the wallet database and returns it.
Definition: Wallet.cpp:26
ripple::PostgresDatabase
Definition: PostgresDatabase.h:27
Json::Reader::parse
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
Definition: json_reader.cpp:74
condition_variable
ripple::Resource::Consumer
An endpoint that consumes resources.
Definition: Consumer.h:34
ripple::Resource::Charge
A consumption charge.
Definition: Charge.h:30
ripple::SizedItem::sweepInterval
@ sweepInterval
ripple::DatabaseCon
Definition: DatabaseCon.h:81
ripple::RPC::apiMaximumSupportedVersion
constexpr unsigned int apiMaximumSupportedVersion
Definition: RPCHelpers.h:235
ripple::ApplicationImp::mFeeTrack
std::unique_ptr< LoadFeeTrack > mFeeTrack
Definition: Application.cpp:216
ripple::ApplicationImp::getFeeTrack
LoadFeeTrack & getFeeTrack() override
Definition: Application.cpp:800
ripple::LedgerReplayer::skipListsSize
std::size_t skipListsSize() const
Definition: LedgerReplayer.h:143
ripple::addJson
void addJson(Json::Value &json, LedgerFill const &fill)
Given a Ledger and options, fill a Json::Object or Json::Value with a description of the ledger.
Definition: LedgerToJson.cpp:347
ripple::RPC::ShardArchiveHandler
Handles the download and import of one or more shard archives.
Definition: ShardArchiveHandler.h:42
ripple::LedgerReplayer
Manages the lifetime of ledger replay tasks.
Definition: LedgerReplayer.h:72
beast::severities::kDebug
@ kDebug
Definition: Journal.h:35
ripple::ApplicationImp::io_latency_sampler::m_journal
beast::Journal m_journal
Definition: Application.cpp:105
ripple::ApplicationImp::config
Config & config() override
Definition: Application.cpp:550
ripple::ApplicationImp::validators_
std::unique_ptr< ValidatorList > validators_
Definition: Application.cpp:212
std::string::empty
T empty(T... args)
ripple::ApplicationImp::getLedgerCleaner
LedgerCleaner & getLedgerCleaner() override
Definition: Application.cpp:631
ripple::getNodeIdentity
std::pair< PublicKey, SecretKey > getNodeIdentity(Application &app, boost::program_options::variables_map const &cmdline)
The cryptographic credentials identifying this server instance.
Definition: NodeIdentity.cpp:30
ripple::ApplicationImp::m_journal
beast::Journal m_journal
Definition: Application.cpp:172
ripple::Validations< RCLValidationsAdaptor >
ripple::ClosureCounter::join
void join(char const *name, std::chrono::milliseconds wait, beast::Journal j)
Returns once all counted in-flight closures are destroyed.
Definition: ClosureCounter.h:166
ripple::Validations::sizeOfByLedgerCache
std::size_t sizeOfByLedgerCache() const
Definition: Validations.h:1161
optional
beast::io_latency_probe::cancel_async
void cancel_async()
Definition: io_latency_probe.h:91
mutex
ripple::ApplicationImp::stoppingMutex_
std::mutex stoppingMutex_
Definition: Application.cpp:234
ripple::Validations::sizeOfCurrentCache
std::size_t sizeOfCurrentCache() const
Definition: Validations.h:1147
ripple::ApplicationImp::io_latency_sampler::io_latency_sampler
io_latency_sampler(beast::insight::Event ev, beast::Journal journal, std::chrono::milliseconds interval, boost::asio::io_service &ios)
Definition: Application.cpp:110
beast::Journal::debug
Stream debug() const
Definition: Journal.h:314
ripple::ApplicationImp::serverHandler_
std::unique_ptr< ServerHandler > serverHandler_
Definition: Application.cpp:214
std::size_t
ripple::to_string
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
Definition: app/misc/impl/Manifest.cpp:41
ripple::keylet::fees
Keylet const & fees() noexcept
The (fixed) index of the object containing the ledger fees.
Definition: Indexes.cpp:180
ripple::make_AmendmentTable
std::unique_ptr< AmendmentTable > make_AmendmentTable(Application &app, std::chrono::seconds majorityTime, std::vector< AmendmentTable::FeatureInfo > const &supported, Section const &enabled, Section const &vetoed, beast::Journal journal)
Definition: AmendmentTable.cpp:973
ripple::ApplicationImp::validatorManifests_
std::unique_ptr< ManifestCache > validatorManifests_
Definition: Application.cpp:210
BasicApp
Definition: BasicApp.h:29
ripple::ApplicationImp::m_pathRequests
std::unique_ptr< PathRequests > m_pathRequests
Definition: Application.cpp:200
ripple::ApplicationImp::m_networkOPs
std::unique_ptr< NetworkOPs > m_networkOPs
Definition: Application.cpp:207
ripple::ApplicationImp::getNodeFamily
Family & getNodeFamily() override
Definition: Application.cpp:562
ripple::NodeFamily::getFullBelowCache
std::shared_ptr< FullBelowCache > getFullBelowCache(std::uint32_t) override
Return a pointer to the Family Full Below Cache.
Definition: NodeFamily.h:69
ripple::PathRequests
Definition: PathRequests.h:33
ripple::ApplicationImp::setup
bool setup(boost::program_options::variables_map const &cmdline) override
Definition: Application.cpp:1278
ripple::ApplicationImp::txQ_
std::unique_ptr< TxQ > txQ_
Definition: Application.cpp:220
ripple::ApplicationImp::cachedSLEs_
CachedSLEs cachedSLEs_
Definition: Application.cpp:187
std::max
T max(T... args)
ripple::base_uint::parseHex
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
Definition: base_uint.h:496
ripple::Validations::expire
void expire(beast::Journal &j)
Expire old validation sets.
Definition: Validations.h:727
ripple::NodeStore::Manager::instance
static Manager & instance()
Returns the instance of the manager singleton.
Definition: ManagerImp.cpp:120
ripple::ApplicationImp::m_masterMutex
Application::MutexType m_masterMutex
Definition: Application.cpp:174
ripple::NodeStore::Manager::make_Database
virtual std::unique_ptr< Database > make_Database(std::size_t burstSize, Scheduler &scheduler, int readThreads, Section const &backendParameters, beast::Journal journal)=0
Construct a NodeStore database.
ripple::getRegisteredFeature
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:342
ripple::LedgerCleaner
Check the ledger/transaction databases to make sure they have continuity.
Definition: LedgerCleaner.h:32
BasicApp::get_io_service
boost::asio::io_service & get_io_service()
Definition: BasicApp.h:41
ripple::ApplicationImp::initNodeStore
bool initNodeStore()
Definition: Application.cpp:951
ripple::ApplicationImp::maxDisallowedLedger_
std::atomic< LedgerIndex > maxDisallowedLedger_
Definition: Application.cpp:1253
ripple::make_SHAMapStore
std::unique_ptr< SHAMapStore > make_SHAMapStore(Application &app, NodeStore::Scheduler &scheduler, beast::Journal journal)
Definition: SHAMapStoreImp.cpp:728
ripple::ApplicationImp::signalStop
void signalStop(std::string msg="") override
Definition: Application.cpp:1805
ripple::NodeFamily::getTreeNodeCache
std::shared_ptr< TreeNodeCache > getTreeNodeCache(std::uint32_t) override
Return a pointer to the Family Tree Node Cache.
Definition: NodeFamily.h:74
ripple::RelationalDatabase
Definition: RelationalDatabase.h:48
ripple::ApplicationImp::publisherManifests_
std::unique_ptr< ManifestCache > publisherManifests_
Definition: Application.cpp:211
ripple::AmendmentTable
The amendment table stores the list of enabled and potential amendments.
Definition: AmendmentTable.h:37
ripple::ApplicationImp::getMasterTransaction
TransactionMaster & getMasterTransaction() override
Definition: Application.cpp:668
std::unique_ptr
STL class.
ripple::NetClock::time_point
std::chrono::time_point< NetClock > time_point
Definition: chrono.h:70
ripple::Config::LOAD_FILE
@ LOAD_FILE
Definition: Config.h:158
ripple::ApplicationImp::io_latency_sampler::start
void start()
Definition: Application.cpp:123
std::condition_variable::notify_all
T notify_all(T... args)
ripple::detail::supportedAmendments
std::map< std::string, VoteBehavior > const & supportedAmendments()
Amendments that this server supports and the default voting behavior.
Definition: Feature.cpp:320
ripple::ApplicationImp::reportingETL_
std::unique_ptr< ReportingETL > reportingETL_
Definition: Application.cpp:244
Json::Value::isObjectOrNull
bool isObjectOrNull() const
Definition: json_value.cpp:1033
ripple::ApplicationImp::getValidations
RCLValidations & getValidations() override
Definition: Application.cpp:812
ripple::ApplicationImp::setEntropyTimer
void setEntropyTimer()
Definition: Application.cpp:1027
ripple::make_Application
std::unique_ptr< Application > make_Application(std::unique_ptr< Config > config, std::unique_ptr< Logs > logs, std::unique_ptr< TimeKeeper > timeKeeper)
Definition: Application.cpp:2346
ripple::ValidatorKeys::manifest
std::string manifest
Definition: ValidatorKeys.h:43
std::ref
T ref(T... args)
std::exception::what
T what(T... args)
ripple::ApplicationImp::start
void start(bool withTimers) override
Definition: Application.cpp:1679
Json::Value
Represents a JSON value.
Definition: json_value.h:145
beast::insight::Event::notify
void notify(std::chrono::duration< Rep, Period > const &value) const
Push an event notification.
Definition: Event.h:64
ripple::ApplicationImp::logs_
std::unique_ptr< Logs > logs_
Definition: Application.cpp:167
ripple::Validations::sizeOfSeqEnforcersCache
std::size_t sizeOfSeqEnforcersCache() const
Definition: Validations.h:1154
ripple::InboundTransactions
Manages the acquisition and lifetime of transaction sets.
Definition: InboundTransactions.h:35
variant
Json::Value::asString
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469
ripple::ClosureCounter::wrap
std::optional< Substitute< Closure > > wrap(Closure &&closure)
Wrap the passed closure with a reference counter.
Definition: ClosureCounter.h:192
std::ifstream
STL class.
beast
Definition: base_uint.h:641
std::chrono