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  boost::asio::io_service&
606  getIOService() override
607  {
608  return get_io_service();
609  }
610 
612  getIOLatency() override
613  {
614  return m_io_latency_sampler.get();
615  }
616 
617  LedgerMaster&
618  getLedgerMaster() override
619  {
620  return *m_ledgerMaster;
621  }
622 
624  getLedgerCleaner() override
625  {
626  return *ledgerCleaner_;
627  }
628 
630  getLedgerReplayer() override
631  {
632  return *m_ledgerReplayer;
633  }
634 
636  getInboundLedgers() override
637  {
638  return *m_inboundLedgers;
639  }
640 
643  {
644  return *m_inboundTransactions;
645  }
646 
649  {
650  return m_acceptedLedgerCache;
651  }
652 
653  void
654  gotTXSet(std::shared_ptr<SHAMap> const& set, bool fromAcquire)
655  {
656  if (set)
657  m_networkOPs->mapComplete(set, fromAcquire);
658  }
659 
662  {
663  return m_txMaster;
664  }
665 
667  getPerfLog() override
668  {
669  return *perfLog_;
670  }
671 
672  NodeCache&
673  getTempNodeCache() override
674  {
675  return m_tempNodeCache;
676  }
677 
679  getNodeStore() override
680  {
681  return *m_nodeStore;
682  }
683 
684  // The shard store is an optional feature. If the sever is configured for
685  // shards, this function will return a valid pointer, otherwise a nullptr.
687  getShardStore() override
688  {
689  return shardStore_.get();
690  }
691 
693  getShardArchiveHandler(bool tryRecovery) override
694  {
695  static std::mutex handlerMutex;
696  std::lock_guard lock(handlerMutex);
697 
698  // After constructing the handler, try to
699  // initialize it. Log on error; set the
700  // member variable on success.
701  auto initAndSet =
703  if (!handler)
704  return false;
705 
706  if (!handler->init())
707  {
708  JLOG(m_journal.error())
709  << "Failed to initialize ShardArchiveHandler.";
710 
711  return false;
712  }
713 
714  shardArchiveHandler_ = std::move(handler);
715  return true;
716  };
717 
718  // Need to resume based on state from a previous
719  // run.
720  if (tryRecovery)
721  {
722  if (shardArchiveHandler_ != nullptr)
723  {
724  JLOG(m_journal.error())
725  << "ShardArchiveHandler already created at startup.";
726 
727  return nullptr;
728  }
729 
730  auto handler =
732 
733  if (!initAndSet(std::move(handler)))
734  return nullptr;
735  }
736 
737  // Construct the ShardArchiveHandler
738  if (shardArchiveHandler_ == nullptr)
739  {
740  auto handler =
742 
743  if (!initAndSet(std::move(handler)))
744  return nullptr;
745  }
746 
747  return shardArchiveHandler_.get();
748  }
749 
751  getMasterMutex() override
752  {
753  return m_masterMutex;
754  }
755 
756  LoadManager&
757  getLoadManager() override
758  {
759  return *m_loadManager;
760  }
761 
764  {
765  return *m_resourceManager;
766  }
767 
768  OrderBookDB&
769  getOrderBookDB() override
770  {
771  return m_orderBookDB;
772  }
773 
774  PathRequests&
775  getPathRequests() override
776  {
777  return *m_pathRequests;
778  }
779 
780  CachedSLEs&
781  cachedSLEs() override
782  {
783  return cachedSLEs_;
784  }
785 
787  getAmendmentTable() override
788  {
789  return *m_amendmentTable;
790  }
791 
792  LoadFeeTrack&
793  getFeeTrack() override
794  {
795  return *mFeeTrack;
796  }
797 
798  HashRouter&
799  getHashRouter() override
800  {
801  return *hashRouter_;
802  }
803 
805  getValidations() override
806  {
807  return mValidations;
808  }
809 
811  validators() override
812  {
813  return *validators_;
814  }
815 
817  validatorSites() override
818  {
819  return *validatorSites_;
820  }
821 
824  {
825  return *validatorManifests_;
826  }
827 
830  {
831  return *publisherManifests_;
832  }
833 
834  Cluster&
835  cluster() override
836  {
837  return *cluster_;
838  }
839 
841  peerReservations() override
842  {
843  return *peerReservations_;
844  }
845 
846  SHAMapStore&
847  getSHAMapStore() override
848  {
849  return *m_shaMapStore;
850  }
851 
852  PendingSaves&
853  pendingSaves() override
854  {
855  return pendingSaves_;
856  }
857 
858  OpenLedger&
859  openLedger() override
860  {
861  if (config_->reporting())
862  Throw<ReportingShouldProxy>();
863  return *openLedger_;
864  }
865 
866  OpenLedger const&
867  openLedger() const override
868  {
869  if (config_->reporting())
870  Throw<ReportingShouldProxy>();
871  return *openLedger_;
872  }
873 
874  Overlay&
875  overlay() override
876  {
877  assert(overlay_);
878  return *overlay_;
879  }
880 
881  TxQ&
882  getTxQ() override
883  {
884  assert(txQ_.get() != nullptr);
885  return *txQ_;
886  }
887 
890  {
891  assert(mRelationalDatabase.get() != nullptr);
892  return *mRelationalDatabase;
893  }
894 
895  DatabaseCon&
896  getWalletDB() override
897  {
898  assert(mWalletDB.get() != nullptr);
899  return *mWalletDB;
900  }
901 
902  ReportingETL&
903  getReportingETL() override
904  {
905  assert(reportingETL_.get() != nullptr);
906  return *reportingETL_;
907  }
908 
909  bool
910  serverOkay(std::string& reason) override;
911 
913  journal(std::string const& name) override;
914 
915  //--------------------------------------------------------------------------
916 
917  bool
919  {
920  assert(mWalletDB.get() == nullptr);
921 
922  try
923  {
926 
927  // wallet database
929  setup.useGlobalPragma = false;
930 
932  }
933  catch (std::exception const& e)
934  {
935  JLOG(m_journal.fatal())
936  << "Failed to initialize SQL databases: " << e.what();
937  return false;
938  }
939 
940  return true;
941  }
942 
943  bool
945  {
946  if (config_->doImport)
947  {
948  auto j = logs_->journal("NodeObject");
949  NodeStore::DummyScheduler dummyScheduler;
952  megabytes(config_->getValueFor(
953  SizedItem::burstSize, std::nullopt)),
954  dummyScheduler,
955  0,
957  j);
958 
959  JLOG(j.warn()) << "Starting node import from '" << source->getName()
960  << "' to '" << m_nodeStore->getName() << "'.";
961 
962  using namespace std::chrono;
963  auto const start = steady_clock::now();
964 
965  m_nodeStore->importDatabase(*source);
966 
967  auto const elapsed =
968  duration_cast<seconds>(steady_clock::now() - start);
969  JLOG(j.warn()) << "Node import from '" << source->getName()
970  << "' took " << elapsed.count() << " seconds.";
971  }
972 
973  return true;
974  }
975 
976  //--------------------------------------------------------------------------
977  //
978  // PropertyStream
979  //
980 
981  void
983  {
984  }
985 
986  //--------------------------------------------------------------------------
987 
988  void
990  {
991  // Only start the timer if waitHandlerCounter_ is not yet joined.
992  if (auto optionalCountedHandler = waitHandlerCounter_.wrap(
993  [this](boost::system::error_code const& e) {
994  if (e.value() == boost::system::errc::success)
995  {
996  m_jobQueue->addJob(
997  jtSWEEP, "sweep", [this]() { doSweep(); });
998  }
999  // Recover as best we can if an unexpected error occurs.
1000  if (e.value() != boost::system::errc::success &&
1001  e.value() != boost::asio::error::operation_aborted)
1002  {
1003  // Try again later and hope for the best.
1004  JLOG(m_journal.error())
1005  << "Sweep timer got error '" << e.message()
1006  << "'. Restarting timer.";
1007  setSweepTimer();
1008  }
1009  }))
1010  {
1011  using namespace std::chrono;
1012  sweepTimer_.expires_from_now(
1013  seconds{config_->SWEEP_INTERVAL.value_or(
1014  config_->getValueFor(SizedItem::sweepInterval))});
1015  sweepTimer_.async_wait(std::move(*optionalCountedHandler));
1016  }
1017  }
1018 
1019  void
1021  {
1022  // Only start the timer if waitHandlerCounter_ is not yet joined.
1023  if (auto optionalCountedHandler = waitHandlerCounter_.wrap(
1024  [this](boost::system::error_code const& e) {
1025  if (e.value() == boost::system::errc::success)
1026  {
1027  crypto_prng().mix_entropy();
1028  setEntropyTimer();
1029  }
1030  // Recover as best we can if an unexpected error occurs.
1031  if (e.value() != boost::system::errc::success &&
1032  e.value() != boost::asio::error::operation_aborted)
1033  {
1034  // Try again later and hope for the best.
1035  JLOG(m_journal.error())
1036  << "Entropy timer got error '" << e.message()
1037  << "'. Restarting timer.";
1038  setEntropyTimer();
1039  }
1040  }))
1041  {
1042  using namespace std::chrono_literals;
1043  entropyTimer_.expires_from_now(5min);
1044  entropyTimer_.async_wait(std::move(*optionalCountedHandler));
1045  }
1046  }
1047 
1048  void
1050  {
1051  if (!config_->standalone() &&
1052  !getRelationalDatabase().transactionDbHasSpace(*config_))
1053  {
1054  signalStop();
1055  }
1056 
1057  // VFALCO NOTE Does the order of calls matter?
1058  // VFALCO TODO fix the dependency inversion using an observer,
1059  // have listeners register for "onSweep ()" notification.
1060 
1061  nodeFamily_.sweep();
1062  if (shardFamily_)
1063  shardFamily_->sweep();
1065  getNodeStore().sweep();
1066  if (shardStore_)
1067  shardStore_->sweep();
1068  getLedgerMaster().sweep();
1069  getTempNodeCache().sweep();
1073  m_acceptedLedgerCache.sweep();
1074  cachedSLEs_.sweep();
1075 
1076 #ifdef RIPPLED_REPORTING
1077  if (auto pg = dynamic_cast<PostgresDatabase*>(&*mRelationalDatabase))
1078  pg->sweep();
1079 #endif
1080 
1081  // Set timer to do another sweep later.
1082  setSweepTimer();
1083  }
1084 
1085  LedgerIndex
1087  {
1088  return maxDisallowedLedger_;
1089  }
1090 
1091 private:
1092  // For a newly-started validator, this is the greatest persisted ledger
1093  // and new validations must be greater than this.
1095 
1096  bool
1097  nodeToShards();
1098 
1099  void
1101 
1104 
1106  loadLedgerFromFile(std::string const& ledgerID);
1107 
1108  bool
1109  loadOldLedger(std::string const& ledgerID, bool replay, bool isFilename);
1110 
1111  void
1113 };
1114 
1115 //------------------------------------------------------------------------------
1116 
1117 // TODO Break this up into smaller, more digestible initialization segments.
1118 bool
1119 ApplicationImp::setup(boost::program_options::variables_map const& cmdline)
1120 {
1121  // We want to intercept CTRL-C and the standard termination signal SIGTERM
1122  // and terminate the process. This handler will NEVER be invoked twice.
1123  //
1124  // Note that async_wait is "one-shot": for each call, the handler will be
1125  // invoked exactly once, either when one of the registered signals in the
1126  // signal set occurs or the signal set is cancelled. Subsequent signals are
1127  // effectively ignored (technically, they are queued up, waiting for a call
1128  // to async_wait).
1129  m_signals.add(SIGINT);
1130  m_signals.add(SIGTERM);
1131  m_signals.async_wait(
1132  [this](boost::system::error_code const& ec, int signum) {
1133  // Indicates the signal handler has been aborted; do nothing
1134  if (ec == boost::asio::error::operation_aborted)
1135  return;
1136 
1137  JLOG(m_journal.info()) << "Received signal " << signum;
1138 
1139  if (signum == SIGTERM || signum == SIGINT)
1140  signalStop();
1141  });
1142 
1143  auto debug_log = config_->getDebugLogFile();
1144 
1145  if (!debug_log.empty())
1146  {
1147  // Let debug messages go to the file but only WARNING or higher to
1148  // regular output (unless verbose)
1149 
1150  if (!logs_->open(debug_log))
1151  std::cerr << "Can't open log file " << debug_log << '\n';
1152 
1153  using namespace beast::severities;
1154  if (logs_->threshold() > kDebug)
1155  logs_->threshold(kDebug);
1156  }
1157 
1158  JLOG(m_journal.info()) << "Process starting: "
1160  << ", Instance Cookie: " << instanceCookie_;
1161 
1162  if (numberOfThreads(*config_) < 2)
1163  {
1164  JLOG(m_journal.warn()) << "Limited to a single I/O service thread by "
1165  "system configuration.";
1166  }
1167 
1168  // Optionally turn off logging to console.
1169  logs_->silent(config_->silent());
1170 
1171  if (!config_->standalone())
1172  timeKeeper_->run(config_->SNTP_SERVERS);
1173 
1175  return false;
1176 
1177  if (shardStore_)
1178  {
1179  shardFamily_ =
1180  std::make_unique<ShardFamily>(*this, *m_collectorManager);
1181 
1182  if (!shardStore_->init())
1183  return false;
1184  }
1185 
1186  if (!peerReservations_->load(getWalletDB()))
1187  {
1188  JLOG(m_journal.fatal()) << "Cannot find peer reservations!";
1189  return false;
1190  }
1191 
1194 
1195  // Configure the amendments the server supports
1196  {
1197  auto const supported = []() {
1198  auto const& amendments = detail::supportedAmendments();
1200  supported.reserve(amendments.size());
1201  for (auto const& [a, vote] : amendments)
1202  {
1203  auto const f = ripple::getRegisteredFeature(a);
1204  assert(f);
1205  if (f)
1206  supported.emplace_back(a, *f, vote);
1207  }
1208  return supported;
1209  }();
1210  Section const& downVoted = config_->section(SECTION_VETO_AMENDMENTS);
1211 
1212  Section const& upVoted = config_->section(SECTION_AMENDMENTS);
1213 
1215  *this,
1216  config().AMENDMENT_MAJORITY_TIME,
1217  supported,
1218  upVoted,
1219  downVoted,
1220  logs_->journal("Amendments"));
1221  }
1222 
1224 
1225  auto const startUp = config_->START_UP;
1226  JLOG(m_journal.debug()) << "startUp: " << startUp;
1227  if (!config_->reporting())
1228  {
1229  if (startUp == Config::FRESH)
1230  {
1231  JLOG(m_journal.info()) << "Starting new Ledger";
1232 
1234  }
1235  else if (
1236  startUp == Config::LOAD || startUp == Config::LOAD_FILE ||
1237  startUp == Config::REPLAY)
1238  {
1239  JLOG(m_journal.info()) << "Loading specified Ledger";
1240 
1241  if (!loadOldLedger(
1242  config_->START_LEDGER,
1243  startUp == Config::REPLAY,
1244  startUp == Config::LOAD_FILE))
1245  {
1246  JLOG(m_journal.error())
1247  << "The specified ledger could not be loaded.";
1248  if (config_->FAST_LOAD)
1249  {
1250  // Fall back to syncing from the network, such as
1251  // when there's no existing data.
1253  }
1254  else
1255  {
1256  return false;
1257  }
1258  }
1259  }
1260  else if (startUp == Config::NETWORK)
1261  {
1262  // This should probably become the default once we have a stable
1263  // network.
1264  if (!config_->standalone())
1265  m_networkOPs->setNeedNetworkLedger();
1266 
1268  }
1269  else
1270  {
1272  }
1273  }
1274 
1275  if (!config().reporting())
1276  m_orderBookDB.setup(getLedgerMaster().getCurrentLedger());
1277 
1278  nodeIdentity_ = getNodeIdentity(*this, cmdline);
1279 
1280  if (!cluster_->load(config().section(SECTION_CLUSTER_NODES)))
1281  {
1282  JLOG(m_journal.fatal()) << "Invalid entry in cluster configuration.";
1283  return false;
1284  }
1285 
1286  if (!config().reporting())
1287  {
1288  {
1290  return false;
1291 
1292  if (!validatorManifests_->load(
1293  getWalletDB(),
1294  "ValidatorManifests",
1296  config()
1297  .section(SECTION_VALIDATOR_KEY_REVOCATION)
1298  .values()))
1299  {
1300  JLOG(m_journal.fatal())
1301  << "Invalid configured validator manifest.";
1302  return false;
1303  }
1304 
1305  publisherManifests_->load(getWalletDB(), "PublisherManifests");
1306 
1307  // Setup trusted validators
1308  if (!validators_->load(
1310  config().section(SECTION_VALIDATORS).values(),
1311  config().section(SECTION_VALIDATOR_LIST_KEYS).values()))
1312  {
1313  JLOG(m_journal.fatal())
1314  << "Invalid entry in validator configuration.";
1315  return false;
1316  }
1317  }
1318 
1319  if (!validatorSites_->load(
1320  config().section(SECTION_VALIDATOR_LIST_SITES).values()))
1321  {
1322  JLOG(m_journal.fatal())
1323  << "Invalid entry in [" << SECTION_VALIDATOR_LIST_SITES << "]";
1324  return false;
1325  }
1326  }
1327  //----------------------------------------------------------------------
1328  //
1329  // Server
1330  //
1331  //----------------------------------------------------------------------
1332 
1333  // VFALCO NOTE Unfortunately, in stand-alone mode some code still
1334  // foolishly calls overlay(). When this is fixed we can
1335  // move the instantiation inside a conditional:
1336  //
1337  // if (!config_.standalone())
1338  if (!config_->reporting())
1339  {
1341  *this,
1343  *serverHandler_,
1345  *m_resolver,
1346  get_io_service(),
1347  *config_,
1348  m_collectorManager->collector());
1349  add(*overlay_); // add to PropertyStream
1350  }
1351 
1352  if (!config_->standalone())
1353  {
1354  // NodeStore import into the ShardStore requires the SQLite database
1355  if (config_->nodeToShard && !nodeToShards())
1356  return false;
1357  }
1358 
1359  // start first consensus round
1360  if (!config_->reporting() &&
1361  !m_networkOPs->beginConsensus(
1362  m_ledgerMaster->getClosedLedger()->info().hash))
1363  {
1364  JLOG(m_journal.fatal()) << "Unable to start consensus";
1365  return false;
1366  }
1367 
1368  {
1369  try
1370  {
1371  auto setup = setup_ServerHandler(
1373  setup.makeContexts();
1374  serverHandler_->setup(setup, m_journal);
1375  }
1376  catch (std::exception const& e)
1377  {
1378  if (auto stream = m_journal.fatal())
1379  {
1380  stream << "Unable to setup server handler";
1381  if (std::strlen(e.what()) > 0)
1382  stream << ": " << e.what();
1383  }
1384  return false;
1385  }
1386  }
1387 
1388  // Begin connecting to network.
1389  if (!config_->standalone())
1390  {
1391  // Should this message be here, conceptually? In theory this sort
1392  // of message, if displayed, should be displayed from PeerFinder.
1393  if (config_->PEER_PRIVATE && config_->IPS_FIXED.empty())
1394  {
1395  JLOG(m_journal.warn())
1396  << "No outbound peer connections will be made";
1397  }
1398 
1399  // VFALCO NOTE the state timer resets the deadlock detector.
1400  //
1401  m_networkOPs->setStateTimer();
1402  }
1403  else
1404  {
1405  JLOG(m_journal.warn()) << "Running in standalone mode";
1406 
1407  m_networkOPs->setStandAlone();
1408  }
1409 
1410  if (config_->canSign())
1411  {
1412  JLOG(m_journal.warn()) << "*** The server is configured to allow the "
1413  "'sign' and 'sign_for'";
1414  JLOG(m_journal.warn()) << "*** commands. These commands have security "
1415  "implications and have";
1416  JLOG(m_journal.warn()) << "*** been deprecated. They will be removed "
1417  "in a future release of";
1418  JLOG(m_journal.warn()) << "*** rippled.";
1419  JLOG(m_journal.warn()) << "*** If you do not use them to sign "
1420  "transactions please edit your";
1421  JLOG(m_journal.warn())
1422  << "*** configuration file and remove the [enable_signing] stanza.";
1423  JLOG(m_journal.warn()) << "*** If you do use them to sign transactions "
1424  "please migrate to a";
1425  JLOG(m_journal.warn())
1426  << "*** standalone signing solution as soon as possible.";
1427  }
1428 
1429  //
1430  // Execute start up rpc commands.
1431  //
1432  for (auto cmd : config_->section(SECTION_RPC_STARTUP).lines())
1433  {
1434  Json::Reader jrReader;
1435  Json::Value jvCommand;
1436 
1437  if (!jrReader.parse(cmd, jvCommand))
1438  {
1439  JLOG(m_journal.fatal()) << "Couldn't parse entry in ["
1440  << SECTION_RPC_STARTUP << "]: '" << cmd;
1441  }
1442 
1443  if (!config_->quiet())
1444  {
1445  JLOG(m_journal.fatal())
1446  << "Startup RPC: " << jvCommand << std::endl;
1447  }
1448 
1451  RPC::JsonContext context{
1452  {journal("RPCHandler"),
1453  *this,
1454  loadType,
1455  getOPs(),
1456  getLedgerMaster(),
1457  c,
1458  Role::ADMIN,
1459  {},
1460  {},
1462  jvCommand};
1463 
1464  Json::Value jvResult;
1465  RPC::doCommand(context, jvResult);
1466 
1467  if (!config_->quiet())
1468  {
1469  JLOG(m_journal.fatal()) << "Result: " << jvResult << std::endl;
1470  }
1471  }
1472 
1473  RPC::ShardArchiveHandler* shardArchiveHandler = nullptr;
1474  if (shardStore_)
1475  {
1476  try
1477  {
1478  // Create a ShardArchiveHandler if recovery
1479  // is needed (there's a state database left
1480  // over from a previous run).
1481  auto handler = getShardArchiveHandler(true);
1482 
1483  // Recovery is needed.
1484  if (handler)
1485  shardArchiveHandler = handler;
1486  }
1487  catch (std::exception const& e)
1488  {
1489  JLOG(m_journal.fatal())
1490  << "Exception when starting ShardArchiveHandler from "
1491  "state database: "
1492  << e.what();
1493 
1494  return false;
1495  }
1496  }
1497 
1498  if (shardArchiveHandler && !shardArchiveHandler->start())
1499  {
1500  JLOG(m_journal.fatal()) << "Failed to start ShardArchiveHandler.";
1501 
1502  return false;
1503  }
1504 
1505  validatorSites_->start();
1506 
1507  if (reportingETL_)
1508  reportingETL_->start();
1509 
1510  return true;
1511 }
1512 
1513 void
1514 ApplicationImp::start(bool withTimers)
1515 {
1516  JLOG(m_journal.info()) << "Application starting. Version is "
1518 
1519  if (withTimers)
1520  {
1521  setSweepTimer();
1522  setEntropyTimer();
1523  }
1524 
1526  m_resolver->start();
1527  m_loadManager->start();
1528  m_shaMapStore->start();
1529  if (overlay_)
1530  overlay_->start();
1531  grpcServer_->start();
1532  ledgerCleaner_->start();
1533  perfLog_->start();
1534 }
1535 
1536 void
1538 {
1539  if (!config_->standalone())
1540  {
1541  // VFALCO NOTE This seems unnecessary. If we properly refactor the load
1542  // manager then the deadlock detector can just always be
1543  // "armed"
1544  //
1546  }
1547 
1548  {
1550  stoppingCondition_.wait(lk, [this] { return isTimeToStop.load(); });
1551  }
1552 
1553  JLOG(m_journal.debug()) << "Application stopping";
1554 
1556 
1557  // VFALCO Enormous hack, we have to force the probe to cancel
1558  // before we stop the io_service queue or else it never
1559  // unblocks in its destructor. The fix is to make all
1560  // io_objects gracefully handle exit so that we can
1561  // naturally return from io_service::run() instead of
1562  // forcing a call to io_service::stop()
1564 
1565  m_resolver->stop_async();
1566 
1567  // NIKB This is a hack - we need to wait for the resolver to
1568  // stop. before we stop the io_server_queue or weird
1569  // things will happen.
1570  m_resolver->stop();
1571 
1572  {
1573  boost::system::error_code ec;
1574  sweepTimer_.cancel(ec);
1575  if (ec)
1576  {
1577  JLOG(m_journal.error())
1578  << "Application: sweepTimer cancel error: " << ec.message();
1579  }
1580 
1581  ec.clear();
1582  entropyTimer_.cancel(ec);
1583  if (ec)
1584  {
1585  JLOG(m_journal.error())
1586  << "Application: entropyTimer cancel error: " << ec.message();
1587  }
1588  }
1589 
1590  // Make sure that any waitHandlers pending in our timers are done
1591  // before we declare ourselves stopped.
1592  using namespace std::chrono_literals;
1593 
1594  waitHandlerCounter_.join("Application", 1s, m_journal);
1595 
1596  mValidations.flush();
1597 
1598  validatorSites_->stop();
1599 
1600  // TODO Store manifests in manifests.sqlite instead of wallet.db
1601  validatorManifests_->save(
1602  getWalletDB(), "ValidatorManifests", [this](PublicKey const& pubKey) {
1603  return validators().listed(pubKey);
1604  });
1605 
1606  publisherManifests_->save(
1607  getWalletDB(), "PublisherManifests", [this](PublicKey const& pubKey) {
1608  return validators().trustedPublisher(pubKey);
1609  });
1610 
1611  // The order of these stop calls is delicate.
1612  // Re-ordering them risks undefined behavior.
1613  m_loadManager->stop();
1614  m_shaMapStore->stop();
1615  m_jobQueue->stop();
1617  shardArchiveHandler_->stop();
1618  if (overlay_)
1619  overlay_->stop();
1620  if (shardStore_)
1621  shardStore_->stop();
1622  grpcServer_->stop();
1623  m_networkOPs->stop();
1624  serverHandler_->stop();
1625  m_ledgerReplayer->stop();
1626  m_inboundTransactions->stop();
1627  m_inboundLedgers->stop();
1628  ledgerCleaner_->stop();
1629  if (reportingETL_)
1630  reportingETL_->stop();
1631  if (auto pg = dynamic_cast<PostgresDatabase*>(&*mRelationalDatabase))
1632  pg->stop();
1633  m_nodeStore->stop();
1634  perfLog_->stop();
1635 
1636  JLOG(m_journal.info()) << "Done.";
1637 }
1638 
1639 void
1641 {
1642  if (!isTimeToStop.exchange(true))
1643  {
1644  if (msg.empty())
1645  JLOG(m_journal.warn()) << "Server stopping";
1646  else
1647  JLOG(m_journal.warn()) << "Server stopping: " << msg;
1648 
1650  }
1651 }
1652 
1653 bool
1655 {
1656  return checkSigs_;
1657 }
1658 
1659 void
1661 {
1662  checkSigs_ = check;
1663 }
1664 
1665 bool
1667 {
1668  return isTimeToStop.load();
1669 }
1670 
1671 int
1673 {
1674  // Standard handles, config file, misc I/O etc:
1675  int needed = 128;
1676 
1677  // 2x the configured peer limit for peer connections:
1678  if (overlay_)
1679  needed += 2 * overlay_->limit();
1680 
1681  // the number of fds needed by the backend (internally
1682  // doubled if online delete is enabled).
1683  needed += std::max(5, m_shaMapStore->fdRequired());
1684 
1685  if (shardStore_)
1686  needed += shardStore_->fdRequired();
1687 
1688  // One fd per incoming connection a port can accept, or
1689  // if no limit is set, assume it'll handle 256 clients.
1690  for (auto const& p : serverHandler_->setup().ports)
1691  needed += std::max(256, p.limit);
1692 
1693  // The minimum number of file descriptors we need is 1024:
1694  return std::max(1024, needed);
1695 }
1696 
1697 //------------------------------------------------------------------------------
1698 
1699 void
1701 {
1702  std::vector<uint256> const initialAmendments =
1703  (config_->START_UP == Config::FRESH) ? m_amendmentTable->getDesired()
1705 
1706  std::shared_ptr<Ledger> const genesis = std::make_shared<Ledger>(
1707  create_genesis, *config_, initialAmendments, nodeFamily_);
1708  m_ledgerMaster->storeLedger(genesis);
1709 
1710  auto const next =
1711  std::make_shared<Ledger>(*genesis, timeKeeper().closeTime());
1712  next->updateSkipList();
1713  assert(
1714  next->info().seq < XRP_LEDGER_EARLIEST_FEES ||
1715  next->read(keylet::fees()));
1716  next->setImmutable();
1717  openLedger_.emplace(next, cachedSLEs_, logs_->journal("OpenLedger"));
1718  m_ledgerMaster->storeLedger(next);
1719  m_ledgerMaster->switchLCL(next);
1720 }
1721 
1724 {
1725  auto j = journal("Ledger");
1726 
1727  try
1728  {
1729  auto const [ledger, seq, hash] = getLatestLedger(*this);
1730 
1731  if (!ledger)
1732  return ledger;
1733 
1734  assert(
1735  ledger->info().seq < XRP_LEDGER_EARLIEST_FEES ||
1736  ledger->read(keylet::fees()));
1737  ledger->setImmutable();
1738 
1739  if (getLedgerMaster().haveLedger(seq))
1740  ledger->setValidated();
1741 
1742  if (ledger->info().hash == hash)
1743  {
1744  JLOG(j.trace()) << "Loaded ledger: " << hash;
1745  return ledger;
1746  }
1747 
1748  if (auto stream = j.error())
1749  {
1750  stream << "Failed on ledger";
1751  Json::Value p;
1752  addJson(p, {*ledger, nullptr, LedgerFill::full});
1753  stream << p;
1754  }
1755 
1756  return {};
1757  }
1758  catch (SHAMapMissingNode const& mn)
1759  {
1760  JLOG(j.warn()) << "Ledger in database: " << mn.what();
1761  return {};
1762  }
1763 }
1764 
1767 {
1768  try
1769  {
1770  std::ifstream ledgerFile(name, std::ios::in);
1771 
1772  if (!ledgerFile)
1773  {
1774  JLOG(m_journal.fatal()) << "Unable to open file '" << name << "'";
1775  return nullptr;
1776  }
1777 
1778  Json::Reader reader;
1779  Json::Value jLedger;
1780 
1781  if (!reader.parse(ledgerFile, jLedger))
1782  {
1783  JLOG(m_journal.fatal()) << "Unable to parse ledger JSON";
1784  return nullptr;
1785  }
1786 
1787  std::reference_wrapper<Json::Value> ledger(jLedger);
1788 
1789  // accept a wrapped ledger
1790  if (ledger.get().isMember("result"))
1791  ledger = ledger.get()["result"];
1792 
1793  if (ledger.get().isMember("ledger"))
1794  ledger = ledger.get()["ledger"];
1795 
1796  std::uint32_t seq = 1;
1797  auto closeTime = timeKeeper().closeTime();
1798  using namespace std::chrono_literals;
1799  auto closeTimeResolution = 30s;
1800  bool closeTimeEstimated = false;
1801  std::uint64_t totalDrops = 0;
1802 
1803  if (ledger.get().isMember("accountState"))
1804  {
1805  if (ledger.get().isMember(jss::ledger_index))
1806  {
1807  seq = ledger.get()[jss::ledger_index].asUInt();
1808  }
1809 
1810  if (ledger.get().isMember("close_time"))
1811  {
1812  using tp = NetClock::time_point;
1813  using d = tp::duration;
1814  closeTime = tp{d{ledger.get()["close_time"].asUInt()}};
1815  }
1816  if (ledger.get().isMember("close_time_resolution"))
1817  {
1818  using namespace std::chrono;
1819  closeTimeResolution =
1820  seconds{ledger.get()["close_time_resolution"].asUInt()};
1821  }
1822  if (ledger.get().isMember("close_time_estimated"))
1823  {
1824  closeTimeEstimated =
1825  ledger.get()["close_time_estimated"].asBool();
1826  }
1827  if (ledger.get().isMember("total_coins"))
1828  {
1829  totalDrops = beast::lexicalCastThrow<std::uint64_t>(
1830  ledger.get()["total_coins"].asString());
1831  }
1832 
1833  ledger = ledger.get()["accountState"];
1834  }
1835 
1836  if (!ledger.get().isArrayOrNull())
1837  {
1838  JLOG(m_journal.fatal()) << "State nodes must be an array";
1839  return nullptr;
1840  }
1841 
1842  auto loadLedger =
1843  std::make_shared<Ledger>(seq, closeTime, *config_, nodeFamily_);
1844  loadLedger->setTotalDrops(totalDrops);
1845 
1846  for (Json::UInt index = 0; index < ledger.get().size(); ++index)
1847  {
1848  Json::Value& entry = ledger.get()[index];
1849 
1850  if (!entry.isObjectOrNull())
1851  {
1852  JLOG(m_journal.fatal()) << "Invalid entry in ledger";
1853  return nullptr;
1854  }
1855 
1856  uint256 uIndex;
1857 
1858  if (!uIndex.parseHex(entry[jss::index].asString()))
1859  {
1860  JLOG(m_journal.fatal()) << "Invalid entry in ledger";
1861  return nullptr;
1862  }
1863 
1864  entry.removeMember(jss::index);
1865 
1866  STParsedJSONObject stp("sle", ledger.get()[index]);
1867 
1868  if (!stp.object || uIndex.isZero())
1869  {
1870  JLOG(m_journal.fatal()) << "Invalid entry in ledger";
1871  return nullptr;
1872  }
1873 
1874  // VFALCO TODO This is the only place that
1875  // constructor is used, try to remove it
1876  STLedgerEntry sle(*stp.object, uIndex);
1877 
1878  if (!loadLedger->addSLE(sle))
1879  {
1880  JLOG(m_journal.fatal())
1881  << "Couldn't add serialized ledger: " << uIndex;
1882  return nullptr;
1883  }
1884  }
1885 
1886  loadLedger->stateMap().flushDirty(hotACCOUNT_NODE);
1887 
1888  assert(
1889  loadLedger->info().seq < XRP_LEDGER_EARLIEST_FEES ||
1890  loadLedger->read(keylet::fees()));
1891  loadLedger->setAccepted(
1892  closeTime, closeTimeResolution, !closeTimeEstimated);
1893 
1894  return loadLedger;
1895  }
1896  catch (std::exception const& x)
1897  {
1898  JLOG(m_journal.fatal()) << "Ledger contains invalid data: " << x.what();
1899  return nullptr;
1900  }
1901 }
1902 
1903 bool
1905  std::string const& ledgerID,
1906  bool replay,
1907  bool isFileName)
1908 {
1909  try
1910  {
1911  std::shared_ptr<Ledger const> loadLedger, replayLedger;
1912 
1913  if (isFileName)
1914  {
1915  if (!ledgerID.empty())
1916  loadLedger = loadLedgerFromFile(ledgerID);
1917  }
1918  else if (ledgerID.length() == 64)
1919  {
1920  uint256 hash;
1921 
1922  if (hash.parseHex(ledgerID))
1923  {
1924  loadLedger = loadByHash(hash, *this);
1925 
1926  if (!loadLedger)
1927  {
1928  // Try to build the ledger from the back end
1929  auto il = std::make_shared<InboundLedger>(
1930  *this,
1931  hash,
1932  0,
1934  stopwatch(),
1935  make_DummyPeerSet(*this));
1936  if (il->checkLocal())
1937  loadLedger = il->getLedger();
1938  }
1939  }
1940  }
1941  else if (ledgerID.empty() || boost::iequals(ledgerID, "latest"))
1942  {
1943  loadLedger = getLastFullLedger();
1944  }
1945  else
1946  {
1947  // assume by sequence
1948  std::uint32_t index;
1949 
1950  if (beast::lexicalCastChecked(index, ledgerID))
1951  loadLedger = loadByIndex(index, *this);
1952  }
1953 
1954  if (!loadLedger)
1955  return false;
1956 
1957  if (replay)
1958  {
1959  // Replay a ledger close with same prior ledger and transactions
1960 
1961  // this ledger holds the transactions we want to replay
1962  replayLedger = loadLedger;
1963 
1964  JLOG(m_journal.info()) << "Loading parent ledger";
1965 
1966  loadLedger = loadByHash(replayLedger->info().parentHash, *this);
1967  if (!loadLedger)
1968  {
1969  JLOG(m_journal.info())
1970  << "Loading parent ledger from node store";
1971 
1972  // Try to build the ledger from the back end
1973  auto il = std::make_shared<InboundLedger>(
1974  *this,
1975  replayLedger->info().parentHash,
1976  0,
1978  stopwatch(),
1979  make_DummyPeerSet(*this));
1980 
1981  if (il->checkLocal())
1982  loadLedger = il->getLedger();
1983 
1984  if (!loadLedger)
1985  {
1986  JLOG(m_journal.fatal()) << "Replay ledger missing/damaged";
1987  assert(false);
1988  return false;
1989  }
1990  }
1991  }
1992  using namespace std::chrono_literals;
1993  using namespace date;
1994  static constexpr NetClock::time_point ledgerWarnTimePoint{
1995  sys_days{January / 1 / 2018} - sys_days{January / 1 / 2000}};
1996  if (loadLedger->info().closeTime < ledgerWarnTimePoint)
1997  {
1998  JLOG(m_journal.fatal())
1999  << "\n\n*** WARNING ***\n"
2000  "You are replaying a ledger from before "
2001  << to_string(ledgerWarnTimePoint)
2002  << " UTC.\n"
2003  "This replay will not handle your ledger as it was "
2004  "originally "
2005  "handled.\nConsider running an earlier version of rippled "
2006  "to "
2007  "get the older rules.\n*** CONTINUING ***\n";
2008  }
2009 
2010  JLOG(m_journal.info()) << "Loading ledger " << loadLedger->info().hash
2011  << " seq:" << loadLedger->info().seq;
2012 
2013  if (loadLedger->info().accountHash.isZero())
2014  {
2015  JLOG(m_journal.fatal()) << "Ledger is empty.";
2016  assert(false);
2017  return false;
2018  }
2019 
2020  if (!loadLedger->walkLedger(journal("Ledger"), true))
2021  {
2022  JLOG(m_journal.fatal()) << "Ledger is missing nodes.";
2023  assert(false);
2024  return false;
2025  }
2026 
2027  if (!loadLedger->assertSensible(journal("Ledger")))
2028  {
2029  JLOG(m_journal.fatal()) << "Ledger is not sensible.";
2030  assert(false);
2031  return false;
2032  }
2033 
2034  m_ledgerMaster->setLedgerRangePresent(
2035  loadLedger->info().seq, loadLedger->info().seq);
2036 
2037  m_ledgerMaster->switchLCL(loadLedger);
2038  loadLedger->setValidated();
2039  m_ledgerMaster->setFullLedger(loadLedger, true, false);
2040  openLedger_.emplace(
2041  loadLedger, cachedSLEs_, logs_->journal("OpenLedger"));
2042 
2043  if (replay)
2044  {
2045  // inject transaction(s) from the replayLedger into our open ledger
2046  // and build replay structure
2047  auto replayData =
2048  std::make_unique<LedgerReplay>(loadLedger, replayLedger);
2049 
2050  for (auto const& [_, tx] : replayData->orderedTxns())
2051  {
2052  (void)_;
2053  auto txID = tx->getTransactionID();
2054 
2055  auto s = std::make_shared<Serializer>();
2056  tx->add(*s);
2057 
2059 
2060  openLedger_->modify(
2061  [&txID, &s](OpenView& view, beast::Journal j) {
2062  view.rawTxInsert(txID, std::move(s), nullptr);
2063  return true;
2064  });
2065  }
2066 
2067  m_ledgerMaster->takeReplay(std::move(replayData));
2068  }
2069  }
2070  catch (SHAMapMissingNode const& mn)
2071  {
2072  JLOG(m_journal.fatal())
2073  << "While loading specified ledger: " << mn.what();
2074  return false;
2075  }
2076  catch (boost::bad_lexical_cast&)
2077  {
2078  JLOG(m_journal.fatal())
2079  << "Ledger specified '" << ledgerID << "' is not valid";
2080  return false;
2081  }
2082 
2083  return true;
2084 }
2085 
2086 bool
2088 {
2089  if (!config().ELB_SUPPORT)
2090  return true;
2091 
2092  if (isStopping())
2093  {
2094  reason = "Server is shutting down";
2095  return false;
2096  }
2097 
2098  if (getOPs().isNeedNetworkLedger())
2099  {
2100  reason = "Not synchronized with network yet";
2101  return false;
2102  }
2103 
2104  if (getOPs().isAmendmentBlocked())
2105  {
2106  reason = "Server version too old";
2107  return false;
2108  }
2109 
2110  if (getOPs().isUNLBlocked())
2111  {
2112  reason = "No valid validator list available";
2113  return false;
2114  }
2115 
2116  if (getOPs().getOperatingMode() < OperatingMode::SYNCING)
2117  {
2118  reason = "Not synchronized with network";
2119  return false;
2120  }
2121 
2122  if (!getLedgerMaster().isCaughtUp(reason))
2123  return false;
2124 
2125  if (getFeeTrack().isLoadedLocal())
2126  {
2127  reason = "Too much load";
2128  return false;
2129  }
2130 
2131  return true;
2132 }
2133 
2136 {
2137  return logs_->journal(name);
2138 }
2139 
2140 bool
2142 {
2143  assert(overlay_);
2144  assert(!config_->standalone());
2145 
2146  if (config_->section(ConfigSection::shardDatabase()).empty())
2147  {
2148  JLOG(m_journal.fatal())
2149  << "The [shard_db] configuration setting must be set";
2150  return false;
2151  }
2152  if (!shardStore_)
2153  {
2154  JLOG(m_journal.fatal()) << "Invalid [shard_db] configuration";
2155  return false;
2156  }
2157  shardStore_->importDatabase(getNodeStore());
2158  return true;
2159 }
2160 
2161 void
2163 {
2164  auto seq = getRelationalDatabase().getMaxLedgerSeq();
2165  if (seq)
2166  maxDisallowedLedger_ = *seq;
2167 
2168  JLOG(m_journal.trace())
2169  << "Max persisted ledger is " << maxDisallowedLedger_;
2170 }
2171 
2172 //------------------------------------------------------------------------------
2173 
2174 Application::Application() : beast::PropertyStream::Source("app")
2175 {
2176 }
2177 
2178 //------------------------------------------------------------------------------
2179 
2182  std::unique_ptr<Config> config,
2183  std::unique_ptr<Logs> logs,
2184  std::unique_ptr<TimeKeeper> timeKeeper)
2185 {
2186  return std::make_unique<ApplicationImp>(
2187  std::move(config), std::move(logs), std::move(timeKeeper));
2188 }
2189 
2190 } // 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:339
ripple::setup_TxQ
TxQ::Setup setup_TxQ(Config const &config)
Build a TxQ::Setup object from application configuration.
Definition: TxQ.cpp:1881
ripple::ApplicationImp::getReportingETL
ReportingETL & getReportingETL() override
Definition: Application.cpp:903
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:115
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:2236
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:811
ripple::TaggedCache::sweep
void sweep()
Definition: TaggedCache.h:204
std::strlen
T strlen(T... args)
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:781
std::shared_ptr
STL class.
ripple::ApplicationImp::getNodeStore
NodeStore::Database & getNodeStore() override
Definition: Application.cpp:679
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:889
ripple::ApplicationImp::serverOkay
bool serverOkay(std::string &reason) override
Definition: Application.cpp:2087
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:1874
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:648
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:799
beast::Journal::trace
Stream trace() const
Severity stream access functions.
Definition: Journal.h:309
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:775
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:982
ripple::LedgerMaster
Definition: LedgerMaster.h:70
ripple::ApplicationImp::getInboundLedgers
InboundLedgers & getInboundLedgers() override
Definition: Application.cpp:636
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:630
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:1537
ripple::make_InboundLedgers
std::unique_ptr< InboundLedgers > make_InboundLedgers(Application &app, InboundLedgers::clock_type &clock, beast::insight::Collector::ptr const &collector)
Definition: InboundLedgers.cpp:434
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:218
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:823
ripple::ApplicationImp::getWalletDB
DatabaseCon & getWalletDB() override
Retrieve the "wallet database".
Definition: Application.cpp:896
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:687
ripple::ApplicationImp::openLedger
OpenLedger const & openLedger() const override
Definition: Application.cpp:867
ripple::ApplicationImp::getIOLatency
std::chrono::milliseconds getIOLatency() override
Definition: Application.cpp:612
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:153
beast::Journal::warn
Stream warn() const
Definition: Journal.h:327
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:606
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:835
ripple::stopwatch
Stopwatch & stopwatch()
Returns an instance of a wall clock.
Definition: chrono.h:88
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:4579
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:618
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:918
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:240
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:693
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: ServerHandlerImp.cpp:1235
ripple::ApplicationImp::loadLedgerFromFile
std::shared_ptr< Ledger > loadLedgerFromFile(std::string const &ledgerID)
Definition: Application.cpp:1766
ripple::ApplicationImp::checkSigs
bool checkSigs() const override
Definition: Application.cpp:1654
ripple::ApplicationImp::journal
beast::Journal journal(std::string const &name) override
Definition: Application.cpp:2135
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:1086
ripple::ApplicationImp::nodeToShards
bool nodeToShards()
Definition: Application.cpp:2141
ripple::ApplicationImp::hashRouter_
std::unique_ptr< HashRouter > hashRouter_
Definition: Application.cpp:217
ripple::ApplicationImp::getMasterMutex
Application::MutexType & getMasterMutex() override
Definition: Application.cpp:751
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:337
ripple::ApplicationImp::getPerfLog
perf::PerfLog & getPerfLog() override
Definition: Application.cpp:667
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: ServerHandlerImp.cpp:1247
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::TxQ
Transaction Queue.
Definition: TxQ.h:57
ripple::Config::FORCE_MULTI_THREAD
bool FORCE_MULTI_THREAD
Definition: Config.h:244
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:847
ripple::Role::ADMIN
@ ADMIN
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:787
ripple::ApplicationImp::loadOldLedger
bool loadOldLedger(std::string const &ledgerID, bool replay, bool isFilename)
Definition: Application.cpp:1904
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
std::atomic::load
T load(T... args)
ripple::Config
Definition: Config.h:89
ripple::ApplicationImp::io_latency_sampler::cancel
void cancel()
Definition: Application.cpp:153
ripple::PublicKey::size
std::size_t size() const noexcept
Definition: PublicKey.h:87
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:763
ripple::ApplicationImp::peerReservations
PeerReservationTable & peerReservations() override
Definition: Application.cpp:841
ripple::ApplicationImp::publisherManifests
ManifestCache & publisherManifests() override
Definition: Application.cpp:829
ripple::ApplicationImp::m_amendmentTable
std::unique_ptr< AmendmentTable > m_amendmentTable
Definition: Application.cpp:215
ripple::Config::NETWORK
@ NETWORK
Definition: Config.h:153
ripple::ApplicationImp::overlay
Overlay & overlay() override
Definition: Application.cpp:875
ripple::megabytes
constexpr auto megabytes(T value) noexcept
Definition: ByteUtilities.h:34
ripple::ApplicationImp::pendingSaves
PendingSaves & pendingSaves() override
Definition: Application.cpp:853
ripple::ApplicationImp::m_collectorManager
std::unique_ptr< CollectorManager > m_collectorManager
Definition: Application.cpp:179
ripple::Config::standalone
bool standalone() const
Definition: Config.h:332
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:49
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:817
ripple::ApplicationImp::nodeIdentity
std::pair< PublicKey, SecretKey > const & nodeIdentity() override
Definition: Application.cpp:588
beast::Journal::error
Stream error() const
Definition: Journal.h:333
beast::Journal::info
Stream info() const
Definition: Journal.h:321
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:37
beast::basic_logstream
Definition: Journal.h:428
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:1723
ripple::TimeKeeper::closeTime
virtual time_point closeTime() const =0
Returns the close time, in network time.
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::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:239
std::condition_variable::wait
T wait(T... args)
ripple::ApplicationImp::gotTXSet
void gotTXSet(std::shared_ptr< SHAMap > const &set, bool fromAcquire)
Definition: Application.cpp:654
std::atomic< std::chrono::milliseconds >
ripple::ApplicationImp::startGenesisLedger
void startGenesisLedger()
Definition: Application.cpp:1700
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:32
ripple::ApplicationImp::timeKeeper
TimeKeeper & timeKeeper() override
Definition: Application.cpp:576
beast::io_latency_probe< std::chrono::steady_clock >
ripple::OrderBookDB
Definition: OrderBookDB.h:30
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::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:2174
std::min
T min(T... args)
ripple::ApplicationImp::setMaxDisallowedLedger
void setMaxDisallowedLedger()
Definition: Application.cpp:2162
ripple::Resource::Manager
Tracks load and resource consumption.
Definition: ResourceManager.h:36
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:989
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:859
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:882
ripple::PeerReservationTable
Definition: PeerReservationTable.h:79
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
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:153
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:673
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:1672
ripple::ApplicationImp::doSweep
void doSweep()
Definition: Application.cpp:1049
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:769
ripple::ApplicationImp
Definition: Application.cpp:98
ripple::ApplicationImp::getLoadManager
LoadManager & getLoadManager() override
Definition: Application.cpp:757
beast::lexicalCastChecked
bool lexicalCastChecked(Out &out, In in)
Intelligently convert from one type to another.
Definition: LexicalCast.h:266
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:1666
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:153
ripple::ApplicationImp::getInboundTransactions
InboundTransactions & getInboundTransactions() override
Definition: Application.cpp:642
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:244
ripple::ApplicationImp::mFeeTrack
std::unique_ptr< LoadFeeTrack > mFeeTrack
Definition: Application.cpp:216
ripple::ApplicationImp::getFeeTrack
LoadFeeTrack & getFeeTrack() override
Definition: Application.cpp:793
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:286
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:624
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
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::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:315
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:171
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:812
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::PathRequests
Definition: PathRequests.h:33
ripple::ApplicationImp::setup
bool setup(boost::program_options::variables_map const &cmdline) override
Definition: Application.cpp:1119
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:944
ripple::ApplicationImp::maxDisallowedLedger_
std::atomic< LedgerIndex > maxDisallowedLedger_
Definition: Application.cpp:1094
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:1640
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:661
std::unique_ptr
STL class.
ripple::NetClock::time_point
std::chrono::time_point< NetClock > time_point
Definition: chrono.h:56
ripple::Config::LOAD_FILE
@ LOAD_FILE
Definition: Config.h:153
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:805
ripple::ApplicationImp::setEntropyTimer
void setEntropyTimer()
Definition: Application.cpp:1020
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:2181
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:1514
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::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