「参照カウント不一致」は未解決だった

解決したと思っていた「参照カウント不一致」がまだ収まっていない.⇒どうも昨日の修正でバグを作り込んでしまったようだ.2022-12-29のバックアップでは再現手順による障害は発生しない.どうしたらよいか?⇒2022-12-29では,NODULE::slottypeの判定に従来の論理が使われている.まず,これを適用してみよう.⇒ダメだ.UndoCopyで参照元ノードリスト不記載が出てしまう.⇒2022-12-29-1の版ではすでに不良が発生している.どうしたらよいだろう?昨日の修正はかなり大規模なものだが,もう一度やり直しするしかない.⇒やってみよう.

NODULE::slottypeを修正版と差し替えたが問題なく動作している.「選択カードリストのカウント不一致」では停止しない,「並び替えではリンクテーブルは操作しない@20221228」でエラーを無視する修正を入れた他は,2022-12-29版のままだ.いや,確かに昨日のログでも,『これで一応「参照カウント不一致」エラーは発生しないようになった』とあり,一応落着していることが確認されている.ここでバックアップしておくのが賢明だろう.複数のパターンでテストしているので,再現手順を記録しておこう.

  1. 起動→ 基準ノードの@23を削除→ Undo で「被参照カウント不一致」
  2. 基準ソート→Undo→Redo→Undo
  3. カード一括削除→ 基準ソート→Undo→ Undo→ Redo→ Redo→ Undoで「被参照カウント不一致」
  4. 2回以上全削除を繰り返し,それらをすべてUndoした状態でそれに交叉する領域を一括削除する⇒SetUndoListで (object->UndoNumber && object->UndoNumber > UndoNumber)というエラーが起きる
  5. 基準ソート→ Undo→ 一括削除→ 基準ソート→Undo→ Undo⇒ClearTable→ ResetParentPageでSetOyapageのエラー

上記リストの1, 2のテストはパスしたが,3でエラーが起きた.TopologicalSort→ ClearTable→ ResetParentPage→ SetOyapageで(cardbase.oyanums[oya->getoyanum(j)] != oya->margbase.refnum)というエラーになった.⇒テスト3を単独実行しただけでは再現しない.テスト2→ テスト3で再現できる.つまり,基準ソート→ Undo→ 一括削除→ 基準ソート→Undo→ Undoで再現する.⇒これもリストに追加しておこう.テスト5のエラーは,UndoProcess内では発生していないので,ここでは一旦無視して先に進むことにする.

▲上記テスト5でUndoボタン押下→Undo処理から戻って,VBでGetNewTableを実行してKAKEIZU::makerecordの中で,「夫妻参照番号不整合」というのが発生した.この結婚の夫参照番号5845は,引数で与えられた参照番号395と一致しない.⇒リンクベースのOTTOには正しい値が入っているのだが,静的情報のottoが間違っている.makerecordはKAKEIZUクラスの関数なので,静的情報を返すという仕様になっているのだろう… 外部にはリンクは渡せないので,インタフェースはすべて静的情報に基づくものになるというのは間違いではないとは思われるが,静的情報とリンクデータをどこで同期させているのかが問題だ.

検査ルーチンを作っておく必要がある⇒CARDLINK:CheckCardDataLinkというテストルーチンがある.⇒このエラーはCheckCardDataLinkで検出できる.LINKTABLE:CheckDataLinkという包括テストルーチンがある.COUPLING:InitLinkTableではこのテストを通している.InitLinkTableはOpenFamilyBaseから呼び出される.

LINKTABLE::CheckDataLinkはMARGLINKとCARDLINKの検査を行っているが,CheckMargDataLinkではMakeCouplingの呼び出しで,副作用のある検査になっている.この関数の是非に付いては別途調べる必要があるが,一旦止めておこう.⇒引数で判別できるようにした.

▲ClearTableの出口に仕掛けたCheckDataLink→ CheckMargLinkで,夫と妻がどちらも空という結婚リンクが検出された.もし,検査ルーチンが誤動作しているのでなければ,これはかなり問題だ.どうもこのような結婚リンクが複数あるように思われる.

手順を間違えたのだろうか?今度は別のエラーが出た.ClearTable->ResetParentPage->setParentPageで(hubo->getrefnum() != cardbase.carddata.oyanum)というエラーになった.

CheckMargLinkの中でもMakeCouplingという実関数が呼び出されている.引数でパスできるようにしておこう.⇒LINKTABLE:CheckDataLinkの中から呼び出されているkodomosuという関数ではMarriageOrderingが実行されているが,この関数ではDeleteMarriageが実行されることがある.⇒どうも,CheckDataLinkにはまだ実動作が含まれているようだ.ClearTableの冒頭でCheckDataLinkを実行すると,「無効な結婚リンク」が47件も発生してしまう.

 

コメントを残す

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

CAPTCHA