summaryrefslogtreecommitdiffstats
path: root/config-proxy
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2019-01-14 14:00:37 +0100
committerHarald Musum <musum@oath.com>2019-01-14 14:00:37 +0100
commita32fdcffe9dee280bb4f3d1535e5d24b0d65d82a (patch)
tree596f63b8642229b606ca583fc4d097e25806c597 /config-proxy
parentb0587989a0f6b5a07b09fe4b03036fdd0231b2cf (diff)
Add guard to avoid sending config with older generation than current to subscribers
Diffstat (limited to 'config-proxy')
-rw-r--r--config-proxy/src/main/java/com/yahoo/vespa/config/proxy/ClientUpdater.java12
-rw-r--r--config-proxy/src/test/java/com/yahoo/vespa/config/proxy/ClientUpdaterTest.java22
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);
+ }
+
}