HappyConnOpener.cc
Go to the documentation of this file.
114 SpareAllowanceGiver(): HappyOrderEnforcer("happy_eyeballs_connect_gap/happy_eyeballs_connect_limit enforcement") {}
188 HappyOrderEnforcer::startedWaiting(const HappyAbsoluteTime lastStart, const int cfgTimeoutMsec) const
207 eventAdd(name, &HappyOrderEnforcer::NoteWaitOver, const_cast<HappyOrderEnforcer*>(this), waitTime, 0, false);
329 HappyConnOpener::HappyConnOpener(const ResolvedPeers::Pointer &dests, const AsyncCall::Pointer &aCall, HttpRequest::Pointer &request, const time_t aFwdStart, int tries, const AccessLogEntry::Pointer &anAle):
417 std::ostream &
485 HappyConnOpener::sendSuccess(const PeerConnectionPointer &conn, const bool reused, const char *connKind)
606 HappyConnOpener::handleConnOpenerAnswer(Attempt &attempt, const CommConnectCbParams ¶ms, const char *what)
728 } else if (currentPeer && !spareWaiting.forNewPeer && spareWaiting && destinations->doneWithSpares(*currentPeer)) {
Definition: AsyncJob.h:32
double current_dtime
the current UNIX time in seconds (with microsecond precision)
Definition: stub_libtime.cc:19
PeerConnectionPointer extractFront()
extracts and returns the first queued address
Definition: ResolvedPeers.cc:111
~HappyConnOpenerAnswer()
Definition: HappyConnOpener.cc:318
void notePrimeConnectDone(const CommConnectCbParams &)
Comm::ConnOpener callback for the prime connection attempt.
Definition: HappyConnOpener.cc:588
a connection opening attempt in progress (or falsy)
Definition: HappyConnOpener.h:157
const char * ranOutOfTimeOrAttemptsEarlier_
Reason to ran out of time or attempts.
Definition: HappyConnOpener.h:265
bool doneWithPrimes(const Comm::Connection ¤tPeer)
whether extractPrime() returns and will continue to return nil
Definition: ResolvedPeers.cc:185
bool destinationsFinalized
whether all of the available candidate paths received from DNS
Definition: ResolvedPeers.h:81
void setHost(const char *)
configures the origin server domain name
Definition: HappyConnOpener.cc:351
void stopGivingPrimeItsChance()
called when the prime attempt has used up its chance for a solo victory
Definition: HappyConnOpener.cc:660
Comm::ConnectionPointer pop(const Comm::ConnectionPointer &dest, const char *domain, bool keepOpen)
Definition: pconn.cc:449
virtual ~HappyConnOpener() override
Definition: HappyConnOpener.cc:344
AsyncCall::Pointer callback
a pending noteGavePrimeItsChance() or noteSpareAllowance() call
Definition: HappyConnOpener.h:44
void checkForNewConnection()
Definition: HappyConnOpener.cc:703
void jobDroppedAllowance()
reacts to HappyConnOpener dropping its spare connection allowance
Definition: HappyConnOpener.cc:273
ErrorState * makeError(const err_type type) const
Definition: HappyConnOpener.cc:462
void dequeue(HappyConnOpener &)
stops managing the job's wait; cancels the pending callback, if any
Definition: HappyConnOpener.cc:160
Definition: ConnOpener.h:25
PconnPool * fwdPconnPool
a collection of previously used persistent Squid-to-peer HTTP(S) connections
Definition: FwdState.cc:77
void cancelAttempt(Attempt &, const char *reason)
cancels the in-progress attempt, making its path a future candidate
Definition: HappyConnOpener.cc:498
virtual CallDialer * getDialer()=0
virtual void start() override
called by AsyncStart; do not call directly
Definition: HappyConnOpener.cc:359
int n_tries
number of connection opening attempts, including those in the requestor
Definition: HappyConnOpener.h:262
Attempt prime
current connection opening attempt on the prime track (if any)
Definition: HappyConnOpener.h:225
HappyAbsoluteTime primeStart
the start of the first connection attempt for the currentPeer
Definition: HappyConnOpener.h:153
void maybeGivePrimeItsChance()
Definition: HappyConnOpener.cc:802
void maybeOpenSpareConnection()
if possible, starts a spare connection attempt
Definition: HappyConnOpener.cc:833
void CallBack(const CodeContext::Pointer &callbackContext, Fun &&callback)
Definition: CodeContext.h:112
void maybeOpenPrimeConnection()
starts a prime connection attempt if possible or does nothing otherwise
Definition: HappyConnOpener.cc:770
bool concurrencyLimitReached() const
whether opening a spare connection now would violate happy_eyeballs_connect_limit
Definition: HappyConnOpener.cc:302
void enqueue(HappyConnOpener &)
starts managing the job's wait; the job should expect a call back
Definition: HappyConnOpener.cc:151
void updateSpareWaitAfterPrimeFailure()
reacts to a prime attempt failure
Definition: HappyConnOpener.cc:639
bool doneWithSpares(const Comm::Connection ¤tPeer)
whether extractSpare() returns and will continue to return nil
Definition: ResolvedPeers.cc:179
Attempt spare
current connection opening attempt on the spare track (if any)
Definition: HappyConnOpener.h:228
Answer * futureAnswer(const PeerConnectionPointer &)
Definition: HappyConnOpener.cc:471
ResolvedPeersPointer destinations
Candidate paths. Shared with the initiator. May not be finalized yet.
Definition: HappyConnOpener.h:222
virtual bool readyNow(const HappyConnOpener &job) const override
Definition: HappyConnOpener.cc:247
virtual bool readyNow(const HappyConnOpener &) const =0
HappyConnOpener(const ResolvedPeersPointer &, const AsyncCall::Pointer &, HttpRequestPointer &, const time_t aFwdStart, int tries, const AccessLogEntryPointer &al)
Definition: HappyConnOpener.cc:329
bool haveSpare(const Comm::Connection ¤tPeer)
whether extractSpare() would return a non-nil path right now
Definition: ResolvedPeers.cc:159
PeerConnectionPointer extractPrime(const Comm::Connection ¤tPeer)
Definition: ResolvedPeers.cc:118
time_t connectTimeout(const time_t fwdStart) const
Definition: Connection.cc:164
double HappyAbsoluteTime
absolute time in fractional seconds; compatible with current_timed
Definition: HappyConnOpener.h:30
ConnectionPointer cloneProfile() const
Create a new closed Connection with the same configuration as this one.
Definition: Connection.cc:64
void noteGavePrimeItsChance()
reacts to expired happy_eyeballs_connect_timeout
Definition: HappyConnOpener.cc:743
void startConnecting(Attempt &, PeerConnectionPointer &)
starts opening (or reusing) a connection to the given destination
Definition: HappyConnOpener.cc:530
std::list< CbcPointer< HappyConnOpener > > HappySpareWaitList
A FIFO queue of HappyConnOpener jobs waiting to open a spare connection.
Definition: HappyConnOpener.h:27
virtual bool readyNow(const HappyConnOpener &job) const override
Definition: HappyConnOpener.cc:233
virtual bool doneAll() const override
whether positive goal has been reached
Definition: HappyConnOpener.cc:366
#define CallJobHere(debugSection, debugLevel, job, Class, method)
Definition: AsyncJobCalls.h:58
void sendSuccess(const PeerConnectionPointer &conn, bool reused, const char *connKind)
send a successful result to the initiator (if it still needs an answer)
Definition: HappyConnOpener.cc:485
Definition: HappyConnOpener.h:103
bool ranOutOfTimeOrAttempts() const
Check for maximum connection tries and forwarding time restrictions.
Definition: HappyConnOpener.cc:873
void finish()
reacts to a natural attempt completion (successful or otherwise)
Definition: HappyConnOpener.cc:900
bool startedWaiting(const HappyAbsoluteTime lastStart, const int cfgTimeoutMsec) const
Definition: HappyConnOpener.cc:188
HappyOrderEnforcer(const char *aName)
Definition: HappyConnOpener.cc:57
static time_t ForwardTimeout(const time_t fwdStart)
time left to finish the whole forwarding process (which started at fwdStart)
Definition: FwdState.cc:454
Definition: CommCalls.h:181
void jobUsedAllowance()
reacts to HappyConnOpener getting a spare connection opening result
Definition: HappyConnOpener.cc:267
Definition: ResolvedPeers.h:121
HappyAbsoluteTime lastAllowanceStart
the time of the last noteSpareAllowance() call
Definition: HappyConnOpener.cc:138
JobWait< Comm::ConnOpener > connWait
waits for a connection to the peer to be established/opened
Definition: HappyConnOpener.h:175
PeerConnectionPointer extractSpare(const Comm::Connection ¤tPeer)
Definition: ResolvedPeers.cc:129
bool notificationPending
whether HappyConnOpener::noteCandidatesChange() is scheduled to fire
Definition: ResolvedPeers.h:84
Final result (an open connection or an error) sent to the job initiator.
Definition: HappyConnOpener.h:73
Definition: Stream.h:21
Definition: CommCalls.h:110
HappyAbsoluteTime waitEnd_
expected NoteWaitOver() call time (or zero)
Definition: HappyConnOpener.cc:82
bool doneWithPeer(const Comm::Connection ¤tPeer)
whether doneWithPrimes() and doneWithSpares() are true for currentPeer
Definition: ResolvedPeers.cc:191
Definition: HappyConnOpener.cc:54
void start(const JobPointer &aJob, const AsyncCall::Pointer &aCallback)
starts waiting for the given job to call the given callback
Definition: JobWait.h:69
virtual AsyncCall::Pointer notify(const CbcPointer< HappyConnOpener > &)=0
struct SquidConfig::@123 happyEyeballs
void reinstatePath(const PeerConnectionPointer &)
Definition: ResolvedPeers.cc:23
virtual AsyncCall::Pointer notify(const CbcPointer< HappyConnOpener > &) override
Definition: HappyConnOpener.cc:239
bool gotSpareAllowance
whether we have received a permission to open a spare while spares are limited
Definition: HappyConnOpener.h:247
std::ostream & operator<<(std::ostream &os, const HappyConnOpenerAnswer &answer)
reports Answer details (for AsyncCall parameter debugging)
Definition: HappyConnOpener.cc:85
void jobGotInstantAllowance()
Definition: HappyConnOpener.cc:261
bool retriable_
whether we are opening connections for a request that may be resent
Definition: HappyConnOpener.h:253
HttpRequestPointer cause
the request that needs a to-server connection
Definition: HappyConnOpener.h:259
bool reuseOldConnection(PeerConnectionPointer &)
Definition: HappyConnOpener.cc:546
AsyncCall * asyncCall(int aDebugSection, int aDebugLevel, const char *aName, const Dialer &aDialer)
Definition: AsyncCall.h:154
virtual AsyncCall::Pointer notify(const CbcPointer< HappyConnOpener > &) override
Definition: HappyConnOpener.cc:254
void noteSpareConnectDone(const CommConnectCbParams &)
Comm::ConnOpener callback for the spare connection attempt.
Definition: HappyConnOpener.cc:595
Attempt(const CallbackMethod method, const char *methodName)
Definition: HappyConnOpener.cc:893
bool ignoreSpareRestrictions
whether spare connection attempts disregard happy_eyeballs_* settings
Definition: HappyConnOpener.h:244
virtual const char * status() const override
internal cleanup; do not call directly
Definition: HappyConnOpener.cc:432
Definition: errorpage.h:87
void noteSpareAllowance()
reacts to satisfying happy_eyeballs_connect_gap and happy_eyeballs_connect_limit
Definition: HappyConnOpener.cc:751
void noteCandidatesChange()
reacts to changes in the destinations list
Definition: HappyConnOpener.cc:522
void stopWaitingForSpareAllowance()
called when the spare attempt should no longer obey spare connection limits
Definition: HappyConnOpener.cc:668
void cancelSpareWait(const char *reason)
stops waiting for the right conditions to open a spare connection
Definition: HappyConnOpener.cc:679
static void NoteWaitOver(void *raw)
Definition: HappyConnOpener.cc:216
void finalize(const Comm::ConnectionPointer &conn)
upgrade stored peer selection details with a matching actual connection
Definition: ResolvedPeers.h:138
void(HappyConnOpener::*)(const CommConnectCbParams &) CallbackMethod
HappyConnOpener method implementing a ConnOpener callback.
Definition: HappyConnOpener.h:160
void eventAdd(const char *name, EVH *func, void *arg, double when, int weight, bool cbdata)
Definition: event.cc:107
HappySpareWait spareWaiting
preconditions for an attempt to open a spare connection
Definition: HappyConnOpener.h:235
AsyncCall::Pointer callback_
handler to be called on connection completion.
Definition: HappyConnOpener.h:219
void GetMarkingsToServer(HttpRequest *request, Comm::Connection &conn)
Definition: FwdState.cc:1603
enforces happy_eyeballs_connect_gap and happy_eyeballs_connect_limit
Definition: HappyConnOpener.cc:112
void handleConnOpenerAnswer(Attempt &, const CommConnectCbParams &, const char *connDescription)
prime/spare-agnostic processing of a Comm::ConnOpener result
Definition: HappyConnOpener.cc:606
void sendFailure()
inform the initiator about our failure to connect (if needed)
Definition: HappyConnOpener.cc:507
void openFreshConnection(Attempt &, PeerConnectionPointer &)
Definition: HappyConnOpener.cc:563