diff options
4 files changed, 18 insertions, 8 deletions
diff --git a/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp b/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp index 5592edcc514..ab45ca0bdbe 100644 --- a/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp +++ b/searchlib/src/tests/expression/attributenode/attribute_node_test.cpp @@ -114,7 +114,7 @@ AttributeManagerFixture::buildAttribute(const vespalib::string &name, BasicType auto attr = std::dynamic_pointer_cast<AttributeType>(attrBase); EXPECT_TRUE(attr); attr->addReservedDoc(); - for (const auto &value : values) { + for (const std::conditional_t<std::is_same_v<bool, ValueType>, bool, ValueType&> value : values) { uint32_t docId = 0; EXPECT_TRUE(attr->addDoc(docId)); EXPECT_NOT_EQUAL(0u, docId); diff --git a/storage/src/vespa/storage/bucketdb/lockablemap.hpp b/storage/src/vespa/storage/bucketdb/lockablemap.hpp index d11d24c7acf..57183566964 100644 --- a/storage/src/vespa/storage/bucketdb/lockablemap.hpp +++ b/storage/src/vespa/storage/bucketdb/lockablemap.hpp @@ -354,7 +354,7 @@ LockableMap<Map>::print(std::ostream& out, bool verbose, out << "LockableMap {\n" << indent << " "; if (verbose) { - for (const auto & entry : _map) { + for (const auto entry : _map) { out << "Key: " << BucketId(BucketId::keyToBucketId(entry.first)) << " Value: " << entry.second << "\n" << indent << " "; } diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java index 7074d363316..83640451601 100644 --- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/DocumentOperationExecutorImpl.java @@ -40,6 +40,7 @@ import java.util.StringJoiner; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -85,6 +86,7 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor private final DelayQueue throttled; private final DelayQueue timeouts; private final Map<VisitorControlHandler, VisitorSession> visits = new ConcurrentHashMap<>(); + private final ExecutorService visitSessionShutdownExecutor = Executors.newSingleThreadExecutor(new DaemonThreadFactory("visit-session-shutdown-")); public DocumentOperationExecutorImpl(ClusterListConfig clustersConfig, AllClustersBucketSpacesConfig bucketsConfig, DocumentOperationExecutorConfig executorConfig, DocumentAccess access, Clock clock) { @@ -150,14 +152,16 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor @Override public void shutdown() { long shutdownMillis = clock.instant().plusSeconds(20).toEpochMilli(); + visitSessionShutdownExecutor.shutdown(); visits.values().forEach(VisitorSession::destroy); Future<?> throttleShutdown = throttled.shutdown(Duration.ofSeconds(10), context -> context.error(OVERLOAD, "Retry on overload failed due to shutdown")); Future<?> timeoutShutdown = timeouts.shutdown(Duration.ofSeconds(15), context -> context.error(TIMEOUT, "Timed out due to shutdown")); try { - throttleShutdown.get(Math.max(0, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS); - timeoutShutdown.get(Math.max(0, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS); + throttleShutdown.get(Math.max(1, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS); + timeoutShutdown.get(Math.max(1, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS); + visitSessionShutdownExecutor.awaitTermination(Math.max(1, shutdownMillis - clock.millis()), TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { throttleShutdown.cancel(true); @@ -212,12 +216,18 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor context.error(ERROR, message != null ? message : "Visiting failed"); } done.set(true); // This may be reached before dispatching thread is done putting us in the map. - visits.computeIfPresent(this, (__, session) -> { session.destroy(); return null; }); + visits.computeIfPresent(this, (__, session) -> { + visitSessionShutdownExecutor.execute(() -> session.destroy()); + return null; + }); } }); visits.put(parameters.getControlHandler(), access.createVisitorSession(parameters)); if (done.get()) - visits.computeIfPresent(parameters.getControlHandler(), (__, session) -> { session.destroy(); return null; }); + visits.computeIfPresent(parameters.getControlHandler(), (__, session) -> { + visitSessionShutdownExecutor.execute(() -> session.destroy()); + return null; + }); } catch (IllegalArgumentException | ParseException e) { context.error(BAD_REQUEST, Exceptions.toMessageString(e)); @@ -386,7 +396,7 @@ public class DocumentOperationExecutorImpl implements DocumentOperationExecutor synchronized (this) { do { notify(); - wait(Math.max(0, waitUntilMillis - clock.millis())); + wait(Math.max(1, waitUntilMillis - clock.millis())); } while (clock.millis() < waitUntilMillis); } diff --git a/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def b/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def index 19f4f50648b..770189f90f5 100644 --- a/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def +++ b/vespaclient-container-plugin/src/main/resources/configdefinitions/document-operation-executor.def @@ -11,5 +11,5 @@ defaultTimeoutSeconds int default=180 visitTimeoutSeconds int default=120 # Bound on number of document operations to keep in retry queue — further operations are rejected -maxThrottled int default=200 +maxThrottled int default=1000 |