昨日朝イチで片付けた障害がぶり返している

アプリを起動して,カードを1枚削除→終了でGetCardBaseのエラー(PHASE < DRAWSTAGE)が起きるという,昨日の朝イチで片付けた障害がぶり返している.ただし,今回はUNDOシステムありでテストしているので,昨日の朝とは条件が異なる.系統並び替えが実行されていないとすれば,昨日のUNDOの改修が影響しているのだろう.⇒いや,UNDOSYSTEM::CommandEndからCOUPLING:TopologicalSortを実行している.少なくともTopologicalSortの出口ではDRAWSTAGEになっている.⇒確かにどこかでフェーズをINITIALIZEDまで落としている.

心当たりはある.おそらく,FAMILYTREE::SetUndoBaseだ.これはUNDOCOMMANDに基準ノードなどの情報を設定する関数で,これまではあちこちに分散していたのを関数化したものだ.この中でSetPhase(CHAOTICSTATE)を実行している.この関数は,①UNDOSYSTEM:CommandStart,②UNDOSYSTEM:MakeNewCommand,③UNDOSYSTEM:CommandEndから呼び出されている.最後の③は系統並び替えの完了後だから,ここではSetPhaseは実行するべきではない.多分これはCommandStartFlagで切り分けることができるだろう.

カード削除2件→UNDOでCARDLINK::DownStreamのエラー(Invalidated || !nambox || !nambox->YUpper() || !nambox->getY() || !tribe)が起きた.namboxが空.かなりまずい.起動→基準カード削除→UNDOでは別のエラーになる.TRIBELIST:MakeTribeBoxで(marglink && !marglink->GetAncestor())というエラーが起きている.最初のエラーの再現手順を確定しておこう.

ZTシステム構成図7.ZEL:全体図を#1 couplingで開いた後,①#1 couplingを削除,②#61 NLIST < LISTNODE, CID>, #87 GENEBOX, #230 GENEBOXを選択して一括削除,③UNDO という手順で再現できる.手順が簡単なので,2番目の障害から追いかけてみよう.UNDOSYSTEM::UndoRedoCommandでUndoProcessを実行後の系統並び替えを実行しているところだ.⇒いや,事例としては最初の方が易しい.namboxが空ということはUNDOで復元に失敗したというだけだが,2番目の事例では状況を解析するのがかなり厄介だ.再現手順でも,最初のカード削除は省略できる.

障害が起きているのはCARDLINK:#369 @61NLIST< LISTNODE, CID>だ.確かにnamboxが空になっている.UNDOでは通常系統並び替えが実施されるため,描画要素は保全の対象になっていない.しかし,人名リンクには必ずデフォルトで1つは人名枠が付属することになっている.これをどこかで補充しなくてはならない.UndoRedoCommandとUndoProcessはほとんど外部依存コードなので従来論理がそのまま実行されているはずなのだが…

現行ではOpenFamilyBaseの中でKAKEIZU::readFamilyBaseを実行後にInitLinkTable→CARDLINK::initializeでデフォルトのNAMEBOXを生成している.描画要素はすべて頂点のTREEVIEWに描画リストによって連結されている.INITIALIZEDの段階では描画リストは一応使える状態になっていることが予定されている.NAMEBOXはCARDLINKに接続しているので,CARDLINKが削除されたとき同時に削除されているから,復元しただけではnamboxは元の状態には戻らない.

昨日のログでは「RestoreShadow オーバーライドは不要」としているが,間違っている.この関数は元々UNDONODEが実行していたものだが,UNDOSYSTEMに移管した後,外部依存コードなしと認定されてUNDOBASEが受け持つことになったものだ.明らかにオリジナルのコードには外部依存コードが含まれている.⇒UNDOSYSTEM:RestoreShadowを復元して動作するようになった.⇒2番目の障害も解消し,完全に動作するようになった.

バックアップも取ったので,ここまでの修正をフィックスしておこう.

  1. UNDOからTITLEINFOを切り離す@20201217 8箇所
  2. UNDOを基本・拡張クラスに分解@20201217 1箇所
  3. RestoreShadowをUNDOSYSTEMに移管@20201217 6箇所
  4. TRASHCANのアプリ依存度を確認する@20201216 2箇所
  5. GetCardBaseの動作にフェーズは関わりがない@20201217

DEFINETRASHCANとDEFINEUNDOSYSTEMの2つのオプションの組み合わせ,つまりゴミ箱を使う/使わないxUNDOを使う/使わないの4つのパターンすべての動作を確認したが,問題なさそうだ.

コメントを残す

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

CAPTCHA