rippled
MemoryFactory.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/basics/contract.h>
21 #include <ripple/nodestore/Factory.h>
22 #include <ripple/nodestore/Manager.h>
23 #include <boost/beast/core/string.hpp>
24 #include <boost/core/ignore_unused.hpp>
25 #include <map>
26 #include <memory>
27 #include <mutex>
28 
29 namespace ripple {
30 namespace NodeStore {
31 
32 struct MemoryDB
33 {
34  explicit MemoryDB() = default;
35 
37  bool open = false;
39 };
40 
41 class MemoryFactory : public Factory
42 {
43 private:
46 
47 public:
48  MemoryFactory();
49  ~MemoryFactory() override;
50 
52  getName() const override;
53 
56  size_t keyBytes,
57  Section const& keyValues,
58  Scheduler& scheduler,
59  beast::Journal journal) override;
60 
61  MemoryDB&
62  open (std::string const& path)
63  {
65  auto const result = map_.emplace (std::piecewise_construct,
67  MemoryDB& db = result.first->second;
68  if (db.open)
69  Throw<std::runtime_error> ("already open");
70  return db;
71  }
72 };
73 
75 
76 //------------------------------------------------------------------------------
77 
78 class MemoryBackend : public Backend
79 {
80 private:
82 
85  MemoryDB* db_ {nullptr};
86 
87 public:
88  MemoryBackend (size_t keyBytes, Section const& keyValues,
89  Scheduler& scheduler, beast::Journal journal)
90  : name_ (get<std::string>(keyValues, "path"))
91  , journal_ (journal)
92  {
93  boost::ignore_unused (journal_); // Keep unused journal_ just in case.
94  if (name_.empty())
95  Throw<std::runtime_error> ("Missing path in Memory backend");
96  }
97 
98  ~MemoryBackend () override
99  {
100  close();
101  }
102 
104  getName () override
105  {
106  return name_;
107  }
108 
109  void
110  open(bool createIfMissing) override
111  {
113  }
114 
115  void
116  close() override
117  {
118  db_ = nullptr;
119  }
120 
121  //--------------------------------------------------------------------------
122 
123  Status
124  fetch (void const* key, std::shared_ptr<NodeObject>* pObject) override
125  {
126  assert(db_);
127  uint256 const hash (uint256::fromVoid (key));
128 
130 
131  Map::iterator iter = db_->table.find (hash);
132  if (iter == db_->table.end())
133  {
134  pObject->reset();
135  return notFound;
136  }
137  *pObject = iter->second;
138  return ok;
139  }
140 
141  bool
142  canFetchBatch() override
143  {
144  return false;
145  }
146 
148  fetchBatch (std::size_t n, void const* const* keys) override
149  {
150  Throw<std::runtime_error> ("pure virtual called");
151  return {};
152  }
153 
154  void
155  store (std::shared_ptr<NodeObject> const& object) override
156  {
157  assert(db_);
159  db_->table.emplace (object->getHash(), object);
160  }
161 
162  void
163  storeBatch (Batch const& batch) override
164  {
165  for (auto const& e : batch)
166  store (e);
167  }
168 
169  void
171  {
172  assert(db_);
173  for (auto const& e : db_->table)
174  f (e.second);
175  }
176 
177  int
178  getWriteLoad() override
179  {
180  return 0;
181  }
182 
183  void
184  setDeletePath() override
185  {
186  }
187 
188  void
189  verify() override
190  {
191  }
192 
193  int
194  fdRequired() const override
195  {
196  return 0;
197  }
198 };
199 
200 //------------------------------------------------------------------------------
201 
203 {
204  Manager::instance().insert(*this);
205 }
206 
208 {
209  Manager::instance().erase(*this);
210 }
211 
214 {
215  return "Memory";
216 }
217 
220  size_t keyBytes,
221  Section const& keyValues,
222  Scheduler& scheduler,
223  beast::Journal journal)
224 {
225  return std::make_unique <MemoryBackend> (
226  keyBytes, keyValues, scheduler, journal);
227 }
228 
229 }
230 }
ripple::Section
Holds a collection of configuration values.
Definition: BasicConfig.h:43
ripple::NodeStore::Factory
Base class for backend factories.
Definition: Factory.h:32
std::make_tuple
T make_tuple(T... args)
std::string
STL class.
std::shared_ptr< NodeObject >
ripple::NodeStore::MemoryBackend::fetchBatch
std::vector< std::shared_ptr< NodeObject > > fetchBatch(std::size_t n, void const *const *keys) override
Fetch a batch synchronously.
Definition: MemoryFactory.cpp:148
ripple::NodeStore::MemoryBackend::fdRequired
int fdRequired() const override
Returns the number of file descriptors the backend expects to need.
Definition: MemoryFactory.cpp:194
ripple::NodeStore::ok
@ ok
Definition: nodestore/Types.h:47
ripple::NodeStore::Manager::erase
virtual void erase(Factory &factory)=0
Remove a factory.
ripple::NodeStore::MemoryFactory
Definition: MemoryFactory.cpp:41
ripple::NodeStore::MemoryFactory::createInstance
std::unique_ptr< Backend > createInstance(size_t keyBytes, Section const &keyValues, Scheduler &scheduler, beast::Journal journal) override
Create an instance of this factory's backend.
Definition: MemoryFactory.cpp:219
ripple::NodeStore::MemoryBackend::~MemoryBackend
~MemoryBackend() override
Definition: MemoryFactory.cpp:98
std::vector
STL class.
ripple::NodeStore::MemoryFactory::getName
std::string getName() const override
Retrieve the name of this factory.
Definition: MemoryFactory.cpp:213
ripple::NodeStore::MemoryBackend::db_
MemoryDB * db_
Definition: MemoryFactory.cpp:85
std::lock_guard
STL class.
ripple::NodeStore::MemoryBackend::setDeletePath
void setDeletePath() override
Remove contents on disk upon destruction.
Definition: MemoryFactory.cpp:184
std::function
ripple::NodeStore::MemoryBackend::getName
std::string getName() override
Get the human-readable name of this backend.
Definition: MemoryFactory.cpp:104
ripple::NodeStore::MemoryBackend::fetch
Status fetch(void const *key, std::shared_ptr< NodeObject > *pObject) override
Fetch a single object.
Definition: MemoryFactory.cpp:124
ripple::NodeStore::MemoryBackend::store
void store(std::shared_ptr< NodeObject > const &object) override
Store a single object.
Definition: MemoryFactory.cpp:155
std::shared_ptr::reset
T reset(T... args)
ripple::NodeStore::MemoryFactory::~MemoryFactory
~MemoryFactory() override
Definition: MemoryFactory.cpp:207
ripple::NodeStore::notFound
@ notFound
Definition: nodestore/Types.h:48
ripple::NodeStore::MemoryFactory::map_
std::map< std::string, MemoryDB, boost::beast::iless > map_
Definition: MemoryFactory.cpp:45
ripple::base_uint< 256 >
ripple::NodeStore::MemoryFactory::MemoryFactory
MemoryFactory()
Definition: MemoryFactory.cpp:202
ripple::NodeStore::MemoryBackend::close
void close() override
Close the backend.
Definition: MemoryFactory.cpp:116
ripple::NodeStore::Manager::insert
virtual void insert(Factory &factory)=0
Add a factory.
ripple::NodeStore::MemoryFactory::mutex_
std::mutex mutex_
Definition: MemoryFactory.cpp:44
ripple::NodeStore::MemoryBackend::MemoryBackend
MemoryBackend(size_t keyBytes, Section const &keyValues, Scheduler &scheduler, beast::Journal journal)
Definition: MemoryFactory.cpp:88
ripple::NodeStore::MemoryFactory::open
MemoryDB & open(std::string const &path)
Definition: MemoryFactory.cpp:62
ripple::NodeStore::MemoryDB::table
std::map< uint256 const, std::shared_ptr< NodeObject > > table
Definition: MemoryFactory.cpp:38
ripple::NodeStore::MemoryBackend::getWriteLoad
int getWriteLoad() override
Estimate the number of write operations pending.
Definition: MemoryFactory.cpp:178
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:60
map
ripple::NodeStore::Scheduler
Scheduling for asynchronous backend activity.
Definition: ripple/nodestore/Scheduler.h:57
ripple::NodeStore::MemoryBackend::storeBatch
void storeBatch(Batch const &batch) override
Store a group of objects.
Definition: MemoryFactory.cpp:163
memory
ripple::NodeStore::MemoryDB::open
bool open
Definition: MemoryFactory.cpp:37
ripple::NodeStore::MemoryBackend
Definition: MemoryFactory.cpp:78
ripple::NodeStore::Status
Status
Return codes from Backend operations.
Definition: nodestore/Types.h:45
ripple::NodeStore::MemoryDB
Definition: MemoryFactory.cpp:32
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::NodeStore::MemoryBackend::journal_
const beast::Journal journal_
Definition: MemoryFactory.cpp:84
ripple::NodeStore::MemoryDB::mutex
std::mutex mutex
Definition: MemoryFactory.cpp:36
ripple::NodeStore::MemoryBackend::for_each
void for_each(std::function< void(std::shared_ptr< NodeObject >)> f) override
Visit every object in the database This is usually called during import.
Definition: MemoryFactory.cpp:170
std
STL namespace.
ripple::base_uint< 256 >::fromVoid
static base_uint fromVoid(void const *data)
Definition: base_uint.h:184
ripple::NodeStore::memoryFactory
static MemoryFactory memoryFactory
Definition: MemoryFactory.cpp:74
std::string::empty
T empty(T... args)
ripple::NodeStore::MemoryBackend::open
void open(bool createIfMissing) override
Open the backend.
Definition: MemoryFactory.cpp:110
mutex
std::size_t
ripple::NodeStore::MemoryBackend::verify
void verify() override
Perform consistency checks on database.
Definition: MemoryFactory.cpp:189
ripple::NodeStore::MemoryBackend::canFetchBatch
bool canFetchBatch() override
Return true if batch fetches are optimized.
Definition: MemoryFactory.cpp:142
ripple::NodeStore::MemoryBackend::name_
std::string name_
Definition: MemoryFactory.cpp:83
ripple::NodeStore::Manager::instance
static Manager & instance()
Returns the instance of the manager singleton.
Definition: ManagerImp.cpp:117
std::unique_ptr
STL class.
ripple::get
T & get(EitherAmount &amt)
Definition: AmountSpec.h:124
ripple::NodeStore::MemoryDB::MemoryDB
MemoryDB()=default
ripple::NodeStore::Backend
A backend used for the NodeStore.
Definition: Backend.h:37