proxygen
ServiceWorker.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-present, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree. An additional grant
7  * of patent rights can be found in the PATENTS file in the same directory.
8  *
9  */
10 #pragma once
11 
13 #include <list>
14 #include <memory>
18 
19 namespace proxygen {
20 
21 class Service;
22 class RequestWorker;
23 
38  public:
39  using AcceptorMap =
40  std::map<AcceptorAddress, std::unique_ptr<wangle::Acceptor>>;
41 
42  using NamedAddressMap = std::map<std::string, AcceptorAddress>;
43 
44  ServiceWorker(Service* service, RequestWorker* worker)
45  : service_(service), worker_(worker) {
46  }
47 
48  virtual ~ServiceWorker() {
49  }
50 
51  Service* getService() const {
52  return service_;
53  }
54 
56  std::unique_ptr<wangle::Acceptor> acceptor) {
59  std::move(acceptor));
60  }
61 
62  void addServiceAcceptor(const AcceptorAddress& accAddress,
63  std::unique_ptr<wangle::Acceptor> acceptor) {
64  namedAddress_.emplace(acceptor->getName(), accAddress);
65  addAcceptor(accAddress, std::move(acceptor), acceptors_);
66  }
67 
71  }
72 
73  void drainServiceAcceptor(const AcceptorAddress& accAddress) {
74  // Move the old acceptor to drainingAcceptors_ if present
75  const auto& it = acceptors_.find(accAddress);
76  if (it != acceptors_.end()) {
77  auto name = it->second->getName();
78  addAcceptor(accAddress, std::move(it->second), drainingAcceptors_);
79  acceptors_.erase(it);
80  namedAddress_.erase(name);
81  }
82  }
83 
85  return worker_;
86  }
87 
89  return acceptors_;
90  }
91 
96  auto it = namedAddress_.find(name);
97  if (it != namedAddress_.end()) {
98  auto it2 = acceptors_.find(it->second);
99  if (it2 != acceptors_.end()) {
100  return it2->second.get();
101  }
102  }
103  return nullptr;
104  }
105 
107  return drainingAcceptors_;
108  }
109 
110  // Flush any thread-local stats that the service is tracking
111  virtual void flushStats() {
112  }
113 
114  // Destruct all the acceptors
115  virtual void clearAcceptors() {
116  acceptors_.clear();
117  namedAddress_.clear();
118  drainingAcceptors_.clear();
119  }
120 
121  virtual void clearDrainingAcceptors() {
122  drainingAcceptors_.clear();
123  }
124 
126  return &connectionCounter_;
127  }
128 
129  virtual void forceStop() {
130  }
131 
132  protected:
134 
135  private:
136  // Forbidden copy constructor and assignment operator
137  ServiceWorker(ServiceWorker const&) = delete;
138  ServiceWorker& operator=(ServiceWorker const&) = delete;
139 
140  void addAcceptor(const AcceptorAddress& accAddress,
141  std::unique_ptr<wangle::Acceptor> acceptor,
142  AcceptorMap& acceptors) {
143  CHECK(acceptors.find(accAddress) == acceptors.end());
144  acceptors.insert(std::make_pair(accAddress, std::move(acceptor)));
145  }
146 
151 
157 
163 
169 
174 };
175 
176 } // namespace proxygen
virtual void clearDrainingAcceptors()
virtual void forceStop()
void addAcceptor(const AcceptorAddress &accAddress, std::unique_ptr< wangle::Acceptor > acceptor, AcceptorMap &acceptors)
RequestWorker * getRequestWorker() const
Definition: ServiceWorker.h:84
void addServiceAcceptor(const folly::SocketAddress &address, std::unique_ptr< wangle::Acceptor > acceptor)
Definition: ServiceWorker.h:55
ServiceWorker(Service *service, RequestWorker *worker)
Definition: ServiceWorker.h:44
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
virtual void flushStats()
void drainServiceAcceptor(const folly::SocketAddress &address)
Definition: ServiceWorker.h:68
std::map< std::string, AcceptorAddress > NamedAddressMap
Definition: ServiceWorker.h:42
NamedAddressMap namedAddress_
const std::string & getName() const
Definition: Acceptor.h:162
const char * name
Definition: http_parser.c:437
wangle::Acceptor * getAcceptorByName(std::string name) const
Definition: ServiceWorker.h:95
wangle::SimpleConnectionCounter connectionCounter_
void drainServiceAcceptor(const AcceptorAddress &accAddress)
Definition: ServiceWorker.h:73
ServiceWorker & operator=(ServiceWorker const &)=delete
Service * getService() const
Definition: ServiceWorker.h:51
std::map< AcceptorAddress, std::unique_ptr< wangle::Acceptor >> AcceptorMap
Definition: ServiceWorker.h:40
RequestWorker * worker_
wangle::IConnectionCounter * getConnectionCounter()
const char * string
Definition: Conv.cpp:212
AcceptorMap drainingAcceptors_
void addServiceAcceptor(const AcceptorAddress &accAddress, std::unique_ptr< wangle::Acceptor > acceptor)
Definition: ServiceWorker.h:62
const AcceptorMap & getDrainingAcceptors()
const AcceptorMap & getAcceptors()
Definition: ServiceWorker.h:88
virtual void clearAcceptors()