diff options
12 files changed, 76 insertions, 33 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java index 2a0d62a1c9a..5831cb3e75f 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/TenantApplications.java @@ -57,7 +57,7 @@ import static java.util.stream.Collectors.toSet; * @author Ulf Lilleengen * @author jonmv */ -public class TenantApplications implements RequestHandler, HostValidator<ApplicationId> { +public class TenantApplications implements RequestHandler, HostValidator { private static final Logger log = Logger.getLogger(TenantApplications.class.getName()); @@ -402,10 +402,6 @@ public class TenantApplications implements RequestHandler, HostValidator<Applica configActivationListener.verifyHostsAreAvailable(applicationId, newHosts); } - public HostValidator<ApplicationId> getHostValidator() { - return this; - } - public ApplicationId getApplicationIdForHostName(String hostname) { return hostRegistry.getKeyForHost(hostname); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java index 5c161a5f746..b89f3bba835 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostRegistry.java @@ -1,27 +1,25 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.host; +import com.google.common.collect.Collections2; +import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.TenantName; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import com.google.common.collect.Collections2; -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.TenantName; - -import java.util.logging.Level; - /** * A host registry with a mapping between hosts (hostname as a String) and some type T * TODO: Maybe we should have a Host type, but using String for now. * * @author Ulf Lilleengen */ -public class HostRegistry implements HostValidator<ApplicationId> { +public class HostRegistry implements HostValidator { private static final Logger log = Logger.getLogger(HostRegistry.class.getName()); @@ -43,10 +41,10 @@ public class HostRegistry implements HostValidator<ApplicationId> { } @Override - public synchronized void verifyHosts(ApplicationId key, Collection<String> newHosts) { + public synchronized void verifyHosts(ApplicationId applicationId, Collection<String> newHosts) { for (String host : newHosts) { - if (hostAlreadyTaken(host, key)) { - throw new IllegalArgumentException("'" + key + "' tried to allocate host '" + host + + if (hostAlreadyTaken(host, applicationId)) { + throw new IllegalArgumentException("'" + applicationId + "' tried to allocate host '" + host + "', but the host is already taken by '" + host2KeyMap.get(host) + "'"); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostValidator.java b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostValidator.java index 0d3cbb3860b..115d135b0c1 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostValidator.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/host/HostValidator.java @@ -1,16 +1,16 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.host; +import com.yahoo.config.provision.ApplicationId; import java.util.Collection; /** - * A read only host registry that has mappings from a host to some type T. - * strings. + * A read only host registry that has mappings from a host to application id * * @author Ulf Lilleengen */ -public interface HostValidator<T> { +public interface HostValidator { - void verifyHosts(T key, Collection<String> newHosts); + void verifyHosts(ApplicationId applicationId, Collection<String> newHosts); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java index 18f33224d83..1bfa94a1355 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java @@ -45,7 +45,6 @@ import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Collectors; /** * @author bratseth @@ -59,7 +58,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P private final List<ContainerEndpoint> containerEndpoints; private final Optional<EndpointCertificateSecrets> endpointCertificateSecrets; private final ConfigDefinitionRepo configDefinitionRepo; - private final HostValidator<ApplicationId> hostValidator; + private final HostValidator hostValidator; private final PrepareParams params; private final FileRegistry fileRegistry; private final Optional<ApplicationSet> currentActiveApplicationSet; @@ -76,7 +75,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P ExecutorService executor, HostProvisionerProvider hostProvisionerProvider, Curator curator, - HostValidator<ApplicationId> hostValidator, + HostValidator hostValidator, DeployLogger deployLogger, PrepareParams params, Optional<ApplicationSet> currentActiveApplicationSet, @@ -171,7 +170,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P } } - private void validateModelHosts(HostValidator<ApplicationId> hostValidator, ApplicationId applicationId, Model model) { + private void validateModelHosts(HostValidator hostValidator, ApplicationId applicationId, Model model) { // Will retry here, since hosts used might not be in sync on all config servers (we wait for 2/3 servers // to respond to deployments and deletions). Instant end = Instant.now().plus(Duration.ofSeconds(1)); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java index 17a019067a3..ffafbb8827e 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java @@ -126,7 +126,7 @@ public class SessionPreparer { * @param activeApplicationSet set of currently active applications. * @return the config change actions that must be done to handle the activation of the models prepared. */ - public PrepareResult prepare(HostValidator<ApplicationId> hostValidator, DeployLogger logger, PrepareParams params, + public PrepareResult prepare(HostValidator hostValidator, DeployLogger logger, PrepareParams params, Optional<ApplicationSet> activeApplicationSet, Instant now, File serverDbSessionDir, ApplicationPackage applicationPackage, SessionZooKeeperClient sessionZooKeeperClient) { ApplicationId applicationId = params.getApplicationId(); @@ -181,7 +181,7 @@ public class SessionPreparer { private final PreparedModelsBuilder preparedModelsBuilder; private final FileRegistry fileRegistry; - Preparation(HostValidator<ApplicationId> hostValidator, DeployLogger logger, PrepareParams params, + Preparation(HostValidator hostValidator, DeployLogger logger, PrepareParams params, Optional<ApplicationSet> currentActiveApplicationSet, Path tenantPath, File serverDbSessionDir, ApplicationPackage applicationPackage, SessionZooKeeperClient sessionZooKeeperClient) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java index 306b24a3c69..a0597b77539 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java @@ -13,7 +13,6 @@ import com.yahoo.config.model.api.ConfigDefinitionRepo; import com.yahoo.config.model.application.provider.DeployData; import com.yahoo.config.model.application.provider.FilesApplicationPackage; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.Tags; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.secretstore.SecretStore; @@ -243,7 +242,7 @@ public class SessionRepository { ? Optional.empty() : Optional.of(sessionZooKeeperClient.createPrepareWaiter()); Optional<ApplicationSet> activeApplicationSet = getActiveApplicationSet(params.getApplicationId()); - ConfigChangeActions actions = sessionPreparer.prepare(applicationRepo.getHostValidator(), logger, params, + ConfigChangeActions actions = sessionPreparer.prepare(applicationRepo, logger, params, activeApplicationSet, now, getSessionAppDir(sessionId), session.getApplicationPackage(), sessionZooKeeperClient) .getConfigChangeActions(); diff --git a/document/src/vespa/document/select/parse_utils.cpp b/document/src/vespa/document/select/parse_utils.cpp index 2e85f81f089..95461442349 100644 --- a/document/src/vespa/document/select/parse_utils.cpp +++ b/document/src/vespa/document/select/parse_utils.cpp @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "parse_utils.h" +#include <vespa/vespalib/locale/c.h> #include <charconv> #include <limits> @@ -23,6 +24,17 @@ parse_i64(const char* str, size_t len, int64_t& out) { } bool parse_double(const char* str, size_t len, double& out) { +#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 160000 + // Temporary workaround that also handles underflow (cf. issue 3081) + // until libc++ supports std::from_chars for double + char *str_end = const_cast<char*>(str) + len; + double out0 = vespalib::locale::c::strtod_au(str, &str_end); + if (str_end != str + len) { + return false; + } + out = out0; + return true; +#else auto res = std::from_chars(str, str+len, out); if (res.ec == std::errc::result_out_of_range) { out = (str[0] == '-') @@ -31,6 +43,7 @@ parse_double(const char* str, size_t len, double& out) { return true; } return (res.ec == std::errc()) && (res.ptr == str+len); +#endif } } diff --git a/eval/src/vespa/eval/instruction/sparse_112_dot_product.cpp b/eval/src/vespa/eval/instruction/sparse_112_dot_product.cpp index 080f51e384a..b17c2db8b22 100644 --- a/eval/src/vespa/eval/instruction/sparse_112_dot_product.cpp +++ b/eval/src/vespa/eval/instruction/sparse_112_dot_product.cpp @@ -16,17 +16,17 @@ using namespace instruction; namespace { template <typename T, size_t N> -ConstArrayRef<T> as_car(std::array<T, N> &array) { +ConstArrayRef<T> as_car(std::array<T, N> &array) noexcept { return {array.data(), array.size()}; } template <typename T, size_t N> -ConstArrayRef<const T *> as_ccar(std::array<T *, N> &array) { +ConstArrayRef<const T *> as_ccar(std::array<T *, N> &array) noexcept { return {array.data(), array.size()}; } template <typename T> -ConstArrayRef<T> as_car(T &value) { +ConstArrayRef<T> as_car(T &value) noexcept { return {&value, 1}; } @@ -63,6 +63,9 @@ double my_sparse_112_dot_product_fallback(const Value::Index &a_idx, const Value template <typename CT> double my_fast_sparse_112_dot_product(const FastAddrMap *a_map, const FastAddrMap *b_map, const FastAddrMap *c_map, + const CT *a_cells, const CT *b_cells, const CT *c_cells) __attribute__((noinline)); +template <typename CT> +double my_fast_sparse_112_dot_product(const FastAddrMap *a_map, const FastAddrMap *b_map, const FastAddrMap *c_map, const CT *a_cells, const CT *b_cells, const CT *c_cells) { double result = 0.0; diff --git a/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java b/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java index 9877dd69e83..e8aae24ca9e 100644 --- a/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java +++ b/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java @@ -232,13 +232,16 @@ public class RankProfilesConfigImporter { protected Tensor readTensorFromFile(String name, TensorType type, FileReference fileReference) { try { File file = fileAcquirer.waitFor(fileReference, 7, TimeUnit.DAYS); - if (file.getName().endsWith(".tbf")) + if (file.getName().endsWith(".tbf")) { return TypedBinaryFormat.decode(Optional.of(type), GrowableByteBuffer.wrap(IOUtils.readFileBytes(file))); - else + } else if (file.getName().endsWith(".json")) { + return com.yahoo.tensor.serialization.JsonFormat.decode(type, IOUtils.readFileBytes(file)); + } else { throw new IllegalArgumentException("Constant files on other formats than .tbf are not supported, got " + file + " for constant " + name); - // TODO: Support json and json.lz4 + } + // TODO: Support json.lz4 } catch (InterruptedException e) { throw new IllegalStateException("Gave up waiting for constant " + name); diff --git a/storage/src/vespa/storageframework/generic/clock/time.cpp b/storage/src/vespa/storageframework/generic/clock/time.cpp index a27caa44d40..7c5573b7436 100644 --- a/storage/src/vespa/storageframework/generic/clock/time.cpp +++ b/storage/src/vespa/storageframework/generic/clock/time.cpp @@ -2,6 +2,7 @@ #include "time.h" #include <vespa/vespalib/stllike/asciistream.h> +#include <ostream> namespace storage::framework { diff --git a/vespalib/src/vespa/vespalib/util/time.cpp b/vespalib/src/vespa/vespalib/util/time.cpp index 51d5e580609..42155647870 100644 --- a/vespalib/src/vespa/vespalib/util/time.cpp +++ b/vespalib/src/vespa/vespalib/util/time.cpp @@ -92,3 +92,21 @@ Timer::waitAtLeast(duration dur, bool busyWait) { } } + +#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 160000 + +// Temporary workaround until libc++ supports stream operators for duration + +#include <ostream> + +namespace std::chrono { + +ostream& +operator<<(ostream& os, const nanoseconds& value) +{ + os << value.count() << "ns"; + return os; +} + +} +#endif diff --git a/vespalib/src/vespa/vespalib/util/time.h b/vespalib/src/vespa/vespalib/util/time.h index ce914b097d4..27f359071ae 100644 --- a/vespalib/src/vespa/vespalib/util/time.h +++ b/vespalib/src/vespa/vespalib/util/time.h @@ -99,3 +99,16 @@ duration adjustTimeoutByDetectedHz(duration timeout); duration adjustTimeoutByHz(duration timeout, long hz); } + +#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 160000 + +// Temporary workaround until libc++ supports stream operators for duration + +#include <iosfwd> + +namespace std::chrono { + +ostream& operator<<(ostream& os, const nanoseconds& value); + +} +#endif |