ノート
[BUG] 8371092: NullPointerException in AltServiceUsageTest.afterClass() test
テスト後にチャンネルを閉じる時に発生するぬるぽに対処しました。
概要#
net 系の AltServiceUsageTest では,テスト・クラスの初期化時に DatagramChannel udpNotResponding をフィールドとして保持しています1。
この DatagramChannel はテスト終了後(つまり,テスト・クラスの破棄時)に閉じられます2。
正常系ではオリジンおよび代替サーバの準備 → チャンネルの作成 → テスト・テスト・テスト → チャンネルの破棄 となり,特段問題ありません。
ところで,85 行目3では「オリジン・サーバと代替サーバ」のアドレスを比較して,これが同一であればチャンネルを準備しない(=初期化しない)という挙動を取ります。
この場合にテストが行われると,チャンネルが依然として初期化されないため,チャンネルの破棄時に NullPointerException が発生する恐れがあります4。
2026/11/02 JBS で発見#
本バグを JBS で発見し,ローカルで検証を行いました。その結果,危惧されたバグが再現されたため,修正に取り掛かりました。
以下は,修正対象のメソッドです5。
@AfterClass
public void afterClass() throws Exception {
safeStop(originServer);
safeStop(altServer);
udpNotResponding.close();
}
この部分に問題があるため,ここに null チェックを差し挟む処理を入れます。
udpNotResponding.close(); は他の箇所でも呼び出されるため,共通のヘルパ・メソッドを作成して,それを呼び出す形としました。
統合可能としてマークしました。
private static void safeStop(final HttpTestServer server) {
if (server == null) {
return;
}
final InetSocketAddress serverAddr = server.getAddress();
try {
System.out.println("Stopping server " + serverAddr);
server.stop();
} catch (Exception e) {
System.err.println("Ignoring exception: " + e.getMessage() + " that occurred " +
"during stop of server: " + serverAddr);
}
}
これを導入し,呼び出し部分も置換することで,修正としました6。
2025/11/03 レビュー#
Daniel Fuchs7氏にレビューをいただき,Approve されました。 また,あわせて以下のコメントをいただきました。
Please make sure to run the test locally before integrating. Networking tests are not run by github actions.
2025/11/04 統合リクエスト#
先のレビューを確認したのち,ローカルでテストを行ったところ,パスしたことを確認しました。 統合可能としてマークしました。
2025/11/05 統合#
Fuchs7 氏に /sponser をしていただき,2f455ed8 として JDK へ統合されました。
Footnotes#
-
jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkJDK main-line development https://openjdk.org/projects/jdk - jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkGitHub
↩
-
jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkJDK main-line development https://openjdk.org/projects/jdk - jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkGitHub
↩
-
jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkJDK main-line development https://openjdk.org/projects/jdk - jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkGitHub
↩
-
jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkJDK main-line development https://openjdk.org/projects/jdk - jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkGitHub
↩
-
jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkJDK main-line development https://openjdk.org/projects/jdk - jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkGitHub
↩
-
jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkJDK main-line development https://openjdk.org/projects/jdk - jdk/test/jdk/java/net/httpclient/AltServiceUsageTest.java at 48d21b50faed61eaa4f1d115531a21d0c29a5dff · openjdk/jdkGitHub
↩
-
https://openjdk.org/census#dfuchsopenjdk.org↩ ↩2
-
8371092: NullPointerException in AltServiceUsageTest.afterClass() test · openjdk/jdk@2f455edJDK main-line development https://openjdk.org/projects/jdk - 8371092: NullPointerException in AltServiceUsageTest.afterClass() test · openjdk/jdk@2f455edGitHub
↩