Skip to content

Commit 6cc440a

Browse files
authored
Fix NPE in InstrumentedHandler#doStop (Jetty 9, 10, 11) (#3379)
Fixes #3325
1 parent 8cd308b commit 6cc440a

File tree

6 files changed

+45
-9
lines changed

6 files changed

+45
-9
lines changed

metrics-jetty10/src/main/java/io/dropwizard/metrics/jetty10/InstrumentedHandler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,12 @@ protected void doStop() throws Exception {
273273
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_1M));
274274
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_5M));
275275
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_15M));
276-
responseCodeMeters.keySet().stream()
277-
.map(sc -> name(getMetricPrefix(), String.format("%d-responses", sc)))
278-
.forEach(m -> metricRegistry.remove(m));
276+
277+
if (responseCodeMeters != null) {
278+
responseCodeMeters.keySet().stream()
279+
.map(sc -> name(getMetricPrefix(), String.format("%d-responses", sc)))
280+
.forEach(metricRegistry::remove);
281+
}
279282
super.doStop();
280283
}
281284

metrics-jetty10/src/test/java/io/dropwizard/metrics/jetty10/InstrumentedHandlerTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import static com.codahale.metrics.annotation.ResponseMeteredLevel.ALL;
2626
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatCode;
2728

2829
public class InstrumentedHandlerTest {
2930
private final HttpClient client = new HttpClient();
@@ -111,6 +112,14 @@ public void responseTimesAreRecordedForBlockingResponses() throws Exception {
111112
assertResponseTimesValid();
112113
}
113114

115+
@Test
116+
public void doStopDoesNotThrowNPE() throws Exception {
117+
InstrumentedHandler handler = new InstrumentedHandler(registry, null, ALL);
118+
handler.setHandler(new TestHandler());
119+
120+
assertThatCode(handler::doStop).doesNotThrowAnyException();
121+
}
122+
114123
@Test
115124
@Ignore("flaky on virtual machines")
116125
public void responseTimesAreRecordedForAsyncResponses() throws Exception {

metrics-jetty11/src/main/java/io/dropwizard/metrics/jetty11/InstrumentedHandler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,12 @@ protected void doStop() throws Exception {
273273
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_1M));
274274
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_5M));
275275
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_15M));
276-
responseCodeMeters.keySet().stream()
277-
.map(sc -> name(getMetricPrefix(), String.format("%d-responses", sc)))
278-
.forEach(m -> metricRegistry.remove(m));
276+
277+
if (responseCodeMeters != null) {
278+
responseCodeMeters.keySet().stream()
279+
.map(sc -> name(getMetricPrefix(), String.format("%d-responses", sc)))
280+
.forEach(metricRegistry::remove);
281+
}
279282
super.doStop();
280283
}
281284

metrics-jetty11/src/test/java/io/dropwizard/metrics/jetty11/InstrumentedHandlerTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import static com.codahale.metrics.annotation.ResponseMeteredLevel.ALL;
2626
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatCode;
2728

2829
public class InstrumentedHandlerTest {
2930
private final HttpClient client = new HttpClient();
@@ -111,6 +112,14 @@ public void responseTimesAreRecordedForBlockingResponses() throws Exception {
111112
assertResponseTimesValid();
112113
}
113114

115+
@Test
116+
public void doStopDoesNotThrowNPE() throws Exception {
117+
InstrumentedHandler handler = new InstrumentedHandler(registry, null, ALL);
118+
handler.setHandler(new TestHandler());
119+
120+
assertThatCode(handler::doStop).doesNotThrowAnyException();
121+
}
122+
114123
@Test
115124
@Ignore("flaky on virtual machines")
116125
public void responseTimesAreRecordedForAsyncResponses() throws Exception {

metrics-jetty9/src/main/java/com/codahale/metrics/jetty9/InstrumentedHandler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,12 @@ protected void doStop() throws Exception {
281281
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_1M));
282282
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_5M));
283283
metricRegistry.remove(name(prefix, NAME_PERCENT_5XX_15M));
284-
responseCodeMeters.keySet().stream()
285-
.map(sc -> name(getMetricPrefix(), String.format("%d-responses", sc)))
286-
.forEach(m -> metricRegistry.remove(m));
284+
285+
if (responseCodeMeters != null) {
286+
responseCodeMeters.keySet().stream()
287+
.map(sc -> name(getMetricPrefix(), String.format("%d-responses", sc)))
288+
.forEach(metricRegistry::remove);
289+
}
287290
super.doStop();
288291
}
289292

metrics-jetty9/src/test/java/com/codahale/metrics/jetty9/InstrumentedHandlerTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import static com.codahale.metrics.annotation.ResponseMeteredLevel.ALL;
2626
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatCode;
2728

2829
public class InstrumentedHandlerTest {
2930
private final HttpClient client = new HttpClient();
@@ -111,6 +112,14 @@ public void responseTimesAreRecordedForBlockingResponses() throws Exception {
111112
assertResponseTimesValid();
112113
}
113114

115+
@Test
116+
public void doStopDoesNotThrowNPE() throws Exception {
117+
InstrumentedHandler handler = new InstrumentedHandler(registry, null, ALL);
118+
handler.setHandler(new TestHandler());
119+
120+
assertThatCode(handler::doStop).doesNotThrowAnyException();
121+
}
122+
114123
@Test
115124
@Ignore("flaky on virtual machines")
116125
public void responseTimesAreRecordedForAsyncResponses() throws Exception {

0 commit comments

Comments
 (0)