diff options
author | Håvard Pettersen <havardpe@oath.com> | 2020-06-14 11:43:34 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2020-06-14 11:43:34 +0000 |
commit | bfc6cfee7ea0dc4b8746573ab6e18fc5941c59c2 (patch) | |
tree | ede34221ac36f440de4fb0ba600bfab1a8f9be19 /searchcore | |
parent | aacb857c63b9932ecac330d65bdd28d05d458b62 (diff) |
avoid deadlock when using compile cache with blocking executors
- avoid taking cache lock in compile task destructor
- avoid holding cache lock while posting compile task
- add unit test trying to provoke deadlock
- bonus: fix blocking executor implementation
(did not work with threads <= task limit)
Diffstat (limited to 'searchcore')
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/server/proton.cpp | 4 | ||||
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/server/proton.h | 2 |
2 files changed, 3 insertions, 3 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp index 719ba359ccf..962ee65c10d 100644 --- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp @@ -302,8 +302,8 @@ Proton::init(const BootstrapConfig::SP & configSnapshot) _warmupExecutor = std::make_unique<vespalib::ThreadStackExecutor>(4, 128*1024, index_warmup_executor); const size_t sharedThreads = deriveCompactionCompressionThreads(protonConfig, hwInfo.cpu()); - _sharedExecutor = std::make_unique<vespalib::BlockingThreadStackExecutor>(sharedThreads, 128*1024, sharedThreads*16, proton_shared_executor); - _compile_cache_executor_binding = vespalib::eval::CompileCache::bind(*_sharedExecutor); + _sharedExecutor = std::make_shared<vespalib::BlockingThreadStackExecutor>(sharedThreads, 128*1024, sharedThreads*16, proton_shared_executor); + _compile_cache_executor_binding = vespalib::eval::CompileCache::bind(_sharedExecutor); InitializeThreads initializeThreads; if (protonConfig.initialize.threads > 0) { initializeThreads = std::make_shared<vespalib::ThreadStackExecutor>(protonConfig.initialize.threads, 128 * 1024, initialize_executor); diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.h b/searchcore/src/vespa/searchcore/proton/server/proton.h index d0b76bd5804..d5c1a8b7b78 100644 --- a/searchcore/src/vespa/searchcore/proton/server/proton.h +++ b/searchcore/src/vespa/searchcore/proton/server/proton.h @@ -112,7 +112,7 @@ private: ProtonConfigurer _protonConfigurer; ProtonConfigFetcher _protonConfigFetcher; std::unique_ptr<vespalib::ThreadStackExecutorBase> _warmupExecutor; - std::unique_ptr<vespalib::ThreadStackExecutorBase> _sharedExecutor; + std::shared_ptr<vespalib::ThreadStackExecutorBase> _sharedExecutor; vespalib::eval::CompileCache::ExecutorBinding::UP _compile_cache_executor_binding; matching::QueryLimiter _queryLimiter; vespalib::Clock _clock; |