Launcher.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2019 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 /* DEBUG: section 93 ICAP (RFC 3507) Client */
10 
11 #include "squid.h"
12 #include "acl/FilledChecklist.h"
13 #include "adaptation/Answer.h"
14 #include "adaptation/icap/Config.h"
18 #include "base/TextException.h"
19 #include "globals.h"
20 #include "HttpReply.h"
21 
23  Adaptation::ServicePointer &aService):
24  AsyncJob(aTypeName),
25  Adaptation::Initiate(aTypeName),
26  theService(aService), theXaction(0), theLaunches(0)
27 {
28 }
29 
31 {
33 }
34 
36 {
38 
40  launchXaction("first");
41 }
42 
44 {
45  Must(!theXaction);
46  ++theLaunches;
47  debugs(93,4, HERE << "launching " << xkind << " xaction #" << theLaunches);
49  x->attempts = theLaunches;
50  if (theLaunches > 1) {
51  x->clearError();
52  x->disableRetries();
53  }
55  x->disableRepeats("over icap_retry_limit");
58 }
59 
61 {
62  debugs(93,5, HERE << "launches: " << theLaunches << " answer: " << answer);
63 
64  // XXX: akError is unused by ICAPXaction in favor of noteXactAbort()
65  Must(answer.kind != Answer::akError);
66 
67  sendAnswer(answer);
69  Must(done());
70 }
71 
73 {
74 
75  announceInitiatorAbort(theXaction); // propogate to the transaction
77  Must(done()); // should be nothing else to do
78 
79 }
80 
82 {
83  debugs(93,5, HERE << "theXaction:" << theXaction << " launches: " << theLaunches);
84 
85  // TODO: add more checks from FwdState::checkRetry()?
86  if (canRetry(info)) {
88  launchXaction("retry");
89  } else if (canRepeat(info)) {
91  launchXaction("repeat");
92  } else {
93  debugs(93,3, HERE << "cannot retry or repeat a failed transaction");
95  tellQueryAborted(false); // caller decides based on bypass, consumption
96  Must(done());
97  }
98 }
99 
101 {
103 }
104 
106 {
107  if (theInitiator.set())
108  tellQueryAborted(true); // always final here because abnormal
109 
110  if (theXaction.set())
112 
114 }
115 
117 {
118  // We do not check and can exceed zero repeat limit when retrying.
119  // This is by design as the limit does not apply to pconn retrying.
120  return !shutting_down && info.isRetriable;
121 }
122 
124 {
125  debugs(93,9, HERE << shutting_down);
127  return false;
128 
129  debugs(93,9, HERE << info.isRepeatable); // TODO: update and use status()
130  if (!info.isRepeatable)
131  return false;
132 
133  debugs(93,9, HERE << info.icapReply);
134  if (!info.icapReply) // did not get to read an ICAP reply; a timeout?
135  return true;
136 
137  debugs(93,9, info.icapReply->sline.status());
138  // XXX: Http::scNone is not the only sign of parse error
139  // XXX: if there is a specific HTTP error code describing the problem, that may be set
140  if (info.icapReply->sline.status() == Http::scNone) // failed to parse the reply; I/O err
141  return true;
142 
143  ACLFilledChecklist *cl =
145  cl->reply = info.icapReply;
146  HTTPMSGLOCK(cl->reply);
147 
148  bool result = cl->fastCheck().allowed();
149  delete cl;
150  return result;
151 }
152 
153 /* ICAPXactAbortInfo */
154 
156  HttpReply *anIcapReply, bool beRetriable, bool beRepeatable):
157  icapRequest(anIcapRequest),
158  icapReply(anIcapReply),
159  isRetriable(beRetriable),
160  isRepeatable(beRepeatable)
161 {
162  if (icapRequest)
164  if (icapReply)
166 }
167 
170  icapReply(i.icapReply),
173 {
174  if (icapRequest)
176  if (icapReply)
178 }
179 
181 {
184 }
185 
virtual bool doneAll() const
whether positive goal has been reached
Definition: Launcher.cc:100
summarizes adaptation service answer for the noteAdaptationAnswer() API
Definition: Answer.h:22
void tellQueryAborted(bool final)
Definition: Initiate.cc:87
virtual void noteAdaptationAnswer(const Answer &answer)
Definition: Launcher.cc:60
CbcPointer< Initiate > initiateAdaptation(Initiate *x)
< starts freshly created initiate and returns a safe pointer to it
Definition: Initiator.cc:23
#define assert(EX)
Definition: assert.h:17
bool canRepeat(XactAbortInfo &info) const
Definition: Launcher.cc:123
int i
Definition: membanger.c:49
void announceInitiatorAbort(CbcPointer< Initiate > &x)
inform the transaction about abnormal termination and clear the pointer
Definition: Initiator.cc:38
bool initiated(const CbcPointer< AsyncJob > &job) const
Must(initiated(initiate)) instead of Must(initiate.set()), for clarity.
Definition: Initiator.h:52
Config TheConfig
Definition: Config.cc:19
void HTTPMSGLOCK(Http::Message *a)
Definition: Message.h:160
#define Must(condition)
Like assert() but throws an exception instead of aborting the process.
Definition: TextException.h:69
no adapted message will come; see bypassable
Definition: Answer.h:29
Launcher(const char *aTypeName, Adaptation::ServicePointer &aService)
Definition: Launcher.cc:22
int shutting_down
virtual void swanSong()
Definition: Launcher.cc:105
#define debugs(SECTION, LEVEL, CONTENT)
Definition: Debug.h:124
void launchXaction(const char *xkind)
Definition: Launcher.cc:43
int attempts
the number of times we tried to get to the service, including this time
Definition: Xaction.h:61
XactAbortInfo(HttpRequest *anIcapRequest, HttpReply *anIcapReply, bool beRetriable, bool beRepeatable)
Definition: Launcher.cc:155
Http::StatusLine sline
Definition: HttpReply.h:60
int repeat_limit
icap_retry_limit in squid.conf
Definition: Config.h:39
virtual void clearError()
clear stored error details, if any; used for retries/repeats
Definition: Xaction.h:113
CbcPointer< Initiator > theInitiator
Definition: Initiate.h:51
std::ostream & HERE(std::ostream &s)
Definition: Debug.h:153
void disableRepeats(const char *reason)
Definition: Xaction.cc:136
void sendAnswer(const Answer &answer)
Definition: Initiate.cc:79
virtual Xaction * createXaction()=0
virtual bool doneAll() const
whether positive goal has been reached
Definition: AsyncJob.cc:96
void HTTPMSGUNLOCK(M *&a)
Definition: Message.h:149
Kind kind
the type of the answer
Definition: Answer.h:42
bool allowed() const
Definition: Acl.h:141
virtual void noteXactAbort(XactAbortInfo info)
Definition: Launcher.cc:81
allow_t const & fastCheck()
Definition: Checklist.cc:336
Http::StatusCode status() const
retrieve the status code for this status line
Definition: StatusLine.h:45
virtual void start()
called by AsyncStart; do not call directly
Definition: AsyncJob.cc:43
virtual void start()
called by AsyncStart; do not call directly
Definition: Launcher.cc:35
bool set() const
was set but may be invalid
Definition: CbcPointer.h:40
bool canRetry(XactAbortInfo &info) const
Definition: Launcher.cc:116
bool done() const
the job is destroyed in callEnd() when done()
Definition: AsyncJob.cc:90
acl_access * repeat
icap_retry ACL in squid.conf
Definition: Config.h:38
virtual void swanSong()
Definition: Initiate.cc:62
const char * dash_str
CbcPointer< Initiate > theXaction
current ICAP transaction
Definition: Launcher.h:76
void clearAdaptation(CbcPointer< Initiate > &x)
clears the pointer (does not call announceInitiatorAbort)
Definition: Initiator.cc:32

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors