1010namespace fc ::mining {
1111
1212 EventsImpl::EventsImpl (std::shared_ptr<TipsetCache> tipset_cache)
13- : global_id_( 0 ), tipset_cache_(std::move(tipset_cache)) {}
13+ : tipset_cache_(std::move(tipset_cache)) {}
1414
1515 outcome::result<std::shared_ptr<EventsImpl>> EventsImpl::createEvents (
1616 const std::shared_ptr<FullNodeApi> &api,
@@ -46,10 +46,19 @@ namespace fc::mining {
4646 RevertHandler revert_handler,
4747 EpochDuration confidence,
4848 ChainEpoch height) {
49+ std::shared_ptr<HeightHandle> height_handler =
50+ std::make_shared<HeightHandle>();
51+ height_handler->confidence = confidence;
52+ height_handler->called = false ;
53+ height_handler->handler = handler;
54+ height_handler->revert = revert_handler;
55+
56+ ChainEpoch trigger_at = height + confidence;
57+
4958 std::unique_lock<std::mutex> lock (mutex_);
5059 OUTCOME_TRY (best_tipset, tipset_cache_->best ());
5160
52- ChainEpoch best_height = best_tipset. height ();
61+ ChainEpoch best_height = best_tipset-> height ();
5362
5463 if (best_height >= height + confidence) {
5564 OUTCOME_TRY (tipset, tipset_cache_->getNonNull (height));
@@ -61,27 +70,15 @@ namespace fc::mining {
6170 lock.lock ();
6271 OUTCOME_TRYA (best_tipset, tipset_cache_->best ());
6372
64- best_height = best_tipset. height ();
73+ best_height = best_tipset-> height ();
6574
66- if (best_height >= height + confidence + kGlobalChainConfidence ) {
75+ if (best_height >= trigger_at + kGlobalChainConfidence ) {
6776 return outcome::success ();
6877 }
6978 }
7079
71- ChainEpoch trigger_at = height + confidence;
72-
73- // TODO: maybe overflow
74- uint64_t id = global_id_++;
75-
76- height_triggers_[id] = HeightHandle{
77- .confidence = confidence,
78- .called = false ,
79- .handler = handler,
80- .revert = revert_handler,
81- };
82-
83- message_height_to_trigger_[height].insert (id);
84- height_to_trigger_[trigger_at].insert (id);
80+ tipsets_heights_[height].insert (height_handler);
81+ triggers_heights_[trigger_at].insert (height_handler);
8582
8683 return outcome::success ();
8784 }
@@ -90,29 +87,28 @@ namespace fc::mining {
9087 if (change.type == HeadChangeType::APPLY) {
9188 std::unique_lock<std::mutex> lock (mutex_);
9289
93- auto maybe_error = tipset_cache_->add (* change.value );
90+ auto maybe_error = tipset_cache_->add (change.value );
9491 if (maybe_error.has_error ()) {
9592 logger_->error (" Adding tipset into cache failed: {}" ,
9693 maybe_error.error ().message ());
9794 return false ;
9895 }
9996
10097 auto apply = [&](ChainEpoch height) -> outcome::result<void > {
101- for (const auto tid : height_to_trigger_[height]) {
102- auto &handler{height_triggers_.at (tid)};
103- if (handler.called ) {
98+ for (auto &handler : triggers_heights_[height]) {
99+ if (handler->called ) {
104100 return outcome::success ();
105101 }
106102
107- auto trigger_height = height - handler. confidence ;
103+ auto trigger_height = height - handler-> confidence ;
108104
109105 OUTCOME_TRY (income_tipset, tipset_cache_->getNonNull (trigger_height));
110106
111- auto &handle{handler. handler };
107+ auto &handle{handler-> handler };
112108 lock.unlock ();
113109 auto maybe_error = handle (income_tipset, height);
114110 lock.lock ();
115- height_triggers_[tid]. called = true ;
111+ handler-> called = true ;
116112 if (maybe_error.has_error ()) {
117113 logger_->error (" Height handler is failed: {}" ,
118114 maybe_error.error ().message ());
@@ -163,24 +159,28 @@ namespace fc::mining {
163159 // TODO (ortyomka):[FIL-371] log error if h below gcconfidence
164160 // revert height-based triggers
165161
166- auto revert = [&](ChainEpoch height, const Tipset &tipset) {
167- for (const auto tid : message_height_to_trigger_[height]) {
168- auto &revert_handle{height_triggers_[tid].revert };
169- lock.unlock ();
170- auto maybe_error = revert_handle (tipset);
171- lock.lock ();
172- height_triggers_[tid].called = false ;
162+ auto revert = [&](ChainEpoch height, const TipsetCPtr &tipset) {
163+ for (auto &handler : tipsets_heights_[height]) {
164+ if (not handler->called ) {
165+ continue ;
166+ }
173167
174- if (maybe_error.has_error ()) {
175- logger_->error (" Revert handler is failed: {}" ,
176- maybe_error.error ().message ());
168+ auto &revert_handle{handler->revert };
169+ lock.unlock ();
170+ auto maybe_error = revert_handle (tipset);
171+ lock.lock ();
172+ handler->called = false ;
173+
174+ if (maybe_error.has_error ()) {
175+ logger_->error (" Revert handler is failed: {}" ,
176+ maybe_error.error ().message ());
177+ }
177178 }
178- }
179179 };
180180
181181 auto tipset = change.value ;
182182
183- revert (tipset->height (), * tipset);
183+ revert (tipset->height (), tipset);
184184
185185 ChainEpoch sub_height = tipset->height () - 1 ;
186186 while (true ) {
@@ -196,11 +196,11 @@ namespace fc::mining {
196196 break ;
197197 }
198198
199- revert (sub_height, * tipset);
199+ revert (sub_height, tipset);
200200 sub_height--;
201201 }
202202
203- auto maybe_error = tipset_cache_->revert (* tipset);
203+ auto maybe_error = tipset_cache_->revert (tipset);
204204 if (maybe_error.has_error ()) {
205205 logger_->error (" Reverting tipset failed: {}" ,
206206 maybe_error.error ().message ());
0 commit comments