]>
Commit | Line | Data |
---|---|---|
719815a0 | 1 | /* |
b8ae064d | 2 | * Copyright (C) 1996-2023 The Squid Software Foundation and contributors |
719815a0 AJ |
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 | #include "squid.h" | |
10 | #include "acl/Gadgets.h" | |
11 | #include "CachePeer.h" | |
719815a0 | 12 | #include "defines.h" |
022dbabd | 13 | #include "neighbors.h" |
719815a0 AJ |
14 | #include "NeighborTypeDomainList.h" |
15 | #include "pconn.h" | |
97269a72 | 16 | #include "PeerDigest.h" |
719815a0 | 17 | #include "PeerPoolMgr.h" |
5f5d319e | 18 | #include "SquidConfig.h" |
a555a85b | 19 | #include "util.h" |
719815a0 AJ |
20 | |
21 | CBDATA_CLASS_INIT(CachePeer); | |
22 | ||
a555a85b AR |
23 | CachePeer::CachePeer(const char * const hostname): |
24 | name(xstrdup(hostname)), | |
25 | host(xstrdup(hostname)) | |
26 | { | |
27 | Tolower(host); // but .name preserves original spelling | |
28 | } | |
29 | ||
719815a0 AJ |
30 | CachePeer::~CachePeer() |
31 | { | |
32 | xfree(name); | |
33 | xfree(host); | |
34 | ||
719815a0 AJ |
35 | while (NeighborTypeDomainList *l = typelist) { |
36 | typelist = l->next; | |
37 | xfree(l->domain); | |
38 | xfree(l); | |
39 | } | |
40 | ||
41 | aclDestroyAccessList(&access); | |
42 | ||
43 | #if USE_CACHE_DIGESTS | |
97269a72 EB |
44 | void *digestTmp = nullptr; |
45 | if (cbdataReferenceValidDone(digest, &digestTmp)) | |
46 | peerDigestNotePeerGone(static_cast<PeerDigest *>(digestTmp)); | |
719815a0 AJ |
47 | xfree(digest_url); |
48 | #endif | |
49 | ||
719815a0 AJ |
50 | xfree(login); |
51 | ||
52 | delete standby.pool; | |
53 | ||
54 | // the mgr job will notice that its owner is gone and stop | |
55 | PeerPoolMgr::Checkpoint(standby.mgr, "peer gone"); | |
56 | ||
57 | xfree(domain); | |
719815a0 | 58 | } |
7dfc5092 | 59 | |
022dbabd EB |
60 | void |
61 | CachePeer::noteSuccess() | |
62 | { | |
63 | if (!tcp_up) { | |
64 | debugs(15, 2, "connection to " << *this << " succeeded"); | |
65 | tcp_up = connect_fail_limit; // NP: so peerAlive() works properly. | |
66 | peerAlive(this); | |
67 | } else { | |
68 | tcp_up = connect_fail_limit; | |
69 | } | |
70 | } | |
71 | ||
022dbabd EB |
72 | // TODO: Require callers to detail failures instead of using one (and often |
73 | // misleading!) "connection failed" phrase for all of them. | |
74 | /// noteFailure() helper for handling failures attributed to this peer | |
75 | void | |
2e7dea3c | 76 | CachePeer::noteFailure() |
022dbabd EB |
77 | { |
78 | stats.last_connect_failure = squid_curtime; | |
79 | if (tcp_up > 0) | |
80 | --tcp_up; | |
81 | ||
82 | const auto consideredAliveByAdmin = (stats.logged_state == PEER_ALIVE); | |
83 | const auto level = consideredAliveByAdmin ? DBG_IMPORTANT : 2; | |
84 | debugs(15, level, "ERROR: Connection to " << *this << " failed"); | |
85 | ||
86 | if (consideredAliveByAdmin) { | |
87 | if (!tcp_up) { | |
88 | debugs(15, DBG_IMPORTANT, "Detected DEAD " << neighborTypeStr(this) << ": " << name); | |
89 | stats.logged_state = PEER_DEAD; | |
90 | } else { | |
91 | debugs(15, 2, "additional failures needed to mark this cache_peer DEAD: " << tcp_up); | |
92 | } | |
93 | } else { | |
94 | assert(!tcp_up); | |
95 | debugs(15, 2, "cache_peer " << *this << " is still DEAD"); | |
96 | } | |
97 | } | |
98 | ||
a555a85b AR |
99 | void |
100 | CachePeer::rename(const char * const newName) | |
101 | { | |
102 | if (!newName || !*newName) | |
103 | throw TextException("cache_peer name=value cannot be empty", Here()); | |
104 | ||
105 | xfree(name); | |
106 | name = xstrdup(newName); | |
107 | } | |
108 | ||
5f5d319e FC |
109 | time_t |
110 | CachePeer::connectTimeout() const | |
111 | { | |
112 | if (connect_timeout_raw > 0) | |
113 | return connect_timeout_raw; | |
114 | return Config.Timeout.peer_connect; | |
115 | } | |
116 | ||
a555a85b AR |
117 | std::ostream & |
118 | operator <<(std::ostream &os, const CachePeer &p) | |
119 | { | |
120 | return os << p.name; | |
121 | } | |
122 |