Coverage Report

Created: 2024-09-19 09:45

/proc/self/cwd/source/server/worker_impl.h
Line
Count
Source
1
#pragma once
2
3
#include <functional>
4
#include <memory>
5
6
#include "envoy/api/api.h"
7
#include "envoy/network/connection_handler.h"
8
#include "envoy/server/guarddog.h"
9
#include "envoy/server/listener_manager.h"
10
#include "envoy/server/worker.h"
11
#include "envoy/thread_local/thread_local.h"
12
13
#include "source/common/common/logger.h"
14
#include "source/server/listener_hooks.h"
15
16
namespace Envoy {
17
namespace Server {
18
19
// Captures a set of stat names for the workers.
20
struct WorkerStatNames {
21
  explicit WorkerStatNames(Stats::SymbolTable& symbol_table)
22
      : pool_(symbol_table),
23
4.98k
        reset_high_memory_stream_(pool_.add(OverloadActionStatsNames::get().ResetStreamsCount)) {}
24
25
  Stats::StatNamePool pool_;
26
  Stats::StatName reset_high_memory_stream_;
27
};
28
29
class ProdWorkerFactory : public WorkerFactory, Logger::Loggable<Logger::Id::main> {
30
public:
31
  ProdWorkerFactory(ThreadLocal::Instance& tls, Api::Api& api, ListenerHooks& hooks)
32
4.98k
      : tls_(tls), api_(api), stat_names_(api.rootScope().symbolTable()), hooks_(hooks) {}
33
34
  // Server::WorkerFactory
35
  WorkerPtr createWorker(uint32_t index, OverloadManager& overload_manager,
36
                         OverloadManager& null_overload_manager,
37
                         const std::string& worker_name) override;
38
39
private:
40
  ThreadLocal::Instance& tls_;
41
  Api::Api& api_;
42
  WorkerStatNames stat_names_;
43
  ListenerHooks& hooks_;
44
};
45
46
/**
47
 * A server threaded worker that wraps up a worker thread, event loop, etc.
48
 */
49
class WorkerImpl : public Worker, Logger::Loggable<Logger::Id::main> {
50
public:
51
  WorkerImpl(ThreadLocal::Instance& tls, ListenerHooks& hooks, Event::DispatcherPtr&& dispatcher,
52
             Network::ConnectionHandlerPtr handler, OverloadManager& overload_manager,
53
             Api::Api& api, WorkerStatNames& stat_names);
54
55
  // Server::Worker
56
  void addListener(absl::optional<uint64_t> overridden_listener, Network::ListenerConfig& listener,
57
                   AddListenerCompletion completion, Runtime::Loader& loader,
58
                   Random::RandomGenerator& random) override;
59
  uint64_t numConnections() const override;
60
61
  void removeListener(Network::ListenerConfig& listener, std::function<void()> completion) override;
62
  void removeFilterChains(uint64_t listener_tag,
63
                          const std::list<const Network::FilterChain*>& filter_chains,
64
                          std::function<void()> completion) override;
65
  void start(OptRef<GuardDog> guard_dog, const std::function<void()>& cb) override;
66
  void initializeStats(Stats::Scope& scope) override;
67
  void stop() override;
68
  void stopListener(Network::ListenerConfig& listener,
69
                    const Network::ExtraShutdownListenerOptions& options,
70
                    std::function<void()> completion) override;
71
72
private:
73
  void threadRoutine(OptRef<GuardDog> guard_dog, const std::function<void()>& cb);
74
  void stopAcceptingConnectionsCb(OverloadActionState state);
75
  void rejectIncomingConnectionsCb(OverloadActionState state);
76
  void resetStreamsUsingExcessiveMemory(OverloadActionState state);
77
78
  ThreadLocal::Instance& tls_;
79
  ListenerHooks& hooks_;
80
  Event::DispatcherPtr dispatcher_;
81
  Network::ConnectionHandlerPtr handler_;
82
  Api::Api& api_;
83
  Stats::Counter& reset_streams_counter_;
84
  Thread::ThreadPtr thread_;
85
  WatchDogSharedPtr watch_dog_;
86
};
87
88
} // namespace Server
89
} // namespace Envoy