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