Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix the way to quit recursion when max_size is specified in scan() #45

Merged
merged 2 commits into from
Nov 24, 2024

Conversation

ban-nobuhiro
Copy link
Contributor

scan で max_size を指定した場合の処理の抜け方に問題があり、border node の子供で 上限に達して抜けてきても、再帰を打ち切らずに 次の再帰を開始してしまっていました。
このため スキャン結果 tuple_list の max_size 要素以降に、ツリー構造に依存したとびとびのエントリの値が追加されていく現象が起きていました。

これを正しく打ち切るように修正します。

案件: project-tsurugi/tsurugi-issues#999

@kuron99
Copy link
Contributor

kuron99 commented Nov 22, 2024

このコードでmax_sizeが直るのは間違いないのですが、scan_borderがOK_SCAN_ENDを戻す他のケースはどうでしょうか?
細かく追えてないので一部想像ですが、名前から判断するとOK_SCAN_ENDが戻るケースはscan処理をそこまでで打ち切るという事が期待されていて、

if (check_status == status::OK_SCAN_END) { return status::OK; }
でscan_borderの戻り値をOK_SCAN_END -> OKに読み替えているところが問題なのではないかという気がします。
ここではscan関数はそのままOK_SCAN_ENDを戻し、呼び出し側の
check_status =
でOK_SCAN_ENDかどうかをチェックして打ち切りか継続かを判断すべきなのではないかなと。番さんの変更ではここで再度tuple_listのsizeのチェックだけをしてmax_sizeだけに対応した形と思いますが、可能であれば他のOK_SCAN_ENDも救った方がよいのではないかと思いました。

OK_SCAN_END -> OKの読み替えはinterface_scan.hでもやっていてこちらは正しいのですが、このコードをscan_helperにもコピーしてそのままになっているといったことかなと想像しています。

if (check_status == status::OK_SCAN_END) { return status::OK; }

もちろん上記の潜在的な問題も分かったうえでさしあたりmax_sizeにのみ対応した、という修正であればOKです。

@ban-nobuhiro
Copy link
Contributor Author

いまいち OK_SCAN_END の使い方/使われ方 に自信がないのと、
一応 max_size とは別のことなので 、必要に応じて別途直せばいいかな、という態度です。
(OK_SCAN_END のハンドルの仕方を変える修正を加えると、親側でsizeを確認する必要がなくなり、今回加えた変更がまったく不要になるので、ここで少し気合を入れてもう一歩踏み込んだほうがいいのかもしれませんが)

自信がない点は
mastree 論文の用語でいう tree (Figure1. の破線四角) 間のリンクについて、同じ layer の隣の tree の border node 間に next/prev で接続されるようには見えないので、 tree の border を右端まで scan したら親に戻りますが、その際 OK_SCAN_END で戻ります。ですが、 scan は継続するはずです。
なので、 scan_border から戻ってくるときに OK_SCAN_END だからといって必ずしも打ち切るわけではないように見える。これは正しいだろうか。
またそうだとして OK_SCAN_CONTINUE は next がない時には使えない。ならば別の OK_XXX を作るのか、・・・
というあたりです。

@kuron99
Copy link
Contributor

kuron99 commented Nov 23, 2024

確かにnextがない(treeのborder nodeをtraverseし終えた)段階では上のlayterに戻ってスキャン継続のはずですね。ナイーブにはOK_SCAN_ENDでなくOKを戻すようにしてスキャン継続するという動きが望ましいように思いますが、
再起呼び出しが絡むところなのでscanのvisitor(カーソル)の状態遷移をよく洗った方がよさそうです。ひとまずmax_scanの問題だけ直すならこれでいいと思います。

@ban-nobuhiro ban-nobuhiro merged commit 844d987 into master Nov 24, 2024
6 checks passed
@ban-nobuhiro
Copy link
Contributor Author

レビューありがとうございました。マージしました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants