CHAOTICSTATEまではノーマル処理する

軟体動物3.zelを開き,①マキガイとニマイガイを合体,②カタツムリとイカとタコを合体させて,RetrieveGhostのエラー「すでに廃棄中のノード対」が発生する.もう少し簡単な手順があるかもしれないが,少なくともこの方法で確実に再現できる.障害はCOUPLING:TopologicalSort冒頭のEraseTreeViewで起きている.フェーズはCHAOTICSTATEに入っているので,エラーを無視してもよいのかもしれないが,どういうフローになっているのか調べておこう.

UNDOありでゴミ箱なしというエディションだ.カタツムリとタコのカード合併でこれらが保持するノード対がClearPairBoxでパージされる.その後,系統並び替え→EraseTreeViewですべての描画要素が削除され,NAMEBOX #357 カタツムリ(0)が削除されている.このとき,PAIRBOX #406:#376 カタツムリ(1)→#357(0)がRetrieveGhostの対象となる.PAIRBOX #406はClearPairBoxですでにRetrieveGhostで処理されている.RetrieveGhostではこのノード対にdisableのマークを付けた後,(PHASE<=CLEARTABLE)という理由でゼロ復帰している.

RetrieveGhostはかなり複雑で大きな処理なので不用な摩擦を避けるために離脱することにしているものと思われるが,削除しようとしているノード対を放置したまま復帰というのは明らかにまずい.ゼルコバの木では基本的に「混沌とした状態」というのを認めないというのが方針であり,目標でもあるので,できる限りのことは実行すべきであると思う.フェーズはINITIALIZED=CHAOTICSTATEにあるので,この段階では処理を省略できないとしてみよう.また,仮に離脱する場合でも少なくともPAIRBOXを破棄してから離脱すべきだろう.最初にPAIRBOXを破棄してから離脱するようにしてみよう.⇒これでエラーは解消した.

CHAOTICSTATEまではノーマル処理するとしてみよう.ここまでできると「完全にクリーンなシステム」までは後一歩というところに達する.RetrieveGhostというのはこの種の処理としては最大で,それがこなせるとなればほとんどの場合はクリアできると考えられるからだ.⇒問題なく動作した.CHAOTICSTATE=INITIALIZEDの前には,INITIALIZING→ INITIALSTATE→ GROUNDZEROしかない.

これらのフェーズはアプリ起動時と終了時にしか通過しない完全な「初期状態」ないし「初期化中フェーズ」と考えられるので,システム的な整合性が崩れるのはある程度までは避けられない.ゴミ箱を復活させてUNDOシステムとの整合性をチェックしておこう.⇒問題なさそうだ.かなりよい動きになってきたので,リリース版を作り直しておくことにする.⇒源氏物語全系譜6.1.ZELが完了した.実行環境は開発機,デバッグモード,エディションはZT BASIC.

image

ZT BASICで渋沢一族を開いてみた.描画までに8.1秒掛かっている.多重カードが2件ある.①#224 穂積万亀子と②#691 井上光貞だ.穂積万亀子は穂積八束+浅野総一郎の娘浅野松の子で,栄一の子星野 辰雄の妻だ.万亀子の2つのカードはとんでもなく離れている上,世代差もあるので,多重になるのも仕方ないという感じはするが,「重婚クラスタ循環」は発生していないので,不可避の多重という訳ではない.

井上光貞は桂太郎の孫で,井上三郎+千代子の子であり,北白川宮能久親王の孫の二荒明子の配偶者だ.井上光貞のカード2枚は比較的近接しているので消去できそうにも見えるのだが… リリース版(ZT ADVANCED)ではどちらも解決して,多重ゼロになっている.これが,ZT BASICとZT ADVANCEDの力の差と見てよいのではないだろうか?井上光貞の場合はこんな↓感じだ.

image

穂積万亀子の場合は左に伸びる親子連結線が限りなく長いので追い切れないが,連結線を選択できるようになればそれも改善されるだろう.

image

従って,ZT BASICに求められるのは,これ以上の機能向上ではなく,障害で停止しないような安全な運用が可能であることにあると言ってよいと思う.渋沢一族の完全木テストを試してみよう.⇒早速障害が出た.ただし,これは開発機ではなく,リリース版の障害だ.

image

渋沢一族8.zelをただ開いただけでは発生しない.デスクトップ上に反例サンプルが複数できている.これらを開くとエラーが起きる.

BUG21-03-01 21-37-57.ZELを開いて,結婚参照番号不整合というエラーが起きる.また,CARDLINK::CheckCardLinkでvsprintf_sのエラーも起きている.このエラーは「父母ページ数の調整」をダンプしようとして起きている.⇒最終的には描画まで進んだが,中身はごく一部を除いて完全にバラバラになってしまっている.反例サンプルは全部で9つある.これらがどのタイミングで生成されたのか分からないが,その手順が分からないとバグを追跡できない.リリース版と同じ構成でビルドし直すところから始めるしかない.

新規ファイルの状態から,渋沢一族8.zelを開こうとして,nodule:Connectでエラーが起きる.TRASHCAN::ReuseWasteでオブジェクトを再利用するために,nodl_floatしようとしているところだ.Connect関数は付け替えをするときに,そのスロットの先住者を上書きする動作になっているためエラーが起きている.昨日の修正でnodule:nodl_floatを書き直しているが,ミスっていた.

接続元がIsAliveのときはスロットを開けるようにしているが,そうでない場合には放置している.これは「死亡しているノードは仮想関数SLOTが使えない@20210111」という理由だが,ゴミ箱に入っているノードはDELETED == DEADになっているため処理されないことになる.DEFINETRASHCANの場合にはつねにスロットを空けるようにした.

渋沢一族は完全に連結だと思っていたが,GetHasseDiagramのダンプで見ると,5つの系統に分離している.①渋沢 栄一@1,②岡部 長景@191,③吉阪 俊蔵@770,④正田 建次郎@624,⑤末松 謙澄@793だ.本当にそうなっているのかどうか確認する必要がある.

渋沢一族をリリース版で開いたときの状況は多重カードの位置を確認することが目的だったので,基本的には系統並び替えその他のデータ操作は一切行っていないつもりなのだが,実際には障害が発生しているのだから,何かしらのデータ操作を行っていたと考えるしかない.何をやるとこのようなことが起こるのか?ともかく少し動かしてみよう.⇒いや,障害が発生していたのはリリース版ではなく開発機のZT BASICではなかったのか?リリース版では多重が発生していないから,ほとんど操作らしい操作をやった記憶がない.

しかし,開発機でデバッグ中には反例サンプルは生成されないのだから,机上に反例が残っているとしたら,アプリで生成されたと考えるしかないだろう.開発機上でリリースモードでテストしていたという可能性はないだろうか?完全木テストを開始しようとした時点で問題が起き始めたのだから,完全木テストをやってみればよいのではないか?上のような派手な障害なら必ず引っかかるはずだ.

参照番号200近くまで走らせたが,エラーは発生していない.当初のエラーの原因はおそらくnodl_floatの書き換えミスだったのではないかと思う.しかも,それを開発機上でリリースモードで走らせていたのだろう.開発実機のデバッグモードで渋沢一族の1面を描画するのに約8~10秒近く掛かっている.これでは一晩掛かっても終わらないのでVAIO2に移すことにした.VAIO2ではさらに遅く倍速1面で20秒くらい掛かっているが,仕方ない.やらせておくことにしよう.

開発実機で標準版をデバッグモードで走らせて,渋沢一族を開き,完全テストに入ったところでRestoreYoungWifeで停止した.(PHASE > INITIALIZING && !tywbox->IsExtractOrTooYoung())という理由だ.完全木テストに入る前に参照番号でテーブルの並び替えを実行している.その処理が完了した後の系統並び替えでエラーが起きている.

系統並び替え冒頭のEraseTreeViewを実行しているところで,NAMEBOXのデストラクタからRetrieveGhost→ RestoreYoungWifeの呼び出しが掛かっている.フェーズはCHAOTICSTATE = INITIALIZEDでINITIALIZINGよりも大きいために停止している.上記で「CHAOTICSTATEまではノーマル処理」としたためだ.

問題のTYW枠はMARGBOX #130718:+→#37005 井上博邦(0)でこの結婚枠のTOOYOUNGWIFE属性が落ちてしまっているという点だ.⇒NAMEBOX::Dispose→ clearmarchainでMARGBOX:ReleaseMargBox→ ResetTooYoungWifeが実行されている.つまり,この結婚枠のオーナーとともに殉死しているということだろう.⇒結婚枠のオーナーが空ないし削除処理中の場合は停止しないようにした.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA