hyperledger/iroha
Iroha - A simple, decentralized ledger http://iroha.tech
on_demand_ordering_gate.hpp
Go to the documentation of this file.
1 
6 #ifndef IROHA_ON_DEMAND_ORDERING_GATE_HPP
7 #define IROHA_ON_DEMAND_ORDERING_GATE_HPP
8 
10 
11 #include <shared_mutex>
12 
13 #include <boost/variant.hpp>
14 #include <rxcpp/rx-lite.hpp>
18 #include "logger/logger_fwd.hpp"
22 
23 namespace iroha {
24  namespace ametsuchi {
25  class TxPresenceCache;
26  }
27 
28  namespace ordering {
29 
35  public:
36  struct RoundSwitch {
38  std::shared_ptr<const LedgerState> ledger_state;
39 
41  std::shared_ptr<const LedgerState> ledger_state)
42  : next_round(std::move(next_round)),
43  ledger_state(std::move(ledger_state)) {}
44  };
45 
47  std::shared_ptr<OnDemandOrderingService> ordering_service,
48  std::unique_ptr<transport::OdOsNotification> network_client,
49  rxcpp::observable<
50  std::shared_ptr<const cache::OrderingGateCache::HashesSetType>>
51  processed_tx_hashes,
52  rxcpp::observable<RoundSwitch> round_switch_events,
53  std::shared_ptr<shared_model::interface::UnsafeProposalFactory>
54  factory,
55  std::shared_ptr<ametsuchi::TxPresenceCache> tx_cache,
56  std::shared_ptr<ProposalCreationStrategy> proposal_creation_strategy,
57  size_t transaction_limit,
58  logger::LoggerPtr log);
59 
60  ~OnDemandOrderingGate() override;
61 
62  void propagateBatch(
63  std::shared_ptr<shared_model::interface::TransactionBatch> batch)
64  override;
65 
66  rxcpp::observable<network::OrderingEvent> onProposal() override;
67 
68  void stop() override;
69 
70  private:
74  boost::optional<std::shared_ptr<const shared_model::interface::Proposal>>
75  processProposalRequest(
76  boost::optional<
77  std::shared_ptr<const OnDemandOrderingService::ProposalType>>
78  proposal) const;
79 
80  void sendCachedTransactions();
81 
85  std::shared_ptr<const shared_model::interface::Proposal>
86  removeReplaysAndDuplicates(
87  std::shared_ptr<const shared_model::interface::Proposal> proposal)
88  const;
89 
90  logger::LoggerPtr log_;
91 
93  size_t transaction_limit_;
94  std::shared_ptr<OnDemandOrderingService> ordering_service_;
95  std::unique_ptr<transport::OdOsNotification> network_client_;
96  rxcpp::composite_subscription processed_tx_hashes_subscription_;
97  rxcpp::composite_subscription round_switch_subscription_;
98  std::shared_ptr<shared_model::interface::UnsafeProposalFactory>
99  proposal_factory_;
100  std::shared_ptr<ametsuchi::TxPresenceCache> tx_cache_;
101 
102  std::shared_timed_mutex stop_mutex_;
103  bool stop_requested_{false};
104 
105  rxcpp::composite_subscription proposal_notifier_lifetime_;
106  rxcpp::subjects::subject<network::OrderingEvent> proposal_notifier_;
107  };
108 
109  } // namespace ordering
110 } // namespace iroha
111 
112 #endif // IROHA_ON_DEMAND_ORDERING_GATE_HPP
Definition: ordering_gate.hpp:28
RoundSwitch(consensus::Round next_round, std::shared_ptr< const LedgerState > ledger_state)
Definition: on_demand_ordering_gate.hpp:40
Definition: peer.hpp:48
std::shared_ptr< Logger > LoggerPtr
Definition: logger_fwd.hpp:22
Definition: block_query.hpp:15
Definition: on_demand_ordering_gate.hpp:36
std::shared_ptr< const LedgerState > ledger_state
Definition: on_demand_ordering_gate.hpp:38
Definition: round.hpp:31
Definition: on_demand_ordering_gate.hpp:34
consensus::Round next_round
Definition: on_demand_ordering_gate.hpp:37