Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/server/null_overload_manager.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include "envoy/server/overload/overload_manager.h"
4
#include "envoy/thread_local/thread_local.h"
5
6
#include "source/common/event/scaled_range_timer_manager_impl.h"
7
8
namespace Envoy {
9
namespace Server {
10
11
/** Implementation of OverloadManager that is never overloaded. Using this instead of the real
12
 *  OverloadManager keeps the admin interface accessible even when the proxy is overloaded.
13
 */
14
class NullOverloadManager : public OverloadManager {
15
public:
16
  struct OverloadState : public ThreadLocalOverloadState {
17
    OverloadState(Event::Dispatcher& dispatcher, bool permissive)
18
3.95k
        : dispatcher_(dispatcher), permissive_(permissive) {}
19
0
    const OverloadActionState& getState(const std::string&) override { return inactive_; }
20
0
    bool tryAllocateResource(OverloadProactiveResourceName, int64_t) override {
21
0
      return permissive_;
22
0
    }
23
0
    bool tryDeallocateResource(OverloadProactiveResourceName, int64_t) override {
24
0
      return permissive_;
25
0
    }
26
0
    bool isResourceMonitorEnabled(OverloadProactiveResourceName) override { return false; }
27
    ProactiveResourceMonitorOptRef
28
0
    getProactiveResourceMonitorForTest(OverloadProactiveResourceName) override {
29
0
      return makeOptRefFromPtr<ProactiveResourceMonitor>(nullptr);
30
0
    }
31
    Event::Dispatcher& dispatcher_;
32
    const bool permissive_;
33
    const OverloadActionState inactive_ = OverloadActionState::inactive();
34
  };
35
36
  NullOverloadManager(ThreadLocal::SlotAllocator& slot_allocator, bool permissive)
37
13.0k
      : tls_(slot_allocator.allocateSlot()), permissive_(permissive) {}
38
39
1.97k
  void start() override {
40
3.95k
    tls_->set([this](Event::Dispatcher& dispatcher) -> ThreadLocal::ThreadLocalObjectSharedPtr {
41
3.95k
      return std::make_shared<OverloadState>(dispatcher, permissive_);
42
3.95k
    });
43
1.97k
  }
44
45
0
  ThreadLocalOverloadState& getThreadLocalOverloadState() override {
46
0
    return tls_->getTyped<OverloadState>();
47
0
  }
48
49
0
  LoadShedPoint* getLoadShedPoint(absl::string_view) override { return nullptr; }
50
51
0
  Event::ScaledRangeTimerManagerFactory scaledTimerFactory() override {
52
0
    if (!permissive_) {
53
0
      return nullptr;
54
0
    }
55
0
    return [](Event::Dispatcher& dispatcher) {
56
0
      return std::make_unique<Event::ScaledRangeTimerManagerImpl>(dispatcher, nullptr);
57
0
    };
58
0
  }
59
60
0
  bool registerForAction(const std::string&, Event::Dispatcher&, OverloadActionCb) override {
61
0
    return true;
62
0
  }
63
0
  void stop() override {}
64
65
  ThreadLocal::SlotPtr tls_;
66
  // The admin code runs in non-permissive mode, rejecting connections and
67
  // ensuring timer code is not called. Envoy mobile uses permissive mode and
68
  // does the opposite.
69
  const bool permissive_;
70
};
71
72
} // namespace Server
73
} // namespace Envoy