diff options
10 files changed, 63 insertions, 20 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/ZooKeeperDatabase.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/ZooKeeperDatabase.java index f1e0b6d1239..60835d5bb4f 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/ZooKeeperDatabase.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/database/ZooKeeperDatabase.java @@ -6,18 +6,26 @@ import com.yahoo.vespa.clustercontroller.core.ClusterStateBundle; import com.yahoo.vespa.clustercontroller.core.ContentCluster; import com.yahoo.vespa.clustercontroller.core.rpc.EnvelopedClusterStateBundleCodec; import com.yahoo.vespa.clustercontroller.core.rpc.SlimeClusterStateBundleCodec; -import org.apache.zookeeper.*; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.apache.zookeeper.data.ACL; import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.TreeMap; import java.util.logging.Level; import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.State; import com.yahoo.vdslib.state.Node; import java.util.logging.Logger; -import java.util.*; import java.io.IOException; import java.io.StringWriter; import java.io.PrintWriter; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java index eefe245f060..1e4a3b1e003 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java @@ -174,4 +174,9 @@ public class ClusterControllerContainer extends Container implements } } + @Override + protected String defaultPreload() { + return ""; + } + } diff --git a/eval/src/tests/instruction/generic_rename/generic_rename_test.cpp b/eval/src/tests/instruction/generic_rename/generic_rename_test.cpp index dedb22f2763..9c17dce972f 100644 --- a/eval/src/tests/instruction/generic_rename/generic_rename_test.cpp +++ b/eval/src/tests/instruction/generic_rename/generic_rename_test.cpp @@ -53,8 +53,8 @@ TEST(GenericRenameTest, dense_rename_plan_can_be_created_and_executed) { std::vector<vespalib::string> to({"f", "a", "b"}); ValueType renamed = lhs.rename(from, to); auto plan = DenseRenamePlan(lhs, renamed, from, to); - std::vector<size_t> expect_loop = {15,2,7}; - std::vector<size_t> expect_stride = {7,105,1}; + SmallVector<size_t> expect_loop = {15,2,7}; + SmallVector<size_t> expect_stride = {7,105,1}; EXPECT_EQ(plan.subspace_size, 210); EXPECT_EQ(plan.loop_cnt, expect_loop); EXPECT_EQ(plan.stride, expect_stride); @@ -84,7 +84,7 @@ TEST(GenericRenameTest, sparse_rename_plan_can_be_created) { ValueType renamed = lhs.rename(from, to); auto plan = SparseRenamePlan(lhs, renamed, from, to); EXPECT_EQ(plan.mapped_dims, 4); - std::vector<size_t> expect = {2,0,1,3}; + SmallVector<size_t> expect = {2,0,1,3}; EXPECT_EQ(plan.output_dimensions, expect); } diff --git a/eval/src/vespa/eval/instruction/generic_rename.cpp b/eval/src/vespa/eval/instruction/generic_rename.cpp index 4fe347375c4..8363d4db573 100644 --- a/eval/src/vespa/eval/instruction/generic_rename.cpp +++ b/eval/src/vespa/eval/instruction/generic_rename.cpp @@ -69,10 +69,10 @@ generic_rename(const Value &a, const ValueType &res_type, const ValueBuilderFactory &factory) { auto cells = a.cells().typify<CT>(); - std::vector<string_id> output_address(sparse_plan.mapped_dims); - std::vector<string_id*> input_address; + SmallVector<string_id> output_address(sparse_plan.mapped_dims); + SmallVector<string_id*> input_address; for (size_t maps_to : sparse_plan.output_dimensions) { - input_address.push_back(&output_address[maps_to]); + input_address.emplace_back(&output_address[maps_to]); } auto builder = factory.create_transient_value_builder<CT>(res_type, sparse_plan.mapped_dims, @@ -152,7 +152,7 @@ SparseRenamePlan::SparseRenamePlan(const ValueType &input_type, if (index != output_dimensions.size()) { can_forward_index = false; } - output_dimensions.push_back(index); + output_dimensions.emplace_back(index); } assert(output_dimensions.size() == mapped_dims); } @@ -172,8 +172,8 @@ DenseRenamePlan::DenseRenamePlan(const ValueType &lhs_type, const auto out_dims = output_type.nontrivial_indexed_dimensions(); size_t num_dense_dims = lhs_dims.size(); assert(num_dense_dims == out_dims.size()); - std::vector<size_t> lhs_loopcnt(num_dense_dims); - std::vector<size_t> lhs_stride(num_dense_dims, 1); + SmallVector<size_t> lhs_loopcnt(num_dense_dims); + SmallVector<size_t> lhs_stride(num_dense_dims, 1); size_t lhs_size = 1; for (size_t i = num_dense_dims; i-- > 0; ) { lhs_stride[i] = lhs_size; @@ -191,8 +191,8 @@ DenseRenamePlan::DenseRenamePlan(const ValueType &lhs_type, loop_cnt.back() *= lhs_loopcnt[index]; stride.back() = lhs_stride[index]; } else { - loop_cnt.push_back(lhs_loopcnt[index]); - stride.push_back(lhs_stride[index]); + loop_cnt.emplace_back(lhs_loopcnt[index]); + stride.emplace_back(lhs_stride[index]); } prev_index = index; } diff --git a/eval/src/vespa/eval/instruction/generic_rename.h b/eval/src/vespa/eval/instruction/generic_rename.h index 7834c967488..4d8ca54a248 100644 --- a/eval/src/vespa/eval/instruction/generic_rename.h +++ b/eval/src/vespa/eval/instruction/generic_rename.h @@ -6,6 +6,7 @@ #include <vespa/eval/eval/value_type.h> #include <vespa/eval/eval/interpreted_function.h> #include <vespa/vespalib/stllike/string.h> +#include <vespa/vespalib/util/small_vector.h> #include <vector> namespace vespalib::eval { struct ValueBuilderFactory; } @@ -13,8 +14,8 @@ namespace vespalib::eval { struct ValueBuilderFactory; } namespace vespalib::eval::instruction { struct DenseRenamePlan { - std::vector<size_t> loop_cnt; - std::vector<size_t> stride; + SmallVector<size_t> loop_cnt; + SmallVector<size_t> stride; const size_t subspace_size; DenseRenamePlan(const ValueType &lhs_type, const ValueType &output_type, @@ -28,7 +29,7 @@ struct DenseRenamePlan { struct SparseRenamePlan { size_t mapped_dims; - std::vector<size_t> output_dimensions; + SmallVector<size_t> output_dimensions; bool can_forward_index; SparseRenamePlan(const ValueType &input_type, const ValueType &output_type, diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDownloader.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDownloader.java index 7e14e94823b..e77e8530f03 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDownloader.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDownloader.java @@ -35,7 +35,6 @@ import java.util.stream.Collectors; public class FileReferenceDownloader { private final static Logger log = Logger.getLogger(FileReferenceDownloader.class.getName()); - private final static Duration rpcTimeout = Duration.ofSeconds(10); private final ExecutorService downloadExecutor = Executors.newFixedThreadPool(Math.max(8, Runtime.getRuntime().availableProcessors()), @@ -47,6 +46,7 @@ public class FileReferenceDownloader { private final DownloadStatuses downloadStatuses = new DownloadStatuses(); private final Duration downloadTimeout; private final Duration sleepBetweenRetries; + private final Duration rpcTimeout; FileReferenceDownloader(File downloadDirectory, File tmpDirectory, ConnectionPool connectionPool, Duration timeout, Duration sleepBetweenRetries) { this.connectionPool = connectionPool; @@ -54,6 +54,8 @@ public class FileReferenceDownloader { this.sleepBetweenRetries = sleepBetweenRetries; // Needed to receive RPC calls receiveFile* from server after asking for files new FileReceiver(connectionPool.getSupervisor(), this, downloadDirectory, tmpDirectory); + String timeoutString = System.getenv("VESPA_CONFIGPROXY_FILEDOWNLOAD_RPC_TIMEOUT"); + this.rpcTimeout = Duration.ofSeconds(timeoutString == null ? 30 : Integer.parseInt(timeoutString)); } private void startDownload(FileReferenceDownload fileReferenceDownload) { @@ -128,8 +130,8 @@ public class FileReferenceDownloader { } } else { log.log(logLevel, () -> "Request failed. Req: " + request + "\nSpec: " + connection.getAddress() + - ", error code: " + request.errorCode() + ", set error for spec, use another spec for next request" + - ", retry count " + retryCount); + ", error code: " + request.errorCode() + ", will use another spec for next request" + + ", retry count " + retryCount + ", rpc timeout " + rpcTimeout.getSeconds()); connectionPool.setError(connection, request.errorCode()); return false; } diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index d3ca08c5dba..e53195e3a71 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -102,7 +102,7 @@ public class Flags { public static final UnboundBooleanFlag USE_THREE_PHASE_UPDATES = defineFeatureFlag( "use-three-phase-updates", false, - List.of("vekterli"), "2020-12-02", "2021-03-01", + List.of("vekterli"), "2020-12-02", "2021-04-01", "Whether to enable the use of three-phase updates when bucket replicas are out of sync.", "Takes effect at redeployment", ZONE_ID, APPLICATION_ID); diff --git a/vespalib/src/tests/small_vector/small_vector_test.cpp b/vespalib/src/tests/small_vector/small_vector_test.cpp index 808571acef6..6d8238fefb4 100644 --- a/vespalib/src/tests/small_vector/small_vector_test.cpp +++ b/vespalib/src/tests/small_vector/small_vector_test.cpp @@ -243,4 +243,24 @@ TEST(SmallVectorTest, equal_operator) { SmallVector<EqOnly>({EqOnly{1},EqOnly{5},EqOnly{3}})); } +// to check "back() const" +template<size_t N> +int last_value_of(const SmallVector<int,N> &v) { + return v.back(); +} + +TEST(SmallVectorTest, check_back_method) { + SmallVector<int> vec; + for (int i = 0; i < 1000; ++i) { + vec.emplace_back(17); + EXPECT_EQ(vec.back(), 17); + EXPECT_EQ(last_value_of(vec), 17); + vec.back() = 42; + EXPECT_EQ(vec[i], 42); + vec.back() = i; + EXPECT_EQ(last_value_of(vec), i); + } + EXPECT_EQ(&vec.back(), vec.end() - 1); +} + GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/vespa/vespalib/util/arrayref.h b/vespalib/src/vespa/vespalib/util/arrayref.h index 03634a7a094..2433f9251cf 100644 --- a/vespalib/src/vespa/vespalib/util/arrayref.h +++ b/vespalib/src/vespa/vespalib/util/arrayref.h @@ -2,6 +2,7 @@ #pragma once #include "array.h" +#include "small_vector.h" #include <vector> namespace vespalib { @@ -17,6 +18,8 @@ public: ArrayRef(T * v, size_t sz) noexcept : _v(v), _sz(sz) { } template<typename A=std::allocator<T>> ArrayRef(std::vector<T, A> & v) noexcept : _v(&v[0]), _sz(v.size()) { } + template<size_t N> + ArrayRef(SmallVector<T, N> &v) noexcept : _v(&v[0]), _sz(v.size()) { } ArrayRef(Array<T> &v) noexcept : _v(&v[0]), _sz(v.size()) { } T & operator [] (size_t i) { return _v[i]; } const T & operator [] (size_t i) const { return _v[i]; } @@ -35,6 +38,8 @@ public: ConstArrayRef(const T *v, size_t sz) noexcept : _v(v), _sz(sz) { } template<typename A=std::allocator<T>> ConstArrayRef(const std::vector<T, A> & v) noexcept : _v(&v[0]), _sz(v.size()) { } + template<size_t N> + ConstArrayRef(const SmallVector<T, N> &v) noexcept : _v(&v[0]), _sz(v.size()) { } ConstArrayRef(const ArrayRef<T> & v) noexcept : _v(&v[0]), _sz(v.size()) { } ConstArrayRef(const Array<T> &v) noexcept : _v(&v[0]), _sz(v.size()) { } ConstArrayRef() noexcept : _v(nullptr), _sz(0) {} diff --git a/vespalib/src/vespa/vespalib/util/small_vector.h b/vespalib/src/vespa/vespalib/util/small_vector.h index 21a21fc2cbb..9cbc10951cf 100644 --- a/vespalib/src/vespa/vespalib/util/small_vector.h +++ b/vespalib/src/vespa/vespalib/util/small_vector.h @@ -186,6 +186,8 @@ public: const T *end() const { return (_data + _size); } T &operator[](size_t idx) { return _data[idx]; } const T &operator[](size_t idx) const { return _data[idx]; } + T &back() { return _data[_size - 1]; } + const T &back() const { return _data[_size - 1]; } void clear() { small_vector::destroy_objects(_data, _size); _size = 0; |