summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2021-09-13 14:33:15 +0200
committerHarald Musum <musum@yahooinc.com>2021-09-13 14:33:15 +0200
commita6af329731265671c3e1609bd2e59df04723d73a (patch)
tree70336b616d4048a99376613d39544d2cac95820a /config
parente5154033584d4caddbab673713f74e48f07b4388 (diff)
Remove md5 sum of config from initial state in config subscription
Java applications will now request config with only xxhash64 of config, C++ applications will request config with md5 of config and config proxy will use what is in the request from the clients.
Diffstat (limited to 'config')
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java3
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/PayloadChecksum.java8
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/PayloadChecksums.java4
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/JRTClientConfigRequestV3.java23
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/SlimeRequestData.java10
-rw-r--r--config/src/test/java/com/yahoo/vespa/config/protocol/JRTConfigRequestV3Test.java4
6 files changed, 42 insertions, 10 deletions
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java
index b1939ac23c6..6a81c2279d1 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java
@@ -19,6 +19,8 @@ import java.io.File;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger;
+import static com.yahoo.vespa.config.PayloadChecksum.Type.MD5;
+
/**
* Represents one active subscription to one config
*
@@ -103,6 +105,7 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
this.configClass = key.getConfigClass();
this.subscriber = subscriber;
this.config.set(new ConfigState<>());
+ getConfigState().getChecksums().removeChecksumsOfType(MD5); // TODO: Temporary until we don't use md5 anymore
}
/**
diff --git a/config/src/main/java/com/yahoo/vespa/config/PayloadChecksum.java b/config/src/main/java/com/yahoo/vespa/config/PayloadChecksum.java
index a16e28ac6b6..177fb57116c 100644
--- a/config/src/main/java/com/yahoo/vespa/config/PayloadChecksum.java
+++ b/config/src/main/java/com/yahoo/vespa/config/PayloadChecksum.java
@@ -50,7 +50,13 @@ public class PayloadChecksum {
return new PayloadChecksum(ConfigUtils.getXxhash64(data), XXHASH64);
}
- public boolean isEmpty() { return checksum.isEmpty(); }
+ public boolean isEmpty() {
+ switch (type) {
+ case MD5: return this.equals(empty(MD5));
+ case XXHASH64: return this.equals(empty(XXHASH64));
+ default: throw new IllegalArgumentException("Unknown type " + type);
+ }
+ }
public String asString() { return checksum; }
diff --git a/config/src/main/java/com/yahoo/vespa/config/PayloadChecksums.java b/config/src/main/java/com/yahoo/vespa/config/PayloadChecksums.java
index 1558771bd58..d30e5b055bc 100644
--- a/config/src/main/java/com/yahoo/vespa/config/PayloadChecksums.java
+++ b/config/src/main/java/com/yahoo/vespa/config/PayloadChecksums.java
@@ -52,6 +52,8 @@ public class PayloadChecksums {
return this;
}
+ public void removeChecksumsOfType(PayloadChecksum.Type type) { checksums.remove(type); }
+
public PayloadChecksum getForType(PayloadChecksum.Type type) {
return checksums.get(type);
}
@@ -60,6 +62,8 @@ public class PayloadChecksums {
return checksums.values().stream().allMatch(PayloadChecksum::valid);
}
+ public boolean isEmpty() { return this.equals(empty()); }
+
@Override
public String toString() {
return checksums.values().stream()
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/JRTClientConfigRequestV3.java b/config/src/main/java/com/yahoo/vespa/config/protocol/JRTClientConfigRequestV3.java
index a6271b159ef..1a0c794e320 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/JRTClientConfigRequestV3.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/JRTClientConfigRequestV3.java
@@ -4,7 +4,6 @@ package com.yahoo.vespa.config.protocol;
import com.yahoo.config.ConfigInstance;
import com.yahoo.config.subscription.impl.ConfigSubscription;
import com.yahoo.config.subscription.impl.JRTConfigSubscription;
-import com.yahoo.vespa.config.PayloadChecksums;
import com.yahoo.jrt.Request;
import com.yahoo.jrt.StringValue;
import com.yahoo.slime.JsonFormat;
@@ -13,14 +12,20 @@ import com.yahoo.text.Utf8;
import com.yahoo.text.Utf8Array;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.JRTMethods;
+import com.yahoo.vespa.config.PayloadChecksum;
+import com.yahoo.vespa.config.PayloadChecksums;
import com.yahoo.vespa.config.RawConfig;
import com.yahoo.vespa.config.util.ConfigUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Optional;
+import java.util.logging.Level;
import java.util.logging.Logger;
+import static com.yahoo.vespa.config.PayloadChecksum.Type.MD5;
+import static com.yahoo.vespa.config.PayloadChecksum.Type.XXHASH64;
+
/**
* Represents version 3 config request for config clients. Provides methods for inspecting request and response
* values.
@@ -252,8 +257,20 @@ public class JRTClientConfigRequestV3 implements JRTClientConfigRequest {
@Override
public boolean hasUpdatedConfig() {
- String respMd5 = getNewConfigMd5();
- return !respMd5.equals("") && !getRequestConfigMd5().equals(respMd5);
+ PayloadChecksums requestConfigChecksums = getRequestConfigChecksums();
+ log.log(Level.FINE, () -> "request checksums for " + getConfigKey() + ":" + requestConfigChecksums);
+
+ PayloadChecksums newChecksums = getNewChecksums();
+ log.log(Level.FINE, () -> "new checksums for " + getConfigKey() + ": " + newChecksums);
+ if (newChecksums.isEmpty()) return false;
+
+ PayloadChecksum respMd5 = newChecksums.getForType(MD5);
+ boolean updated = respMd5 != null && ! requestConfigChecksums.getForType(MD5).equals(respMd5);
+
+ if (!updated) return false;
+
+ PayloadChecksum respXxhash64 = newChecksums.getForType(XXHASH64);
+ return respXxhash64 != null && ! requestConfigChecksums.getForType(XXHASH64).equals(respXxhash64);
}
@Override
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeRequestData.java b/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeRequestData.java
index 679298bac73..2b69ae4ebeb 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeRequestData.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeRequestData.java
@@ -1,14 +1,14 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.protocol;
-import com.yahoo.vespa.config.PayloadChecksum;
-import com.yahoo.vespa.config.PayloadChecksums;
import com.yahoo.jrt.Request;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.config.ConfigKey;
+import com.yahoo.vespa.config.PayloadChecksum;
+import com.yahoo.vespa.config.PayloadChecksums;
import com.yahoo.vespa.config.util.ConfigUtils;
import java.util.Optional;
@@ -119,8 +119,10 @@ class SlimeRequestData {
request.setString(REQUEST_CLIENT_CONFIGID, key.getConfigId());
request.setString(REQUEST_CLIENT_HOSTNAME, hostname);
defSchema.serialize(request.setArray(REQUEST_DEF_CONTENT));
- request.setString(REQUEST_CONFIG_MD5, payloadChecksums.getForType(MD5).asString());
- request.setString(REQUEST_CONFIG_XXHASH64, payloadChecksums.getForType(XXHASH64).asString());
+ if (payloadChecksums.getForType(XXHASH64) != null)
+ request.setString(REQUEST_CONFIG_XXHASH64, payloadChecksums.getForType(XXHASH64).asString());
+ if (payloadChecksums.getForType(MD5) != null)
+ request.setString(REQUEST_CONFIG_MD5, payloadChecksums.getForType(MD5).asString());
request.setLong(REQUEST_CURRENT_GENERATION, generation);
request.setLong(REQUEST_TIMEOUT, timeout);
request.setString(REQUEST_COMPRESSION_TYPE, compressionType.name());
diff --git a/config/src/test/java/com/yahoo/vespa/config/protocol/JRTConfigRequestV3Test.java b/config/src/test/java/com/yahoo/vespa/config/protocol/JRTConfigRequestV3Test.java
index 0a4fc3da6cb..b1ed3a089ae 100644
--- a/config/src/test/java/com/yahoo/vespa/config/protocol/JRTConfigRequestV3Test.java
+++ b/config/src/test/java/com/yahoo/vespa/config/protocol/JRTConfigRequestV3Test.java
@@ -8,7 +8,6 @@ import com.yahoo.config.subscription.impl.GenericConfigSubscriber;
import com.yahoo.config.subscription.impl.JRTConfigRequester;
import com.yahoo.config.subscription.impl.JRTConfigSubscription;
import com.yahoo.config.subscription.impl.MockConnection;
-import com.yahoo.vespa.config.PayloadChecksums;
import com.yahoo.foo.SimpletypesConfig;
import com.yahoo.jrt.Request;
import com.yahoo.slime.Inspector;
@@ -18,6 +17,7 @@ import com.yahoo.test.ManualClock;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.ConfigPayload;
import com.yahoo.vespa.config.ErrorCode;
+import com.yahoo.vespa.config.PayloadChecksums;
import com.yahoo.vespa.config.RawConfig;
import com.yahoo.vespa.config.TimingValues;
import com.yahoo.vespa.config.util.ConfigUtils;
@@ -237,7 +237,7 @@ public class JRTConfigRequestV3Test {
assertTrue(serverReq.validateParameters());
assertValidationFail(createReq("35#$#!$@#", defNamespace, hostname, configId, payloadChecksums, currentGeneration, timeout, trace));
assertValidationFail(createReq(defName, "abcd.o#$*(!&$", hostname, configId, payloadChecksums, currentGeneration, timeout, trace));
- assertValidationFail(createReq(defName, defNamespace, hostname, configId, PayloadChecksums.from("opnq", "1234"), currentGeneration, timeout, trace));
+ assertValidationFail(createReq(defName, defNamespace, hostname, configId, PayloadChecksums.from("1234", "opnq"), currentGeneration, timeout, trace));
assertValidationFail(createReq(defName, defNamespace, hostname, configId, payloadChecksums, -34, timeout, trace));
assertValidationFail(createReq(defName, defNamespace, hostname, configId, payloadChecksums, currentGeneration, -23, trace));
assertValidationFail(createReq(defName, defNamespace, "", configId, payloadChecksums, currentGeneration, timeout, trace));