Skip to content

Commit 71f318e

Browse files
authored
LifecycleInitializer recovers from init failures (#549)
Signed-off-by: Daniel Garnier-Moiroux <[email protected]>
1 parent e419c50 commit 71f318e

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

mcp/src/main/java/io/modelcontextprotocol/client/LifecycleInitializer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ public <T> Mono<T> withIntitialization(String actionName, Function<Initializatio
289289
return initializationJob.map(initializeResult -> this.initializationRef.get())
290290
.timeout(this.initializationTimeout)
291291
.onErrorResume(ex -> {
292+
this.initializationRef.compareAndSet(newInit, null);
292293
return Mono.error(new RuntimeException("Client failed to initialize " + actionName, ex));
293294
})
294295
.flatMap(operation);

mcp/src/test/java/io/modelcontextprotocol/client/LifecycleInitializerTests.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,26 @@ void shouldHandleConcurrentInitializationRequests() {
230230
@Test
231231
void shouldHandleInitializationFailure() {
232232
when(mockClientSession.sendRequest(eq(McpSchema.METHOD_INITIALIZE), any(), any()))
233-
.thenReturn(Mono.error(new RuntimeException("Connection failed")));
233+
// fail once
234+
.thenReturn(Mono.error(new RuntimeException("Connection failed")))
235+
// succeeds on the second call
236+
.thenReturn(Mono.just(MOCK_INIT_RESULT));
234237

235238
StepVerifier.create(initializer.withIntitialization("test", init -> Mono.just(init.initializeResult())))
236239
.expectError(RuntimeException.class)
237240
.verify();
238241

239242
assertThat(initializer.isInitialized()).isFalse();
240243
assertThat(initializer.currentInitializationResult()).isNull();
244+
245+
// The initializer can recover from previous errors
246+
StepVerifier
247+
.create(initializer.withIntitialization("successful init", init -> Mono.just(init.initializeResult())))
248+
.expectNext(MOCK_INIT_RESULT)
249+
.verifyComplete();
250+
251+
assertThat(initializer.isInitialized()).isTrue();
252+
assertThat(initializer.currentInitializationResult()).isEqualTo(MOCK_INIT_RESULT);
241253
}
242254

243255
@Test

0 commit comments

Comments
 (0)