diff options
author | Harald Musum <musum@yahooinc.com> | 2021-09-13 14:33:15 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2021-09-13 14:33:15 +0200 |
commit | a6af329731265671c3e1609bd2e59df04723d73a (patch) | |
tree | 70336b616d4048a99376613d39544d2cac95820a /config | |
parent | e5154033584d4caddbab673713f74e48f07b4388 (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')
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)); |