hyperledger/iroha
Iroha - A simple, decentralized ledger http://iroha.tech
storage_base.hpp
Go to the documentation of this file.
1 
6 #ifndef IROHA_STORAGE_BASE_HPP
7 #define IROHA_STORAGE_BASE_HPP
8 
9 #include "ametsuchi/storage.hpp"
10 
11 #include <atomic>
12 #include <shared_mutex>
13 
14 #include <boost/optional.hpp>
17 #include "ametsuchi/indexer.hpp"
24 #include "logger/logger_fwd.hpp"
26 
27 namespace shared_model::interface {
28  class QueryResponseFactory;
29 } // namespace shared_model::interface
30 namespace iroha {
31  class PendingTransactionStorage;
32 }
33 
34 namespace iroha::ametsuchi {
35 
36  class AmetsuchiTest;
37  class PostgresOptions;
38  class VmCaller;
39 
40  class StorageBase : public Storage {
41  std::shared_ptr<BlockStorage> block_store_;
42  std::function<void(std::shared_ptr<shared_model::interface::Block const>)>
43  callback_;
44  std::shared_ptr<shared_model::interface::PermissionToString>
45  perm_converter_;
46  std::shared_ptr<PendingTransactionStorage> pending_txs_storage_;
47  std::shared_ptr<shared_model::interface::QueryResponseFactory>
48  query_response_factory_;
49  std::unique_ptr<BlockStorageFactory> temporary_block_storage_factory_;
50  std::optional<std::reference_wrapper<const VmCaller>> vm_caller_ref_;
51  logger::LoggerManagerTreePtr log_manager_;
52  logger::LoggerPtr log_;
53  boost::optional<std::shared_ptr<const iroha::LedgerState>> ledger_state_;
54  bool prepared_blocks_enabled_;
55  std::atomic<bool> block_is_prepared_;
56  std::string prepared_block_name_;
57 
58  protected:
59  CommitResult commitPreparedImpl(
60  std::shared_ptr<const shared_model::interface::Block> block,
61  DatabaseTransaction &db_context,
62  WsvCommand &wsv_command,
63  WsvQuery &wsv_query,
64  std::unique_ptr<Indexer> indexer);
65 
66  public:
68 
69  StorageBase(StorageBase &&) = delete;
70  StorageBase(StorageBase const &) = delete;
71 
72  StorageBase &operator=(StorageBase &&) = delete;
73  StorageBase &operator=(StorageBase const &) = delete;
74 
75  boost::optional<std::shared_ptr<PeerQuery>> createPeerQuery()
76  const override;
77 
78  bool preparedCommitEnabled() const override;
79 
80  boost::optional<std::shared_ptr<BlockQuery>> createBlockQuery()
81  const override {
82  auto block_query = getBlockQuery();
83  if (not block_query) {
84  return boost::none;
85  }
86  return boost::make_optional(block_query);
87  }
88 
90  return log_manager_;
91  }
92 
93  auto &blockIsPrepared() {
94  return block_is_prepared_;
95  }
96 
97  std::shared_ptr<BlockStorage> blockStore() const {
98  return block_store_;
99  }
100 
101  std::shared_ptr<shared_model::interface::PermissionToString> permConverter()
102  const {
103  return perm_converter_;
104  }
105 
107  return log_;
108  }
109 
110  std::shared_ptr<PendingTransactionStorage> pendingTxStorage() const {
111  return pending_txs_storage_;
112  }
113 
115  return temporary_block_storage_factory_;
116  }
117 
118  std::shared_ptr<shared_model::interface::QueryResponseFactory>
120  return query_response_factory_;
121  }
122 
123  std::optional<std::reference_wrapper<const VmCaller>> vmCaller() const {
124  return vm_caller_ref_;
125  }
126 
127  boost::optional<std::shared_ptr<const iroha::LedgerState>> ledgerState()
128  const {
129  return ledger_state_;
130  }
131 
133  boost::optional<std::shared_ptr<const iroha::LedgerState>> const
134  &value) {
135  ledger_state_ = value;
136  }
137 
139  std::shared_ptr<const shared_model::interface::Block> block) override;
140 
141  expected::Result<void, std::string> dropBlockStorage() override;
142 
143  boost::optional<std::shared_ptr<const iroha::LedgerState>> getLedgerState()
144  const override;
145 
146  CommitResult commit(
147  std::unique_ptr<MutableStorage> mutable_storage) override;
148 
149  void prepareBlockImpl(std::unique_ptr<TemporaryWsv> wsv,
150  DatabaseTransaction &db_context);
151 
155  StoreBlockResult storeBlock(
156  std::shared_ptr<const shared_model::interface::Block> block);
157 
158  StorageBase(
159  boost::optional<std::shared_ptr<const iroha::LedgerState>> ledger_state,
160  std::shared_ptr<BlockStorage> block_store,
161  std::shared_ptr<shared_model::interface::PermissionToString>
162  perm_converter,
163  std::shared_ptr<PendingTransactionStorage> pending_txs_storage,
164  std::shared_ptr<shared_model::interface::QueryResponseFactory>
165  query_response_factory,
166  std::unique_ptr<BlockStorageFactory> temporary_block_storage_factory,
167  std::optional<std::reference_wrapper<const VmCaller>> vm_caller_ref,
168  logger::LoggerManagerTreePtr log_manager,
169  std::string const &prepared_block_name,
170  std::function<void(
171  std::shared_ptr<shared_model::interface::Block const>)> callback,
172  bool prepared_blocks_enabled);
173 
174  ~StorageBase();
175  };
176 
177 } // namespace iroha::ametsuchi
178 
179 #endif // IROHA_STORAGE_BASE_HPP
auto & temporaryBlockStorageFactory()
Definition: storage_base.hpp:114
Definition: block_query.hpp:17
auto & blockIsPrepared()
Definition: storage_base.hpp:93
Definition: result_fwd.hpp:27
std::shared_ptr< shared_model::interface::PermissionToString > permConverter() const
Definition: storage_base.hpp:101
std::shared_ptr< Logger > LoggerPtr
Definition: logger_fwd.hpp:22
logger::LoggerManagerTreePtr logManager() const
Definition: storage_base.hpp:89
Definition: storage.hpp:37
boost::optional< std::shared_ptr< BlockQuery > > createBlockQuery() const override
Definition: storage_base.hpp:80
std::shared_ptr< PendingTransactionStorage > pendingTxStorage() const
Definition: storage_base.hpp:110
Definition: wsv_command.hpp:51
Definition: block_query.hpp:15
void ledgerState(boost::optional< std::shared_ptr< const iroha::LedgerState >> const &value)
Definition: storage_base.hpp:132
Definition: command_executor.hpp:14
Definition: wsv_query.hpp:23
std::shared_ptr< LoggerManagerTree > LoggerManagerTreePtr
Definition: logger_manager_fwd.hpp:14
std::shared_ptr< BlockStorage > blockStore() const
Definition: storage_base.hpp:97
Definition: db_transaction.hpp:13
std::shared_ptr< shared_model::interface::QueryResponseFactory > queryResponseFactory() const
Definition: storage_base.hpp:119
logger::LoggerPtr log() const
Definition: storage_base.hpp:106
boost::optional< std::shared_ptr< const iroha::LedgerState > > ledgerState() const
Definition: storage_base.hpp:127
Definition: storage_base.hpp:40
std::optional< std::reference_wrapper< const VmCaller > > vmCaller() const
Definition: storage_base.hpp:123