Coverage Report

Created: 2023-11-12 09:30

/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
5.48k
        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
5.48k
      : 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
                         const std::string& worker_name) override;
37
38
private:
39
  ThreadLocal::Instance& tls_;
40
  Api::Api& api_;
41
  WorkerStatNames stat_names_;
42
  ListenerHooks& hooks_;
43
};
44
45
/**
46
 * A server threaded worker that wraps up a worker thread, event loop, etc.
47
 */
48
class WorkerImpl : public Worker, Logger::Loggable<Logger::Id::main> {
49
public:
50
  WorkerImpl(ThreadLocal::Instance& tls, ListenerHooks& hooks, Event::DispatcherPtr&& dispatcher,
51
             Network::ConnectionHandlerPtr handler, OverloadManager& overload_manager,
52
             Api::Api& api, WorkerStatNames& stat_names);
53
54
  // Server::Worker
55
  void addListener(absl::optional<uint64_t> overridden_listener, Network::ListenerConfig& listener,
56
                   AddListenerCompletion completion, Runtime::Loader& loader) override;
57
  uint64_t numConnections() const override;
58
59
  void removeListener(Network::ListenerConfig& listener, std::function<void()> completion) override;
60
  void removeFilterChains(uint64_t listener_tag,
61
                          const std::list<const Network::FilterChain*>& filter_chains,
62
                          std::function<void()> completion) override;
63
  void start(GuardDog& guard_dog, const std::function<void()>& cb) override;
64
  void initializeStats(Stats::Scope& scope) override;
65
  void stop() override;
66
  void stopListener(Network::ListenerConfig& listener,
67
                    const Network::ExtraShutdownListenerOptions& options,
68
                    std::function<void()> completion) override;
69
70
private:
71
  void threadRoutine(GuardDog& guard_dog, const std::function<void()>& cb);
72
  void stopAcceptingConnectionsCb(OverloadActionState state);
73
  void rejectIncomingConnectionsCb(OverloadActionState state);
74
  void resetStreamsUsingExcessiveMemory(OverloadActionState state);
75
76
  ThreadLocal::Instance& tls_;
77
  ListenerHooks& hooks_;
78
  Event::DispatcherPtr dispatcher_;
79
  Network::ConnectionHandlerPtr handler_;
80
  Api::Api& api_;
81
  Stats::Counter& reset_streams_counter_;
82
  Thread::ThreadPtr thread_;
83
  WatchDogSharedPtr watch_dog_;
84
};
85
86
} // namespace Server
87
} // namespace Envoy