Skip to content

Commit 114d76c

Browse files
committed
Handle multiple ResultSet#close calls
Close #67
1 parent a2b48b9 commit 114d76c

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

datasource-micrometer/src/main/java/net/ttddyy/observation/tracing/DataSourceObservationListener.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,17 @@ private void handleResultSet(MethodExecutionContext executionContext) {
379379
return;
380380
}
381381

382+
String methodName = executionContext.getMethod().getName();
383+
boolean isClose = "close".equals(methodName);
384+
382385
ResultSet resultSet = (ResultSet) executionContext.getTarget();
383386
ResultSetAttributes resultSetAttributes = connectionAttributes.resultSetAttributesManager
384387
.getByResultSet(resultSet);
385-
if (resultSetAttributes == null) {
388+
389+
// "close" could be called multiple times. When this is a second close, do not
390+
// start ob.
391+
boolean createResultSetAttributes = (resultSetAttributes == null) && !isClose;
392+
if (createResultSetAttributes) {
386393
boolean isGeneratedKey = connectionAttributes.resultSetAttributesManager.isGeneratedKeys(resultSet);
387394
resultSetAttributes = createResultSetAttributesAndStartObservation(executionContext, isGeneratedKey);
388395

@@ -400,14 +407,17 @@ private void handleResultSet(MethodExecutionContext executionContext) {
400407
connectionAttributes.resultSetAttributesManager.add(resultSet, statement, resultSetAttributes);
401408
}
402409

403-
ResultSetOperation operation = new ResultSetOperation(executionContext.getMethod(),
404-
executionContext.getMethodArgs(), executionContext.getResult(), executionContext.getThrown());
405-
resultSetAttributes.context.addOperation(operation);
410+
if (resultSetAttributes != null) {
411+
ResultSetOperation operation = new ResultSetOperation(executionContext.getMethod(),
412+
executionContext.getMethodArgs(), executionContext.getResult(), executionContext.getThrown());
413+
resultSetAttributes.context.addOperation(operation);
414+
}
406415

407-
String methodName = executionContext.getMethod().getName();
408-
if ("close".equals(methodName)) {
416+
if (isClose) {
409417
connectionAttributes.resultSetAttributesManager.removeByResultSet(resultSet);
410-
stopResultSetObservation(resultSetAttributes.scope, executionContext.getThrown());
418+
if (resultSetAttributes != null) {
419+
stopResultSetObservation(resultSetAttributes.scope, executionContext.getThrown());
420+
}
411421
}
412422
else if ("next".equals(methodName)) {
413423
boolean hasNext = Boolean.TRUE.equals(executionContext.getResult());

datasource-micrometer/src/test/java/net/ttddyy/observation/tracing/DataSourceObservationListenerTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,4 +675,29 @@ void resultSetObservationWithNullResult() throws Exception {
675675
TracerAssert.assertThat(this.tracer).reportedSpans().hasSize(1);
676676
}
677677

678+
@Test
679+
void resultSetObservationWithMultipleClose() throws Exception {
680+
this.registry.observationConfig().observationHandler(new ResultSetTracingObservationHandler(this.tracer));
681+
DataSourceObservationListener listener = new DataSourceObservationListener(this.registry);
682+
683+
ResultSet resultSet = mock(ResultSet.class);
684+
685+
ConnectionInfo connectionInfo = new ConnectionInfo();
686+
connectionInfo.setConnectionId("id-1");
687+
connectionInfo.setDataSourceName("myDS");
688+
689+
Statement statement = mock(Statement.class);
690+
given(resultSet.getStatement()).willReturn(statement);
691+
692+
createResultSetObservation(listener, connectionInfo, resultSet, true);
693+
694+
// call "close"
695+
listener.afterMethod(createResultSetCloseMethodExecutionContext(connectionInfo, resultSet));
696+
697+
// call "close" again
698+
listener.afterMethod(createResultSetCloseMethodExecutionContext(connectionInfo, resultSet));
699+
700+
TracerAssert.assertThat(this.tracer).reportedSpans().hasSize(1);
701+
}
702+
678703
}

0 commit comments

Comments
 (0)