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(
66  std::piecewise_construct, std::make_tuple(path), std::make_tuple());
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:
89  size_t keyBytes,
90  Section const& keyValues,
91  Scheduler& scheduler,
92  beast::Journal journal)
93  : name_(get<std::string>(keyValues, "path")), journal_(journal)
94  {
95  boost::ignore_unused(journal_); // Keep unused journal_ just in case.
96  if (name_.empty())
97  Throw<std::runtime_error>("Missing path in Memory backend");
98  }
99 
100  ~MemoryBackend() override
101  {
102  close();
103  }
104 
106  getName() override
107  {
108  return name_;
109  }
110 
111  void
112  open(bool createIfMissing) override
113  {
115  }
116 
117  void
118  close() override
119  {
120  db_ = nullptr;
121  }
122 
123  //--------------------------------------------------------------------------
124 
125  Status
126  fetch(void const* key, std::shared_ptr<NodeObject>* pObject) override
127  {
128  assert(db_);
129  uint256 const hash(uint256::fromVoid(key));
130 
132 
133  Map::iterator iter = db_->table.find(hash);
134  if (iter == db_->table.end())
135  {
136  pObject->reset();
137  return notFound;
138  }
139  *pObject = iter->second;
140  return ok;
141  }
142 
143  bool
144  canFetchBatch() override
145  {
146  return false;
147  }
148 
150  fetchBatch(std::size_t n, void const* const* keys) override
151  {
152  Throw<std::runtime_error>("pure virtual called");
153  return {};
154  }
155 
156  void
157  store(std::shared_ptr<NodeObject> const& object) override
158  {
159  assert(db_);
161  db_->table.emplace(object->getHash(), object);
162  }
163 
164  void
165  storeBatch(Batch const& batch) override
166  {
167  for (auto const& e : batch)
168  store(e);
169  }
170 
171  void
173  {
174  assert(db_);
175  for (auto const& e : db_->table)
176  f(e.second);
177  }
178 
179  int
180  getWriteLoad() override
181  {
182  return 0;
183  }
184 
185  void
186  setDeletePath() override
187  {
188  }
189 
190  void
191  verify() override
192  {
193  }
194 
195  int
196  fdRequired() const override
197  {
198  return 0;
199  }
200 };
201 
202 //------------------------------------------------------------------------------
203 
205 {
206  Manager::instance().insert(*this);
207 }
208 
210 {
211  Manager::instance().erase(*this);
212 }
213 
216 {
217  return "Memory";
218 }
219 
222  size_t keyBytes,
223  Section const& keyValues,
224  Scheduler& scheduler,
225  beast::Journal journal)
226 {
227  return std::make_unique<MemoryBackend>(
228  keyBytes, keyValues, scheduler, journal);
229 }
230 
231 } // namespace NodeStore
232 } // namespace ripple
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:150
ripple::NodeStore::MemoryBackend::fdRequired
int fdRequired() const override
Returns the number of file descriptors the backend expects to need.
Definition: MemoryFactory.cpp:196
ripple::NodeStore::ok
@ ok
Definition: nodestore/Types.h:45
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:221
ripple::NodeStore::MemoryBackend::~MemoryBackend
~MemoryBackend() override
Definition: MemoryFactory.cpp:100
std::vector
STL class.
ripple::NodeStore::MemoryFactory::getName
std::string getName() const override
Retrieve the name of this factory.
Definition: MemoryFactory.cpp:215
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:186
std::function
ripple::NodeStore::MemoryBackend::getName
std::string getName() override
Get the human-readable name of this backend.
Definition: MemoryFactory.cpp:106
ripple::NodeStore::MemoryBackend::fetch
Status fetch(void const *key, std::shared_ptr< NodeObject > *pObject) override
Fetch a single object.
Definition: MemoryFactory.cpp:126
ripple::NodeStore::MemoryBackend::store
void store(std::shared_ptr< NodeObject > const &object) override
Store a single object.
Definition: MemoryFactory.cpp:157
std::shared_ptr::reset
T reset(T... args)
ripple::NodeStore::MemoryFactory::~MemoryFactory
~MemoryFactory() override
Definition: MemoryFactory.cpp:209
ripple::NodeStore::notFound
@ notFound
Definition: nodestore/Types.h:46
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:204
ripple::NodeStore::MemoryBackend::close
void close() override
Close the backend.
Definition: MemoryFactory.cpp:118
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:180
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
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:165
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:44
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:172
std
STL namespace.
ripple::base_uint< 256 >::fromVoid
static base_uint fromVoid(void const *data)
Definition: base_uint.h:213
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:112
mutex
std::size_t
ripple::NodeStore::MemoryBackend::verify
void verify() override
Perform consistency checks on database.
Definition: MemoryFactory.cpp:191
ripple::NodeStore::MemoryBackend::canFetchBatch
bool canFetchBatch() override
Return true if batch fetches are optimized.
Definition: MemoryFactory.cpp:144
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:116
ripple::NodeStore::MemoryDB::MemoryDB
MemoryDB()=default
ripple::NodeStore::Backend
A backend used for the NodeStore.
Definition: Backend.h:37