memo_sample_spannerにzaganeをかけてチェックをしたときの話
zaganeはCloud Spannerの使用しているプロジェクト内の下記の処理漏れを検知してくれるツール
- ReadOnlyTransactionのClose漏れ
- 検索結果のiteretorのClose漏れ
- (ReadWreteTransaction内でのWrapError検知 ※解決済)
zaganeによるチェックを行うと下記のようなReadOnlyTransactionのClose漏れの指摘が表示される
# memo_sample_spanner/infra/cloudspanner
-: transaction must be closed
-: transaction must be closed
-: transaction must be closed
-: transaction must be closed
-: transaction must be closed
理由はmemo_sample_spanner/infra/cloudspanner内に定義されている下記のメソッドにてReadOnlyTransactionの未Closeが指摘されている模様
- ReadRow
- Read
- ReadUsingIndex
- Query
- Apply
zaganeではReadOnlyTransactionの未CloseはspannerパッケージのReadOnlyTransactionの次のSSA Instructure(字句トークンの集合)でClose()が実行されていないとアラートを発生させる
上記でも述べたとおり、memo_sample_spannerではCloud SpannerへのアクセスメソッドはTransaction内外でも共通にCloud Spannerへのクエリが実行可能なつくり
仕様に則って使用している限りこちらのReadOnlyTransactionメソッド経由でしかReadOnlyTransaction使用できない。内部でdefer tx.Close()を実行しているのでCloseが漏れることはない(※仕様無視した使用法は別)
よってローカルルールではあるが指摘を受けている該当のメソッドはReadOnlyTransaction内で使用されることを前提としたメソッドのため無視しても差し支えないと判断する
本家のzaganeの仕様では下記のようなコメントを書くとunclosetx検査対象から除外することが可能である
//lint:ignore unclosetx
https://github.com/gcpug/zagane/blob/master/passes/unclosetx/unclosetx.go#L68
ただし、memo_sample_spannerのinfra/cloudspanner配下ReadOnlyTransactionを使用してる各所に上記のコメントの記載しても検査対象からうまく除外してくれない
原因は検出されるtokenのPosition情報がIsValied:falseの状態であるため
CommentMapのCommentsByPosメソッドにてコメントが取得できないためである
https://github.com/gostaticanalysis/comment/blob/master/comment.go#L32
どうしてPositionがInvalidになってしまうかは今後も継続して調査する(2020.1.17)
v0.3.4にて修正されたました。
できれば本家のほうで対応したかったが、 誤って今後わけのわからない開発をしてしまった場合に備えてmemo_sample_spanner専用のzagane同様のチェックツールを下記に用意する
https://github.com/muroon/memo_sample_spanner_analyzer
内容は、基本的にはzaganeのAnalyzerをそのまま利用していて、ReadOnlyTransactionのクローズチェックのみ、 上記のmemo_sample_spanner/infra/cloudspanner上の該当メソッドのみチェック対象から除外して対応
- analysis.Analyzerは他のanalysis.Analyzerと組み合わせて使用することができる
- memo_sample_spanner専用のAnalyzerにて該当メソッドを除外してから本家のunclosetx.Analyzer実行
- 意図した仕様とは異なるが該当メソッド以外でspannerのReadOnlyTransactionを直接読んで使用したときなどの検出に利用できる
本家の修正と書き方がイケてなかったところの修正によりこのツール自体は不要となりました(2020.1.31)
https://github.com/gcpug/zagane/releases/tag/v0.3.4
ignore commentのバグは修正しました!