Coverage Report

Created: 2024-07-27 06:53

/src/rocksdb/util/concurrent_task_limiter_impl.h
Line
Count
Source (jump to first uncovered line)
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under both the GPLv2 (found in the
3
//  COPYING file in the root directory) and Apache 2.0 License
4
//  (found in the LICENSE.Apache file in the root directory).
5
//
6
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
// Use of this source code is governed by a BSD-style license that can be
8
// found in the LICENSE file. See the AUTHORS file for names of contributors.
9
10
#pragma once
11
#include <atomic>
12
#include <memory>
13
14
#include "rocksdb/concurrent_task_limiter.h"
15
#include "rocksdb/env.h"
16
17
namespace ROCKSDB_NAMESPACE {
18
19
class TaskLimiterToken;
20
21
class ConcurrentTaskLimiterImpl : public ConcurrentTaskLimiter {
22
 public:
23
  explicit ConcurrentTaskLimiterImpl(const std::string& name,
24
                                     int32_t max_outstanding_task);
25
  // No copying allowed
26
  ConcurrentTaskLimiterImpl(const ConcurrentTaskLimiterImpl&) = delete;
27
  ConcurrentTaskLimiterImpl& operator=(const ConcurrentTaskLimiterImpl&) =
28
      delete;
29
30
  virtual ~ConcurrentTaskLimiterImpl();
31
32
  const std::string& GetName() const override;
33
34
  void SetMaxOutstandingTask(int32_t limit) override;
35
36
  void ResetMaxOutstandingTask() override;
37
38
  int32_t GetOutstandingTask() const override;
39
40
  // Request token for adding a new task.
41
  // If force == true, it requests a token bypassing throttle.
42
  // Returns nullptr if it got throttled.
43
  virtual std::unique_ptr<TaskLimiterToken> GetToken(bool force);
44
45
 private:
46
  friend class TaskLimiterToken;
47
48
  std::string name_;
49
  std::atomic<int32_t> max_outstanding_tasks_;
50
  std::atomic<int32_t> outstanding_tasks_;
51
};
52
53
class TaskLimiterToken {
54
 public:
55
  explicit TaskLimiterToken(ConcurrentTaskLimiterImpl* limiter)
56
0
      : limiter_(limiter) {}
57
  ~TaskLimiterToken();
58
59
 private:
60
  ConcurrentTaskLimiterImpl* limiter_;
61
62
  // no copying allowed
63
  TaskLimiterToken(const TaskLimiterToken&) = delete;
64
  void operator=(const TaskLimiterToken&) = delete;
65
};
66
67
}  // namespace ROCKSDB_NAMESPACE