/proc/self/cwd/source/server/drain_manager_impl.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <chrono> |
4 | | #include <functional> |
5 | | #include <vector> |
6 | | |
7 | | #include "envoy/common/time.h" |
8 | | #include "envoy/config/listener/v3/listener.pb.h" |
9 | | #include "envoy/event/dispatcher.h" |
10 | | #include "envoy/event/timer.h" |
11 | | #include "envoy/server/drain_manager.h" |
12 | | #include "envoy/server/instance.h" |
13 | | |
14 | | #include "source/common/common/callback_impl.h" |
15 | | #include "source/common/common/logger.h" |
16 | | |
17 | | namespace Envoy { |
18 | | namespace Server { |
19 | | |
20 | | /** |
21 | | * Implementation of drain manager that does the following by default: |
22 | | * 1) Terminates the parent process after 15 minutes. |
23 | | * 2) Drains the parent process over a period of 10 minutes where drain close becomes more |
24 | | * likely each second that passes. |
25 | | */ |
26 | | class DrainManagerImpl : Logger::Loggable<Logger::Id::main>, public DrainManager { |
27 | | public: |
28 | | DrainManagerImpl(Instance& server, envoy::config::listener::v3::Listener::DrainType drain_type, |
29 | | Event::Dispatcher& dispatcher); |
30 | | |
31 | | // Network::DrainDecision |
32 | | bool drainClose() const override; |
33 | | Common::CallbackHandlePtr addOnDrainCloseCb(DrainCloseCb cb) const override; |
34 | | |
35 | | // Server::DrainManager |
36 | | void startDrainSequence(std::function<void()> drain_complete_cb) override; |
37 | 0 | bool draining() const override { return draining_; } |
38 | | void startParentShutdownSequence() override; |
39 | | DrainManagerPtr |
40 | | createChildManager(Event::Dispatcher& dispatcher, |
41 | | envoy::config::listener::v3::Listener::DrainType drain_type) override; |
42 | | DrainManagerPtr createChildManager(Event::Dispatcher& dispatcher) override; |
43 | | |
44 | | private: |
45 | | void addDrainCompleteCallback(std::function<void()> cb); |
46 | | |
47 | | Instance& server_; |
48 | | Event::Dispatcher& dispatcher_; |
49 | | const envoy::config::listener::v3::Listener::DrainType drain_type_; |
50 | | |
51 | | std::atomic<bool> draining_{false}; |
52 | | Event::TimerPtr drain_tick_timer_; |
53 | | MonotonicTime drain_deadline_; |
54 | | mutable Common::CallbackManager<std::chrono::milliseconds> cbs_{}; |
55 | | std::vector<std::function<void()>> drain_complete_cbs_{}; |
56 | | |
57 | | // Callbacks called by startDrainSequence to cascade/proxy to children |
58 | | std::shared_ptr<Common::ThreadSafeCallbackManager> children_; |
59 | | |
60 | | // Callback handle parent will invoke to initiate drain-sequence. Created and set |
61 | | // by the parent drain-manager. |
62 | | Common::CallbackHandlePtr parent_callback_handle_; |
63 | | |
64 | | Event::TimerPtr parent_shutdown_timer_; |
65 | | }; |
66 | | |
67 | | } // namespace Server |
68 | | } // namespace Envoy |