diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-02-01 22:37:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-01 22:37:48 +0100 |
commit | f10f0817ad1bb5a492fbd6a210bef3c3dda427bc (patch) | |
tree | 73588ec8a9c703e0fec60a0ee72f006603711aef | |
parent | fdf25819b9c89ccebbe2f1dea307bbb515ec639d (diff) | |
parent | 5d801ca3c7f59230711c84b084025086a18ba368 (diff) |
Merge pull request #16319 from vespa-engine/balder/disconnect-upcalls-early
Balder/disconnect upcalls early
-rw-r--r-- | storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp | 25 | ||||
-rw-r--r-- | storage/src/vespa/storage/persistence/messages.cpp | 7 |
2 files changed, 26 insertions, 6 deletions
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp index 42f9e876eee..371b63e442c 100644 --- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp +++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp @@ -820,6 +820,13 @@ FileStorManager::sendUp(const std::shared_ptr<api::StorageMessage>& msg) void FileStorManager::onClose() { LOG(debug, "Start closing"); + std::unique_ptr<vespalib::IDestructorCallback> toDestruct; + { + std::lock_guard guard(_executeLock); + toDestruct = std::move(_bucketExecutorRegistration); + } + toDestruct.reset(); + _resource_usage_listener_registration.reset(); // Avoid getting config during shutdown _configFetcher.close(); LOG(debug, "Closed _configFetcher."); @@ -985,18 +992,18 @@ void FileStorManager::initialize_bucket_databases_from_provider() { class FileStorManager::TrackExecutedTasks : public vespalib::Executor::Task { public: - TrackExecutedTasks(FileStorManager & manager); + TrackExecutedTasks(std::lock_guard<std::mutex> & guard, FileStorManager & manager); void run() override; private: FileStorManager & _manager; size_t _serialNum; }; -FileStorManager::TrackExecutedTasks::TrackExecutedTasks(FileStorManager & manager) +FileStorManager::TrackExecutedTasks::TrackExecutedTasks(std::lock_guard<std::mutex> & guard, FileStorManager & manager) : _manager(manager), _serialNum(0) { - std::lock_guard guard(_manager._executeLock); + (void) guard; _serialNum = _manager._executeCount++; _manager._tasksInExecute.insert(_serialNum); } @@ -1015,8 +1022,16 @@ FileStorManager::execute(const spi::Bucket &bucket, std::unique_ptr<spi::BucketT StorBucketDatabase::WrappedEntry entry(_component.getBucketDatabase(bucket.getBucketSpace()).get( bucket.getBucketId(), "FileStorManager::execute")); if (entry.exist()) { - auto trackBuckets = std::make_unique<TrackExecutedTasks>(*this); - _filestorHandler->schedule(std::make_shared<RunTaskCommand>(bucket, std::move(trackBuckets), std::move(task))); + std::unique_ptr<TrackExecutedTasks> trackTasks; + { + std::lock_guard guard(_executeLock); + if (_bucketExecutorRegistration) { + trackTasks = std::make_unique<TrackExecutedTasks>(guard, *this); + } + } + if (trackTasks) { + _filestorHandler->schedule(std::make_shared<RunTaskCommand>(bucket, std::move(trackTasks), std::move(task))); + } } return task; } diff --git a/storage/src/vespa/storage/persistence/messages.cpp b/storage/src/vespa/storage/persistence/messages.cpp index 14f41850a4f..6b1e0e50c65 100644 --- a/storage/src/vespa/storage/persistence/messages.cpp +++ b/storage/src/vespa/storage/persistence/messages.cpp @@ -192,7 +192,11 @@ RunTaskCommand::RunTaskCommand(const spi::Bucket &bucket, _bucket(bucket) { } -RunTaskCommand::~RunTaskCommand() = default; +RunTaskCommand::~RunTaskCommand() { + if (_afterRun) { + _afterRun->run(); + } +} void RunTaskCommand::run(const spi::Bucket & bucket, std::shared_ptr<vespalib::IDestructorCallback> onComplete) @@ -202,6 +206,7 @@ RunTaskCommand::run(const spi::Bucket & bucket, std::shared_ptr<vespalib::IDestr } if (_afterRun) { _afterRun->run(); + _afterRun.reset(); } } |