aboutsummaryrefslogtreecommitdiffstats
path: root/persistence/src/vespa/persistence/dummyimpl/dummy_bucket_executor.h
blob: 3e1432f7f54e934b938c8c1664ad8450d237b15c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#pragma once

#include <vespa/persistence/spi/bucketexecutor.h>
#include <vespa/vespalib/util/threadexecutor.h>
#include <deque>
#include <mutex>
#include <condition_variable>
#include <unordered_set>

namespace storage::spi::dummy {

/**
 * Simple implementation of a bucket executor. It can schedule multiple tasks concurrently, but only one per bucket.
 */
class DummyBucketExecutor : public BucketExecutor {
public:
    DummyBucketExecutor(size_t numExecutors);
    ~DummyBucketExecutor() override;
    void execute(const Bucket & bucket, std::unique_ptr<BucketTask> task) override;
    void sync();
    void defer_new_tasks();
    [[nodiscard]] size_t num_deferred_tasks() const noexcept;
    void schedule_single_deferred_task();
    void schedule_all_deferred_tasks();
private:
    void internal_execute_no_defer(const Bucket & bucket, std::unique_ptr<BucketTask> task);

    using DeferredTasks = std::deque<std::pair<Bucket, std::unique_ptr<BucketTask>>>;

    std::unique_ptr<vespalib::SyncableThreadExecutor> _executor;
    mutable std::mutex                                _lock;
    std::condition_variable                           _cond;
    std::unordered_set<document::Bucket, document::Bucket::hash> _inFlight;
    bool          _defer_tasks;
    DeferredTasks _deferred_tasks;
};

}