]> git.ipfire.org Git - thirdparty/squid.git/blame - src/adaptation/icap/ServiceRep.h
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / adaptation / icap / ServiceRep.h
CommitLineData
774c051c 1/*
77b1029d 2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
774c051c 3 *
bbc27441
AJ
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.
774c051c 7 */
8
9#ifndef SQUID_ICAPSERVICEREP_H
10#define SQUID_ICAPSERVICEREP_H
11
d81a31f1 12#include "adaptation/forward.h"
26cc52cb 13#include "adaptation/icap/Elements.h"
602d9612
A
14#include "adaptation/Initiator.h"
15#include "adaptation/Service.h"
2dba5b8e 16#include "base/AsyncJobCalls.h"
602d9612 17#include "cbdata.h"
2dba5b8e 18#include "comm.h"
602d9612 19#include "FadingCounter.h"
2dba5b8e
CT
20#include "pconn.h"
21#include <deque>
26cc52cb 22
af6a12ee
AJ
23namespace Adaptation
24{
e1381638
AJ
25namespace Icap
26{
26cc52cb
AR
27
28class Options;
29class OptXact;
774c051c 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
c99de607 34 host many ICAP services. */
35
36/*
1299ecbf 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.
c99de607 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
9e008dda
AJ
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
c99de607 56 * auto-destroyed by refcounting when no longer used.
57 */
58
26cc52cb 59class ServiceRep : public RefCountable, public Adaptation::Service,
f53969cc 60 public Adaptation::Initiator
774c051c 61{
5c2f68b7 62 CBDATA_CLASS(ServiceRep);
774c051c 63
64public:
26cc52cb 65 typedef RefCount<ServiceRep> Pointer;
774c051c 66
67public:
6666da11 68 explicit ServiceRep(const ServiceConfigPointer &aConfig);
26cc52cb 69 virtual ~ServiceRep();
774c051c 70
62c7f90e
AR
71 virtual void finalize();
72
76fc7e57
AJ
73 virtual bool probed() const; // see comments above
74 virtual bool up() const; // see comments above
2dba5b8e
CT
75 bool availableForNew() const; ///< a new transaction may start communicating with the service
76 bool availableForOld() const; ///< a transaction notified about connection slot availability may start communicating with the service
774c051c 77
63df1d28 78 virtual Initiate *makeXactLauncher(Http::Message *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp);
d81a31f1 79
2dba5b8e 80 void callWhenAvailable(AsyncCall::Pointer &cb, bool priority = false);
bd7f2ede 81 void callWhenReady(AsyncCall::Pointer &cb);
774c051c 82
774c051c 83 // the methods below can only be called on an up() service
51b5dcf5
AJ
84 bool wantsUrl(const SBuf &urlPath) const;
85 bool wantsPreview(const SBuf &urlPath, size_t &wantedSize) const;
774c051c 86 bool allows204() const;
83c51da9 87 bool allows206() const;
983983ce 88 Comm::ConnectionPointer getConnection(bool isRetriable, bool &isReused);
a32c060f 89 void putConnection(const Comm::ConnectionPointer &conn, bool isReusable, bool sendReset, const char *comment);
983983ce 90 void noteConnectionUse(const Comm::ConnectionPointer &conn);
fb505fa1 91 void noteConnectionFailed(const char *comment);
774c051c 92
c99de607 93 void noteFailure(); // called by transactions to report service failure
9e008dda 94
2dba5b8e
CT
95 void noteNewWaiter() {theAllWaiters++;} ///< New xaction waiting for service to be up or available
96 void noteGoneWaiter(); ///< An xaction is not waiting any more for service to be available
97 bool existWaiters() const {return (theAllWaiters > 0);} ///< if there are xactions waiting for the service to be available
98
bd7f2ede 99 //AsyncJob virtual methods
d81a31f1 100 virtual bool doneAll() const { return Adaptation::Initiator::doneAll() && false;}
4299f876 101 virtual void callException(const std::exception &e);
c99de607 102
76fc7e57
AJ
103 virtual void detach();
104 virtual bool detached() const;
105
774c051c 106public: // treat these as private, they are for callbacks only
107 void noteTimeToUpdate();
108 void noteTimeToNotify();
c824c43b 109
110 // receive either an ICAP OPTIONS response header or an abort message
3af10ac0 111 virtual void noteAdaptationAnswer(const Answer &answer);
774c051c 112
900daee3 113 Security::ContextPointer sslContext;
5d9a65df 114 Security::SessionStatePointer sslSession;
1b091aec 115
774c051c 116private:
117 // stores Prepare() callback info
118
9e008dda 119 struct Client {
774c051c 120 Pointer service; // one for each client to preserve service
bd7f2ede 121 AsyncCall::Pointer callback;
774c051c 122 };
123
c8ea3cc0 124 typedef std::vector<Client> Clients;
2dba5b8e 125 // TODO: rename to theUpWaiters
774c051c 126 Clients theClients; // all clients waiting for a call back
127
26cc52cb 128 Options *theOptions;
4299f876 129 CbcPointer<Adaptation::Initiate> theOptionsFetcher; // pending ICAP OPTIONS transaction
c99de607 130 time_t theLastUpdate; // time the options were last updated
131
2dba5b8e
CT
132 /// FIFO queue of xactions waiting for a connection slot and not yet notified
133 /// about it; xaction is removed when notification is scheduled
134 std::deque<Client> theNotificationWaiters;
135 int theBusyConns; ///< number of connections given to active transactions
136 /// number of xactions waiting for a connection slot (notified and not)
137 /// the number is decreased after the xaction receives notification
138 int theAllWaiters;
139 int theMaxConnections; ///< the maximum allowed connections to the service
140 // TODO: use a better type like the FadingCounter for connOverloadReported
141 mutable bool connOverloadReported; ///< whether we reported exceeding theMaxConnections
fb505fa1 142 IdleConnList *theIdleConns; ///< idle persistent connection pool
2dba5b8e 143
8277060a 144 FadingCounter theSessionFailures;
c99de607 145 const char *isSuspended; // also stores suspension reason for debugging
774c051c 146
774c051c 147 bool notifying; // may be true in any state except for the initial
c99de607 148 bool updateScheduled; // time-based options update has been scheduled
774c051c 149
150private:
151 ICAP::Method parseMethod(const char *) const;
152 ICAP::VectPoint parseVectPoint(const char *) const;
153
c99de607 154 void suspend(const char *reason);
155
156 bool hasOptions() const;
774c051c 157 bool needNewOptions() const;
1299ecbf 158 time_t optionsFetchTime() const;
774c051c 159
1299ecbf 160 void scheduleUpdate(time_t when);
774c051c 161 void scheduleNotification();
c99de607 162
774c051c 163 void startGettingOptions();
26cc52cb
AR
164 void handleNewOptions(Options *newOptions);
165 void changeOptions(Options *newOptions);
c99de607 166 void checkOptions();
167
168 void announceStatusChange(const char *downPhrase, bool important) const;
774c051c 169
2dba5b8e
CT
170 /// Set the maximum allowed connections for the service
171 void setMaxConnections();
172 /// The number of connections which excess the Max-Connections limit
173 int excessConnections() const;
174 /**
175 * The available connections slots to the ICAP server
176 \return the available slots, or -1 if there is no limit on allowed connections
177 */
178 int availableConnections() const;
179 /**
180 * If there are xactions waiting for the service to be available, notify
181 * as many xactions as the available connections slots.
182 */
183 void busyCheckpoint();
184
774c051c 185 const char *status() const;
186
c99de607 187 mutable bool wasAnnouncedUp; // prevent sequential same-state announcements
76fc7e57 188 bool isDetached;
774c051c 189};
190
2dba5b8e
CT
191class ModXact;
192/// Custom dialer to call Service::noteNewWaiter and noteGoneWaiter
193/// to maintain Service idea of waiting and being-notified transactions.
194class ConnWaiterDialer: public NullaryMemFunT<ModXact>
195{
196public:
197 typedef NullaryMemFunT<ModXact> Parent;
198 ServiceRep::Pointer theService;
d6d0eb11 199 ConnWaiterDialer(const CbcPointer<Adaptation::Icap::ModXact> &xact, Adaptation::Icap::ConnWaiterDialer::Parent::Method aHandler);
2dba5b8e
CT
200 ConnWaiterDialer(const Adaptation::Icap::ConnWaiterDialer &aConnWaiter);
201 ~ConnWaiterDialer();
202};
26cc52cb
AR
203
204} // namespace Icap
205} // namespace Adaptation
206
774c051c 207#endif /* SQUID_ICAPSERVICEREP_H */
f53969cc 208