diff options
author | Harald Musum <musum@yahooinc.com> | 2021-09-10 11:13:09 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2021-09-10 11:13:09 +0200 |
commit | f8347a1f41341bd87adf40416a7afa2177d01408 (patch) | |
tree | d926b94578ac11685093082b53c21d1ef6c0f439 /configserver/src/main/java | |
parent | 01513fb2bef0d0b3021ede9857604b3d8b19cf31 (diff) |
Add checksum types in response based on types in request
Return response with same type as in request, except when both are
empty, then return both types.
Note: No clients have started sending requests with only xxhash64 checksum yet.
Diffstat (limited to 'configserver/src/main/java')
6 files changed, 58 insertions, 20 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelController.java b/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelController.java index 00d010e75c8..7f39d678fdf 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelController.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelController.java @@ -44,7 +44,10 @@ public class SuperModelController { public ConfigResponse resolveConfig(GetConfigRequest request) { ConfigKey<?> configKey = request.getConfigKey(); validateConfigDefinition(request.getConfigKey(), request.getDefContent()); - return responseFactory.createResponse(model.getConfig(configKey).toUtf8Array(true), generation, false); + return responseFactory.createResponse(model.getConfig(configKey).toUtf8Array(true), + generation, + false, + request.configPayloadChecksums()); } private void validateConfigDefinition(ConfigKey<?> configKey, DefContent defContent) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java index df1427bdf6d..0b409d38196 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java @@ -130,12 +130,11 @@ public class Application implements ModelResult { metricUpdater.incrementFailedRequests(); throw new UnknownConfigDefinitionException("Unable to find config definition for '" + configKey.getNamespace() + "." + configKey.getName()); } - log.log(Level.FINE, () -> TenantRepository.logPre(getId()) + ("Resolving " + configKey + " with config definition " + def)); + log.log(Level.FINE, () -> TenantRepository.logPre(getId()) + "Resolving " + configKey + " with config definition " + def); var payload = createPayload(configKey, def); - var response = responseFactory.createResponse(payload.getFirst(), applicationGeneration, payload.getSecond()); - return response; + return responseFactory.createResponse(payload.getFirst(), applicationGeneration, payload.getSecond(), req.configPayloadChecksums()); } private Pair<AbstractUtf8Array, Boolean> createPayload(ConfigKey<?> configKey, ConfigDefinition def) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpConfigRequest.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpConfigRequest.java index c01008fafa0..8abb701606c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpConfigRequest.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpConfigRequest.java @@ -11,6 +11,7 @@ import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.jdisc.application.BindingMatch; import com.yahoo.vespa.config.ConfigKey; import com.yahoo.vespa.config.GetConfigRequest; +import com.yahoo.vespa.config.PayloadChecksums; import com.yahoo.vespa.config.protocol.DefContent; import com.yahoo.vespa.config.protocol.VespaVersion; import com.yahoo.vespa.config.server.RequestHandler; @@ -195,4 +196,7 @@ public class HttpConfigRequest implements GetConfigRequest, TenantRequest { @Override public String getRequestDefMd5() { return ConfigUtils.getDefMd5(getDefContent().asList()); } + @Override + public PayloadChecksums configPayloadChecksums() { return PayloadChecksums.empty(); } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/ConfigResponseFactory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/ConfigResponseFactory.java index 7afeebdd3cf..e52b2c4af01 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/ConfigResponseFactory.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/ConfigResponseFactory.java @@ -1,10 +1,16 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.rpc; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.text.AbstractUtf8Array; import com.yahoo.vespa.config.ConfigPayload; +import com.yahoo.vespa.config.PayloadChecksum; +import com.yahoo.vespa.config.PayloadChecksums; import com.yahoo.vespa.config.protocol.ConfigResponse; +import com.yahoo.vespa.config.util.ConfigUtils; + +import static com.yahoo.vespa.config.PayloadChecksum.Type.MD5; +import static com.yahoo.vespa.config.PayloadChecksum.Type.XXHASH64; /** * Represents a component that creates config responses from a payload. Different implementations @@ -28,12 +34,37 @@ public interface ConfigResponseFactory { /** * Creates a {@link ConfigResponse} for a given payload and generation. * - * @param rawPayload the {@link ConfigPayload} to put in the response - * @param generation the payload generation - * @param applyOnRestart true if this config change should only be applied on restart, - * false if it should be applied immediately + * @param rawPayload the {@link ConfigPayload} to put in the response + * @param generation the payload generation + * @param applyOnRestart true if this config change should only be applied on restart, + * false if it should be applied immediately + * @param requestsPayloadChecksums payload checksums from requests * @return a {@link ConfigResponse} that can be sent to the client */ - ConfigResponse createResponse(AbstractUtf8Array rawPayload, long generation, boolean applyOnRestart); + ConfigResponse createResponse(AbstractUtf8Array rawPayload, + long generation, + boolean applyOnRestart, + PayloadChecksums requestsPayloadChecksums); + + /** Generates payload checksums based on what type of checksums exist in request */ + default PayloadChecksums generatePayloadChecksums(AbstractUtf8Array rawPayload, PayloadChecksums requestsPayloadChecksums) { + PayloadChecksum requestChecksumMd5 = requestsPayloadChecksums.getForType(MD5); + PayloadChecksum requestChecksumXxhash64 = requestsPayloadChecksums.getForType(XXHASH64); + + PayloadChecksum md5 = PayloadChecksum.empty(MD5); + PayloadChecksum xxhash64 = PayloadChecksum.empty(XXHASH64); + // Response contains same checksum type as in request, except when both are empty, + // then use both checksum types in response + if (requestChecksumMd5.isEmpty() && requestChecksumXxhash64.isEmpty() + || ( ! requestChecksumMd5.isEmpty() && ! requestChecksumXxhash64.isEmpty())) { + md5 = new PayloadChecksum(ConfigUtils.getMd5(rawPayload), MD5); + xxhash64 = new PayloadChecksum(ConfigUtils.getXxhash64(rawPayload), XXHASH64); + } else if ( ! requestChecksumMd5.isEmpty()) + md5 = new PayloadChecksum(ConfigUtils.getMd5(rawPayload), MD5); + else + xxhash64 = new PayloadChecksum(ConfigUtils.getXxhash64(rawPayload), XXHASH64); + + return PayloadChecksums.from(md5, xxhash64); + } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/LZ4ConfigResponseFactory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/LZ4ConfigResponseFactory.java index 3698a50217a..6a1ecfac7bb 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/LZ4ConfigResponseFactory.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/LZ4ConfigResponseFactory.java @@ -1,15 +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.server.rpc; -import com.yahoo.vespa.config.PayloadChecksums; import com.yahoo.text.AbstractUtf8Array; import com.yahoo.text.Utf8Array; import com.yahoo.vespa.config.LZ4PayloadCompressor; +import com.yahoo.vespa.config.PayloadChecksums; import com.yahoo.vespa.config.protocol.CompressionInfo; import com.yahoo.vespa.config.protocol.CompressionType; import com.yahoo.vespa.config.protocol.ConfigResponse; import com.yahoo.vespa.config.protocol.SlimeConfigResponse; -import com.yahoo.vespa.config.util.ConfigUtils; /** * Compressor that compresses config payloads to lz4. @@ -23,10 +22,11 @@ public class LZ4ConfigResponseFactory implements ConfigResponseFactory { @Override public ConfigResponse createResponse(AbstractUtf8Array rawPayload, long generation, - boolean applyOnRestart) { + boolean applyOnRestart, + PayloadChecksums requestsPayloadChecksums) { CompressionInfo info = CompressionInfo.create(CompressionType.LZ4, rawPayload.getByteLength()); Utf8Array compressed = new Utf8Array(compressor.compress(rawPayload.wrap())); - PayloadChecksums payloadChecksums = PayloadChecksums.from(ConfigUtils.getMd5(rawPayload), ConfigUtils.getXxhash64(rawPayload)); + PayloadChecksums payloadChecksums = generatePayloadChecksums(rawPayload, requestsPayloadChecksums); return new SlimeConfigResponse(compressed, generation, applyOnRestart, payloadChecksums, info); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/UncompressedConfigResponseFactory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/UncompressedConfigResponseFactory.java index 97db683e348..ce973e538b7 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/UncompressedConfigResponseFactory.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/UncompressedConfigResponseFactory.java @@ -1,13 +1,12 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.rpc; -import com.yahoo.vespa.config.PayloadChecksums; import com.yahoo.text.AbstractUtf8Array; +import com.yahoo.vespa.config.PayloadChecksums; import com.yahoo.vespa.config.protocol.CompressionInfo; import com.yahoo.vespa.config.protocol.CompressionType; import com.yahoo.vespa.config.protocol.ConfigResponse; import com.yahoo.vespa.config.protocol.SlimeConfigResponse; -import com.yahoo.vespa.config.util.ConfigUtils; /** * Simply returns an uncompressed payload. @@ -17,11 +16,13 @@ import com.yahoo.vespa.config.util.ConfigUtils; public class UncompressedConfigResponseFactory implements ConfigResponseFactory { @Override - public ConfigResponse createResponse(AbstractUtf8Array rawPayload, long generation, boolean applyOnRestart) { - String configMd5 = ConfigUtils.getMd5(rawPayload); - String xxHash64 = ConfigUtils.getXxhash64(rawPayload); + public ConfigResponse createResponse(AbstractUtf8Array rawPayload, + long generation, + boolean applyOnRestart, + PayloadChecksums requestsPayloadChecksums) { CompressionInfo info = CompressionInfo.create(CompressionType.UNCOMPRESSED, rawPayload.getByteLength()); - return new SlimeConfigResponse(rawPayload, generation, applyOnRestart, PayloadChecksums.from(configMd5, xxHash64), info); + PayloadChecksums payloadChecksums = generatePayloadChecksums(rawPayload, requestsPayloadChecksums); + return new SlimeConfigResponse(rawPayload, generation, applyOnRestart, payloadChecksums, info); } } |