Open umegane opened 2 weeks ago
次のように対応しました。
to_be_epoch = upper_limit;
old_epoch_id = epoch_id_informed_.load();
while (true) {
if (old_epoch_id >= to_be_epoch) {
break;
}
if (epoch_id_informed_.compare_exchange_strong(old_epoch_id, to_be_epoch)) {
std::lock_guard<std::mutex> lock(mtx_epoch_persistent_callback_);
if (to_be_epoch < epoch_id_informed_.load()) {
break;
}
if (persistent_callback_) {
persistent_callback_(to_be_epoch);
}
break;
}
}
@t-horikawa Issue-63 のこの議論から、この修正は問題ありなのでリオープンします。
persistent_callback_の呼び出しをスキップしてはいけないということなので、2.の修正はNGです。1.が許容可能であれば、 1.に戻せばよいです。1.も許容できない場合は、Queueを使うなどして順序を保証するようにしないといけません。
@t-horikawa すいません、このコードでも問題ないような気がしてきました。 よく考えるのでしばらくの間、上のメンションは無視してください。
persistent_callbackで「スキップされるEpoch IDが発生する」のがNGかどうかはshirakami動作上、問題ありなのかどうか、要確認と思います。 persistent_callbackで明らかに問題だっだのは、switch_epochによりepochがどんどん進んでいるのに、persistent_callbackが一切callされないことでした(limestone開発の極々初期にはlog_channelが使われないとそうなってしまった)。指摘されている問題だと、epoch IDがスキップされても、次のepoch IDでpersistent_callbackされるので、一切callされないという状況にはなりません。
どちらのコードでも、スキップされる可能性がありますね。スキップの是非については、shirakmiの動作上の問題なので shirakamiの仕様をか確認します。
以下の方針で対応します。
すべて終了したらこのIssueはクローズします。