From 9875ac8427e400807172d4dd94cff8c1bd696047 Mon Sep 17 00:00:00 2001 From: Sanjay Pujare Date: Mon, 13 Jun 2022 15:13:01 -0700 Subject: [PATCH] xds: when delegate server throws on start communicate the error to statusListener also add a unit test to test server restart on LdsUpdate --- .../java/io/grpc/xds/XdsServerWrapper.java | 2 + .../io/grpc/xds/XdsServerWrapperTest.java | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java index 366f01e2daa..1690e6459a7 100644 --- a/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java +++ b/xds/src/main/java/io/grpc/xds/XdsServerWrapper.java @@ -329,6 +329,8 @@ private void startDelegateServer() { if (!initialStarted) { initialStarted = true; initialStartFuture.set(e); + } else { + listener.onNotServing(e); } restartTimer = syncContext.schedule( new RestartTask(), RETRY_DELAY_NANOS, TimeUnit.NANOSECONDS, timeService); diff --git a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java index a546a95459a..7a9b42d4b21 100644 --- a/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsServerWrapperTest.java @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -457,6 +458,47 @@ public void run() { verify(mockServer).start(); } + @Test + public void discoverState_restart_afterResourceNotExist() throws Exception { + final SettableFuture start = SettableFuture.create(); + Executors.newSingleThreadExecutor().execute(new Runnable() { + @Override + public void run() { + try { + start.set(xdsServerWrapper.start()); + } catch (Exception ex) { + start.setException(ex); + } + } + }); + String ldsResource = xdsClient.ldsResource.get(5, TimeUnit.SECONDS); + assertThat(ldsResource).isEqualTo("grpc/server?udpa.resource.listening_address=0.0.0.0:1"); + VirtualHost virtualHost = + VirtualHost.create( + "virtual-host", Collections.singletonList("auth"), new ArrayList(), + ImmutableMap.of()); + HttpConnectionManager httpConnectionManager = HttpConnectionManager.forVirtualHosts( + 0L, Collections.singletonList(virtualHost), new ArrayList()); + EnvoyServerProtoData.FilterChain filterChain = EnvoyServerProtoData.FilterChain.create( + "filter-chain-foo", createMatch(), httpConnectionManager, createTls(), + mock(TlsContextManager.class)); + xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain), null); + start.get(5000, TimeUnit.MILLISECONDS); + verify(listener).onServing(); + verify(mockServer).start(); + + // server shutdown after resourceDoesNotExist + xdsClient.ldsWatcher.onResourceDoesNotExist(ldsResource); + verify(mockServer).shutdown(); + + // re-deliver lds resource + reset(mockServer); + reset(listener); + xdsClient.deliverLdsUpdate(Collections.singletonList(filterChain), null); + verify(listener).onServing(); + verify(mockServer).start(); + } + @Test public void discoverState_rds() throws Exception { final SettableFuture start = SettableFuture.create(); @@ -778,6 +820,7 @@ public void run() { xdsClient.ldsWatcher.onResourceDoesNotExist(ldsResource); verify(mockServer, times(3)).shutdown(); verify(listener, times(4)).onNotServing(any(StatusException.class)); + verify(listener, times(1)).onNotServing(any(IOException.class)); when(mockServer.isShutdown()).thenReturn(true); assertThat(executor.numPendingTasks()).isEqualTo(0); assertThat(sslSupplier2.isShutdown()).isTrue();