ServiceRep.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #ifndef SQUID_SRC_ADAPTATION_ICAP_SERVICEREP_H
10 #define SQUID_SRC_ADAPTATION_ICAP_SERVICEREP_H
11 
12 #include "adaptation/forward.h"
14 #include "adaptation/Initiator.h"
15 #include "adaptation/Service.h"
16 #include "base/AsyncJobCalls.h"
17 #include "cbdata.h"
18 #include "comm.h"
19 #include "FadingCounter.h"
20 #include "pconn.h"
21 #include <deque>
22 
23 namespace Adaptation
24 {
25 namespace Icap
26 {
27 
28 class Options;
29 class OptXact;
30 
31 /* The ICAP service representative maintains information about a single ICAP
32  service that Squid communicates with. The representative initiates OPTIONS
33  requests to the service to keep cached options fresh. One ICAP server may
34  host many ICAP services. */
35 
36 /*
37  * A service with a fresh cached OPTIONS response and without many failures
38  * is an "up" service. All other services are "down". A service is "probed"
39  * if we tried to get an OPTIONS response from it and succeeded or failed.
40  * A probed down service is called "broken".
41  *
42  * The number of failures required to bring an up service down is determined
43  * by icap_service_failure_limit in squid.conf.
44  *
45  * As a bootstrapping mechanism, ICAP transactions wait for an unprobed
46  * service to get a fresh OPTIONS response (see the callWhenReady method).
47  * The waiting callback is called when the OPTIONS transaction completes,
48  * even if the service is now broken.
49  *
50  * We do not initiate ICAP transactions with a broken service, but will
51  * eventually retry to fetch its options in hope to bring the service up.
52  *
53  * A service that should no longer be used after Squid reconfiguration is
54  * treated as if it does not have a fresh cached OPTIONS response. We do
55  * not try to fetch fresh options for such a service. It should be
56  * auto-destroyed by refcounting when no longer used.
57  */
58 
61 {
63 
64 public:
66 
67 public:
68  explicit ServiceRep(const ServiceConfigPointer &aConfig);
69  ~ServiceRep() override;
70 
71  void finalize() override;
72 
73  bool probed() const override; // see comments above
74  bool up() const override; // see comments above
75  bool availableForNew() const;
76  bool availableForOld() const;
77 
78  Initiate *makeXactLauncher(Http::Message *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp) override;
79 
80  void callWhenAvailable(AsyncCall::Pointer &cb, bool priority = false);
82 
83  // the methods below can only be called on an up() service
84  bool wantsUrl(const SBuf &urlPath) const override;
85  bool wantsPreview(const SBuf &urlPath, size_t &wantedSize) const;
86  bool allows204() const;
87  bool allows206() const;
90  void putConnection(const Comm::ConnectionPointer &conn, bool isReusable, bool sendReset, const char *comment);
92  void noteConnectionFailed(const char *comment);
93 
94  void noteFailure() override; // called by transactions to report service failure
95 
96  void noteNewWaiter() {theAllWaiters++;}
97  void noteGoneWaiter();
98  bool existWaiters() const {return (theAllWaiters > 0);}
99 
100  //AsyncJob virtual methods
101  bool doneAll() const override { return Adaptation::Initiator::doneAll() && false;}
102  void callException(const std::exception &e) override;
103 
104  void detach() override;
105  bool detached() const override;
106 
107 public: // treat these as private, they are for callbacks only
108  void noteTimeToUpdate();
109  void noteTimeToNotify();
110 
111  // receive either an ICAP OPTIONS response header or an abort message
112  void noteAdaptationAnswer(const Answer &answer) override;
113 
115  // TODO: Remove sslContext above when FuturePeerContext below becomes PeerContext
118 
119 private:
120  // stores Prepare() callback info
121 
122  struct Client {
123  Pointer service; // one for each client to preserve service
125  };
126 
127  typedef std::vector<Client> Clients;
128  // TODO: rename to theUpWaiters
129  Clients theClients; // all clients waiting for a call back
130 
132  CbcPointer<Adaptation::Initiate> theOptionsFetcher; // pending ICAP OPTIONS transaction
133  time_t theLastUpdate; // time the options were last updated
134 
137  std::deque<Client> theNotificationWaiters;
139  int theAllWaiters;
143  // TODO: use a better type like the FadingCounter for connOverloadReported
144  mutable bool connOverloadReported;
146 
148  const char *isSuspended; // also stores suspension reason for debugging
149 
150  bool notifying; // may be true in any state except for the initial
151  bool updateScheduled; // time-based options update has been scheduled
152 
153 private:
154  ICAP::Method parseMethod(const char *) const;
155  ICAP::VectPoint parseVectPoint(const char *) const;
156 
157  void suspend(const char *reason);
158 
159  bool hasOptions() const;
160  bool needNewOptions() const;
161  time_t optionsFetchTime() const;
162 
163  void scheduleUpdate(time_t when);
164  void scheduleNotification();
165 
166  void startGettingOptions();
167  void handleNewOptions(Options *newOptions);
168  void changeOptions(Options *newOptions);
169  void checkOptions();
170 
171  void announceStatusChange(const char *downPhrase, bool important) const;
172 
174  void setMaxConnections();
176  int excessConnections() const;
181  int availableConnections() const;
186  void busyCheckpoint();
187 
188  const char *status() const override;
189 
190  mutable bool wasAnnouncedUp; // prevent sequential same-state announcements
192 };
193 
194 class ModXact;
197 class ConnWaiterDialer: public NullaryMemFunT<ModXact>
198 {
199 public:
204  ~ConnWaiterDialer() override;
205 };
206 
207 } // namespace Icap
208 } // namespace Adaptation
209 
210 #endif /* SQUID_SRC_ADAPTATION_ICAP_SERVICEREP_H */
211 
std::vector< Client > Clients
Definition: ServiceRep.h:127
common parts of HttpRequest and HttpReply
Definition: Message.h:25
bool doneAll() const override
whether positive goal has been reached
Definition: ServiceRep.h:101
std::shared_ptr< SSL_CTX > ContextPointer
Definition: Context.h:29
std::vector< const Option * > Options
Definition: Options.h:217
const char * status() const override
internal cleanup; do not call directly
Definition: ServiceRep.cc:678
void suspend(const char *reason)
Definition: ServiceRep.cc:279
bool connOverloadReported
whether we reported exceeding theMaxConnections
Definition: ServiceRep.h:144
void callException(const std::exception &e) override
called when the job throws during an async call
Definition: ServiceRep.cc:567
Definition: SBuf.h:93
void callWhenAvailable(AsyncCall::Pointer &cb, bool priority=false)
Definition: ServiceRep.cc:402
ServiceRep(const ServiceConfigPointer &aConfig)
Definition: ServiceRep.cc:33
Security::SessionStatePointer sslSession
Definition: ServiceRep.h:117
A combination of PeerOptions and the corresponding Context.
Definition: PeerOptions.h:154
ICAP::Method parseMethod(const char *) const
void noteConnectionFailed(const char *comment)
Definition: ServiceRep.cc:178
ICAP::VectPoint parseVectPoint(const char *) const
ServiceRep::Pointer theService
Definition: ServiceRep.h:201
bool availableForOld() const
a transaction notified about connection slot availability may start communicating with the service
Definition: ServiceRep.cc:316
Initiate * makeXactLauncher(Http::Message *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp) override
Definition: ServiceRep.cc:671
virtual bool doneAll() const
whether positive goal has been reached
Definition: AsyncJob.cc:112
Comm::ConnectionPointer getIdleConnection(bool isRetriable)
Definition: ServiceRep.cc:118
ConnWaiterDialer(const CbcPointer< Adaptation::Icap::ModXact > &xact, Adaptation::Icap::ConnWaiterDialer::Parent::Method aHandler)
Definition: ServiceRep.cc:730
void scheduleUpdate(time_t when)
Definition: ServiceRep.cc:609
void putConnection(const Comm::ConnectionPointer &conn, bool isReusable, bool sendReset, const char *comment)
Definition: ServiceRep.cc:147
void noteConnectionUse(const Comm::ConnectionPointer &conn)
Definition: ServiceRep.cc:172
void callWhenReady(AsyncCall::Pointer &cb)
Definition: ServiceRep.cc:420
Security::ContextPointer sslContext
Definition: ServiceRep.h:114
bool wantsUrl(const SBuf &urlPath) const override
Definition: ServiceRep.cc:324
void noteGoneWaiter()
An xaction is not waiting any more for service to be available.
Definition: ServiceRep.cc:238
void finalize() override
Definition: ServiceRep.cc:60
std::deque< Client > theNotificationWaiters
Definition: ServiceRep.h:137
time_t optionsFetchTime() const
Definition: ServiceRep.cc:647
void(ModXact ::* Method)()
Definition: AsyncJobCalls.h:94
summarizes adaptation service answer for the noteAdaptationAnswer() API
Definition: Answer.h:24
bool wantsPreview(const SBuf &urlPath, size_t &wantedSize) const
Definition: ServiceRep.cc:330
IdleConnList * theIdleConns
idle persistent connection pool
Definition: ServiceRep.h:145
std::unique_ptr< SSL_SESSION, HardFun< void, SSL_SESSION *, &SSL_SESSION_free > > SessionStatePointer
Definition: Session.h:55
bool probed() const override
Definition: ServiceRep.cc:291
Counts events, forgetting old ones. Useful for "3 errors/minute" limits.
Definition: FadingCounter.h:15
RefCount< ServiceRep > Pointer
Definition: ServiceRep.h:65
FadingCounter theSessionFailures
Definition: ServiceRep.h:147
void changeOptions(Options *newOptions)
Definition: ServiceRep.cc:454
int theMaxConnections
the maximum allowed connections to the service
Definition: ServiceRep.h:142
bool up() const override
Definition: ServiceRep.cc:301
bool availableForNew() const
a new transaction may start communicating with the service
Definition: ServiceRep.cc:306
bool detached() const override
whether detached() was called
Definition: ServiceRep.cc:725
void setMaxConnections()
Set the maximum allowed connections for the service.
Definition: ServiceRep.cc:184
void noteAdaptationAnswer(const Answer &answer) override
Definition: ServiceRep.cc:537
NullaryMemFunT< ModXact > Parent
Definition: ServiceRep.h:200
CbcPointer< Adaptation::Initiate > theOptionsFetcher
Definition: ServiceRep.h:132
void noteFailure() override
Definition: ServiceRep.cc:95
int excessConnections() const
The number of connections which excess the Max-Connections limit.
Definition: ServiceRep.cc:223
void handleNewOptions(Options *newOptions)
Definition: ServiceRep.cc:575
void announceStatusChange(const char *downPhrase, bool important) const
Definition: ServiceRep.cc:522
Security::FuturePeerContext tlsContext
Definition: ServiceRep.h:116

 

Introduction

Documentation

Support

Miscellaneous