aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-05-26 18:52:58 +0200
committerGitHub <noreply@github.com>2023-05-26 18:52:58 +0200
commit06b722e43cdf32f859cca46a3e85dede876a97e9 (patch)
tree8d7a9c0709724d8d5f4add90a96770a355ee06f3
parentdda025899b05bf73e99d5d50a9681beb73469955 (diff)
parent8d3fdc2184e07cbc5b46d297c02bf88f5c2e8c42 (diff)
Merge pull request #27227 from vespa-engine/balder/drop-lock-when-calling-cancelv8.168.43
Prevent possible deadlock when calling State::cancel by dropping the …
-rw-r--r--searchcore/src/vespa/searchcore/proton/common/scheduled_forward_executor.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/common/scheduled_forward_executor.cpp b/searchcore/src/vespa/searchcore/proton/common/scheduled_forward_executor.cpp
index f19ff36dbfb..230ff922e80 100644
--- a/searchcore/src/vespa/searchcore/proton/common/scheduled_forward_executor.cpp
+++ b/searchcore/src/vespa/searchcore/proton/common/scheduled_forward_executor.cpp
@@ -95,11 +95,15 @@ ScheduledForwardExecutor::~ScheduledForwardExecutor() {
bool
ScheduledForwardExecutor::cancel(uint64_t key)
{
- std::lock_guard guard(_lock);
- auto found = _taskList.find(key);
- if (found == _taskList.end()) return false;
- found->second->cancel();
- _taskList.erase(found);
+ std::unique_ptr<State> state;
+ {
+ std::lock_guard guard(_lock);
+ auto found = _taskList.find(key);
+ if (found == _taskList.end()) return false;
+ state = std::move(found->second);
+ _taskList.erase(found);
+ }
+ state->cancel();
return true;
}