昔、kernel watch で真のO_SYNCサポートについての記事(※下記参照)を書いたことがあるんだけど、RHELではちょっと事情が違うことがわかった。
※ http://www.atmarkit.co.jp/flinux/rensai/watch2009/watch12b.html
時系列でいうと、まずkernel 2.6.33でO_SYNCサポートが入り(上記記事)、glibc 2.12 でそれに対応するためのヘッダファイル修正が入ったんだけど、RHEL6は kernel 2.6.32 + glibc 2.12 なんだな。
だからRHEL6でコンパイルしたアプリをRHEL6で実行するケース
→ O_SYNCはの実体は (__O_SYNC|O_DSYNC) なんだけど、カーネルのほうに、_O_SYNCの定義がないので、その部分は無視されて、O_DSYNCとして動作
RHEL6でコンパイルしたアプリをRHEL7で実行するケース
→ カーネルに_O_SYNCの実体があるので、O_SYNCが正しくO_SYNCとして動く
つまり、OSをバージョンアップするとアプリの挙動が変わってしまう。コミュニティ開発者がとんでもなく苦労して後方互換性を維持してもディストリのうっかりで台無しになることもあるよという例でした。
まあ、O_SYNCを使ってるのに、O_DSYNCセマンティクスを仮定してるアプリがいたら、そいつがアホという意見には同意する。同意するが、後方互換性とはそういうものじゃないんだよ。バグ互換も含めて考えるのが互換性。
※ http://www.atmarkit.co.jp/flinux/rensai/watch2009/watch12b.html
時系列でいうと、まずkernel 2.6.33でO_SYNCサポートが入り(上記記事)、glibc 2.12 でそれに対応するためのヘッダファイル修正が入ったんだけど、RHEL6は kernel 2.6.32 + glibc 2.12 なんだな。
だからRHEL6でコンパイルしたアプリをRHEL6で実行するケース
→ O_SYNCはの実体は (__O_SYNC|O_DSYNC) なんだけど、カーネルのほうに、_O_SYNCの定義がないので、その部分は無視されて、O_DSYNCとして動作
RHEL6でコンパイルしたアプリをRHEL7で実行するケース
→ カーネルに_O_SYNCの実体があるので、O_SYNCが正しくO_SYNCとして動く
つまり、OSをバージョンアップするとアプリの挙動が変わってしまう。コミュニティ開発者がとんでもなく苦労して後方互換性を維持してもディストリのうっかりで台無しになることもあるよという例でした。
まあ、O_SYNCを使ってるのに、O_DSYNCセマンティクスを仮定してるアプリがいたら、そいつがアホという意見には同意する。同意するが、後方互換性とはそういうものじゃないんだよ。バグ互換も含めて考えるのが互換性。
- 関連記事
-
- sosreportで OpenStackのログ (2015/07/20)
- RHELのO_SYNCって面白い事になってるんだなあという話 (2014/10/21)
- RHEL7でスクリーンセーバー無効化 (2014/09/03)