Slide 1

Slide 1 text

Go 1.27 リリースパーティ Go 1.27からのGODEBUG @mazrean

Slide 2

Slide 2 text

マズリーン mazrean ■ Goでツール等を作っている ● DIツール Kessoku ■ Proposalまとめサイト開発 ■ SRE @DeNA @mazrean22 2

Slide 3

Slide 3 text

GODEBUG知っている✋

Slide 4

Slide 4 text

1.27でGODEBUGフラグが いくつか消えるのに気が付いた✋

Slide 5

Slide 5 text

目次 1 GODEBUGとは 2 GODEBUG削除ポリシー策定 3 これからの注意点 4 まとめ 5

Slide 6

Slide 6 text

Go 1の後方互換性 ソースコードレベルの後方互換性を保障[1] ■ 新バージョンでもコンパイル が通る ■ 正しく実行できる ■ 例外はある ● ● セキュリティ上の問題・コンパイラバグ 過去にも複数回発生 [1]: https://go.dev/doc/go1compat 6

Slide 7

Slide 7 text

Q. バージョン更新で絶対に壊れないか?

Slide 8

Slide 8 text

Q. バージョン更新で絶対に壊れないか? A. 壊れるときは壊れる

Slide 9

Slide 9 text

Kubernetesの事例 毎年1つ程度、Go起因の破壊的変更 が発生[2] ■ 1.17: net.ParseIPで先頭0付きアドレス拒否 ● ● ● 一部の設定が拒否されるようになった 最終的に1.17以前のコピー実装を使用して対応 例) 0127.0000.0000.0001 が拒否されるように ■ 1.15: SANsなし証明書CN fallback削除 ● リリースノートでユーザーへ警告して対応 [2]: https://github.com/golang/go/discussions/55090 9

Slide 10

Slide 10 text

GODEBUGによる後方互換性拡張 1.21 以降、GODEBUGで挙動を戻せる ように[3] ■ フラグを設定して切り替え ● ● 環境変数・//go:debug コメント・go.modで設定 例) GODEBUG=http2client=0 ■ 一度入れたフラグは、最低2年維持 ● 永続含む、2年以上維持する場合もあり [3]: https://go.dev/blog/compat 10

Slide 11

Slide 11 text

目次 1 GODEBUGとは 2 GODEBUG削除ポリシー策定 3 これからの注意点 4 まとめ 11

Slide 12

Slide 12 text

増えていくGODEBUGフラグ 1.26時点、フラグは53個にまで増加 ■ Go Teamのメンテナンス負担 が大きい ● テストで網羅しきれない ■ 削除数より追加数の方が多い ● 削除自体はされているが少ない 12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

GODEBUGフラグ削除手順 永続 or 削除予定 を導入時点で決める ■ 削除予定なら削除予定リリース も設定 ■ 1リリース前 に削除予定を必ず宣言 新規フラグ 既存フラグ Go issue trackerに記録 permanent slated for removal Proposal accept 必須 removed 14

Slide 15

Slide 15 text

GODEBUGフラグ削除手順 永続 or 削除予定 を導入時点で決める ■ 削除予定なら削除予定リリース も設定 ■ 1リリース前 に削除予定を必ず宣言 新規フラグ 既存フラグ Go issue trackerに記録 permanent slated for removal Proposal accept 必須 removed 15

Slide 16

Slide 16 text

GODEBUGフラグ削除手順 永続 or 削除予定 を導入時点で決める ■ 削除予定なら削除予定リリース も設定 ■ 1リリース前 に削除予定を必ず宣言 新規フラグ 既存フラグ Go issue trackerに記録 permanent slated for removal Proposal accept 必須 removed 16

Slide 17

Slide 17 text

削除済みGODEBUGフラグの挙動 最終的なデフォルト値以外 の有効値は拒否 ■ コンパイルエラー ・起動時panicする ● ただし、実行中のos.Setenvでの動的設定は例外 ■ 最終的なデフォルト値なら正常に動作 例) gotypesalias バージョン デフォルト値 1.22(導入) gotypesalias=0 1.23 gotypesalias=1 1.27 フラグ削除 gotypesalias=0で コンパイルエラー・panic! 17

Slide 18

Slide 18 text

削除済みフラグの扱い internal/godebugs/table.go に記述 古い値を判定する関数が設定 18

Slide 19

Slide 19 text

削除予定GODEBUGフラグのwarn 削除予定フラグはgo vetで報告する ■ go.mod・コメント設定 のみが対象 ● 環境変数 で設定しているものは気づけない ■ まだ削除予定フラグがないため未実装 19

Slide 20

Slide 20 text

目次 1 GODEBUGとは 2 GODEBUG削除ポリシー策定 3 これからの注意点 4 まとめ 20

Slide 21

Slide 21 text

1.27時点で考えるべきこと 削除フラグを使用箇所がないことを確認 ■ 環境変数で使っていると起動時panic ■ 1.27で削除されるのは以下 ● ● ● ● ● ● ● gotypesalias tlsunsafeekm tlsrsakex tls3des tls10server x509keypairleaf asynctimerchan 21

Slide 22

Slide 22 text

将来的に考えるべきこと GODEBUGフラグは短期かつ最小限で使う ■ 使用しているGODEBUGフラグ把握 ■ 非permanentフラグからの脱却 ● 4バージョン後、削除可能性あり ■ 使わないで良いのがベスト(個人的見解) ● 使うならリリースノートは注視する 22

Slide 23

Slide 23 text

目次 1 GODEBUGとは 2 GODEBUG削除ポリシー策定 3 これからの注意点 4 まとめ 23

Slide 24

Slide 24 text

まとめ ■ 後方互換性 のためGODEBUGフラグがある ■ GODEBUGフラグの削除ルール が決まった ● ● 永続のもの以外は導入時に削除予定リリースが設定 1リリース前までに削除予定であることが宣言 ■ 削除されると最終デフォルト値以外拒否 ● コンパイルエラー ・起動時panic ■ 1.27で7個のフラグが削除される ● 特に環境変数 で設定している場合は注意 24