diff options
-rw-r--r-- | config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ClientUpdater.java | 12 | ||||
-rw-r--r-- | config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ClientUpdaterTest.java | 22 |
2 files changed, 25 insertions, 9 deletions
diff --git a/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ClientUpdater.java b/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ClientUpdater.java index 8b8f75a3f99..f20b45cbe45 100644 --- a/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ClientUpdater.java +++ b/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ClientUpdater.java @@ -31,18 +31,12 @@ class ClientUpdater { /** * This method will be called when a response with changed config is received from upstream * (content or generation has changed) or the server timeout has elapsed. - * Updates the cache with the returned config. Will only be called when in default mode * * @param config new config */ void updateSubscribers(RawConfig config) { log.log(LogLevel.DEBUG, () -> "Config updated for " + config.getKey() + "," + config.getGeneration()); - sendResponse(config); - } - - private void sendResponse(RawConfig config) { if (config.isError()) { statistics.incErrorCount(); } - log.log(LogLevel.DEBUG, () -> "Sending response for " + config.getKey() + "," + config.getGeneration()); DelayQueue<DelayedResponse> responseDelayQueue = delayedResponses.responses(); log.log(LogLevel.SPAM, () -> "Delayed response queue: " + responseDelayQueue); if (responseDelayQueue.size() == 0) { @@ -51,11 +45,11 @@ class ClientUpdater { } else { log.log(LogLevel.DEBUG, () -> "Delayed response queue has " + responseDelayQueue.size() + " elements"); } - DelayedResponse[] responses = responseDelayQueue.toArray(new DelayedResponse[0]); boolean found = false; - for (DelayedResponse response : responses) { + for (DelayedResponse response : responseDelayQueue.toArray(new DelayedResponse[0])) { JRTServerConfigRequest request = response.getRequest(); - if (request.getConfigKey().equals(config.getKey())) { + if (request.getConfigKey().equals(config.getKey()) + && (config.getGeneration() >= request.getRequestGeneration())) { if (delayedResponses.remove(response)) { found = true; log.log(LogLevel.DEBUG, () -> "Call returnOkResponse for " + config.getKey() + "," + config.getGeneration()); diff --git a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ClientUpdaterTest.java b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ClientUpdaterTest.java index 04a2c9077c6..fdf59a45841 100644 --- a/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ClientUpdaterTest.java +++ b/config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ClientUpdaterTest.java @@ -64,4 +64,26 @@ public class ClientUpdaterTest { assertThat(statistics.errors(), is(1L)); } + @Test + public void it_does_not_send_old_config_in_response() { + assertThat(rpcServer.responses, is(0L)); + + RawConfig fooConfigOldGeneration = ProxyServerTest.fooConfig; + + final RawConfig fooConfig = ProxyServerTest.createConfigWithNextConfigGeneration(fooConfigOldGeneration, 0); + clientUpdater.updateSubscribers(fooConfig); + + // No delayed response, so not returned + assertEquals(0, rpcServer.responses); + + delayedResponses.add(new DelayedResponse(JRTServerConfigRequestV3.createFromRequest(JRTConfigRequestFactory.createFromRaw(fooConfig, -10L).getRequest()))); + clientUpdater.updateSubscribers(fooConfig); + assertEquals(1, rpcServer.responses); + + delayedResponses.add(new DelayedResponse(JRTServerConfigRequestV3.createFromRequest(JRTConfigRequestFactory.createFromRaw(fooConfig, -10L).getRequest()))); + clientUpdater.updateSubscribers(fooConfigOldGeneration); + // Old config generation, so not returned + assertEquals(1, rpcServer.responses); + } + } |