Squid Web Cache master
Loading...
Searching...
No Matches
ServiceRep.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 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"
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
23namespace Adaptation
24{
25namespace Icap
26{
27
28class Options;
29class 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
64public:
66
67public:
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
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
107public: // 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
119private:
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;
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
153private:
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);
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
194class ModXact;
206
207} // namespace Icap
208} // namespace Adaptation
209
210#endif /* SQUID_SRC_ADAPTATION_ICAP_SERVICEREP_H */
211
#define RefCountable
The locking interface for use on Reference-Counted classes.
Definition Lock.h:66
summarizes adaptation service answer for the noteAdaptationAnswer() API
Definition Answer.h:25
NullaryMemFunT< ModXact > Parent
Definition ServiceRep.h:200
void scheduleUpdate(time_t when)
void noteFailure() override
Definition ServiceRep.cc:96
int theMaxConnections
the maximum allowed connections to the service
Definition ServiceRep.h:142
void noteAdaptationAnswer(const Answer &answer) override
bool availableForOld() const
a transaction notified about connection slot availability may start communicating with the service
void noteConnectionUse(const Comm::ConnectionPointer &conn)
Security::SessionStatePointer sslSession
Definition ServiceRep.h:117
void suspend(const char *reason)
void noteNewWaiter()
New xaction waiting for service to be up or available.
Definition ServiceRep.h:96
time_t optionsFetchTime() const
Security::ContextPointer sslContext
Definition ServiceRep.h:114
void changeOptions(Options *newOptions)
IdleConnList * theIdleConns
idle persistent connection pool
Definition ServiceRep.h:145
std::vector< Client > Clients
Definition ServiceRep.h:127
void callException(const std::exception &e) override
called when the job throws during an async call
ICAP::VectPoint parseVectPoint(const char *) const
bool up() const override
void callWhenAvailable(AsyncCall::Pointer &cb, bool priority=false)
bool detached() const override
whether detached() was called
bool wantsUrl(const SBuf &urlPath) const override
Security::FuturePeerContext tlsContext
Definition ServiceRep.h:116
RefCount< ServiceRep > Pointer
Definition ServiceRep.h:65
bool existWaiters() const
if there are xactions waiting for the service to be available
Definition ServiceRep.h:98
FadingCounter theSessionFailures
Definition ServiceRep.h:147
bool doneAll() const override
whether positive goal has been reached
Definition ServiceRep.h:101
const char * status() const override
internal cleanup; do not call directly
ICAP::Method parseMethod(const char *) const
void setMaxConnections()
Set the maximum allowed connections for the service.
void callWhenReady(AsyncCall::Pointer &cb)
void announceStatusChange(const char *downPhrase, bool important) const
void noteGoneWaiter()
An xaction is not waiting any more for service to be available.
bool probed() const override
Initiate * makeXactLauncher(Http::Message *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp) override
bool wantsPreview(const SBuf &urlPath, size_t &wantedSize) const
Comm::ConnectionPointer getIdleConnection(bool isRetriable)
bool connOverloadReported
whether we reported exceeding theMaxConnections
Definition ServiceRep.h:144
std::deque< Client > theNotificationWaiters
Definition ServiceRep.h:137
bool availableForNew() const
a new transaction may start communicating with the service
void handleNewOptions(Options *newOptions)
void noteConnectionFailed(const char *comment)
void putConnection(const Comm::ConnectionPointer &conn, bool isReusable, bool sendReset, const char *comment)
int excessConnections() const
The number of connections which excess the Max-Connections limit.
CbcPointer< Adaptation::Initiate > theOptionsFetcher
Definition ServiceRep.h:132
virtual bool doneAll() const
whether positive goal has been reached
Definition AsyncJob.cc:112
Counts events, forgetting old ones. Useful for "3 errors/minute" limits.
common parts of HttpRequest and HttpReply
Definition Message.h:26
Definition SBuf.h:94
A combination of PeerOptions and the corresponding Context.
std::vector< const Option * > Options
Definition Options.h:217
std::shared_ptr< SSL_CTX > ContextPointer
Definition Context.h:29
std::unique_ptr< SSL_SESSION, HardFun< void, SSL_SESSION *, &SSL_SESSION_free > > SessionStatePointer
Definition Session.h:55