]>
Commit | Line | Data |
---|---|---|
a011edee | 1 | /* |
b8ae064d | 2 | * Copyright (C) 1996-2023 The Squid Software Foundation and contributors |
a011edee | 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. | |
a011edee FC |
7 | */ |
8 | ||
ff9d9458 FC |
9 | #ifndef SQUID_SRC_CACHEPEER_H |
10 | #define SQUID_SRC_CACHEPEER_H | |
bbc27441 | 11 | |
6f58d7d7 | 12 | #include "acl/forward.h" |
e8dca475 | 13 | #include "base/CbcPointer.h" |
a011edee | 14 | #include "enums.h" |
022dbabd | 15 | #include "http/StatusCode.h" |
a011edee FC |
16 | #include "icp_opcode.h" |
17 | #include "ip/Address.h" | |
cdfb670c AJ |
18 | #include "security/PeerOptions.h" |
19 | ||
a555a85b AR |
20 | #include <iosfwd> |
21 | ||
a7458115 FC |
22 | //TODO: remove, it is unconditionally defined and always used. |
23 | #define PEER_MULTICAST_SIBLINGS 1 | |
24 | ||
5844d003 | 25 | class NeighborTypeDomainList; |
e8dca475 | 26 | class PconnPool; |
a011edee | 27 | class PeerDigest; |
e8dca475 | 28 | class PeerPoolMgr; |
a011edee | 29 | |
1b2f0924 FC |
30 | class CachePeer |
31 | { | |
719815a0 AJ |
32 | CBDATA_CLASS(CachePeer); |
33 | ||
a011edee | 34 | public: |
a555a85b | 35 | explicit CachePeer(const char *hostname); |
719815a0 AJ |
36 | ~CachePeer(); |
37 | ||
022dbabd EB |
38 | /// reacts to a successful establishment of a connection to this cache_peer |
39 | void noteSuccess(); | |
40 | ||
2e7dea3c AR |
41 | /// reacts to a failed attempt to establish a connection to this cache_peer |
42 | void noteFailure(); | |
022dbabd | 43 | |
a555a85b AR |
44 | /// (re)configure cache_peer name=value |
45 | void rename(const char *); | |
46 | ||
5f5d319e FC |
47 | /// \returns the effective connect timeout for the given peer |
48 | time_t connectTimeout() const; | |
49 | ||
2e24d0bf | 50 | /// n-th cache_peer directive, starting with 1 |
a85952ab | 51 | u_int index = 0; |
a555a85b AR |
52 | |
53 | /// cache_peer name (if explicitly configured) or hostname (otherwise). | |
54 | /// Unique across already configured cache_peers in the current configuration. | |
a555a85b AR |
55 | /// The value may change during CachePeer configuration. |
56 | /// The value affects various peer selection hashes (e.g., carp.hash). | |
57 | /// Preserves configured spelling (i.e. does not lower letters case). | |
58 | /// Never nil. | |
a85952ab | 59 | char *name = nullptr; |
a555a85b | 60 | |
e3732982 EB |
61 | /// The lowercase version of the configured cache_peer hostname. |
62 | /// May not be unique among cache_peers. | |
a555a85b | 63 | /// Never nil. |
a85952ab | 64 | char *host = nullptr; |
a555a85b | 65 | |
a85952ab | 66 | peer_t type = PEER_NONE; |
a011edee FC |
67 | |
68 | Ip::Address in_addr; | |
69 | ||
70 | struct { | |
a85952ab | 71 | int pings_sent = 0; |
72 | int pings_acked = 0; | |
73 | int fetches = 0; | |
74 | int rtt = 0; | |
75 | int ignored_replies = 0; | |
76 | int n_keepalives_sent = 0; | |
77 | int n_keepalives_recv = 0; | |
78 | time_t probe_start = 0; | |
79 | time_t last_query = 0; | |
80 | time_t last_reply = 0; | |
81 | time_t last_connect_failure = 0; | |
82 | time_t last_connect_probe = 0; | |
83 | int logged_state = PEER_ALIVE; ///< so we can print dead/revived msgs | |
84 | int conn_open = 0; ///< current opened connections | |
a011edee FC |
85 | } stats; |
86 | ||
a85952ab | 87 | struct icp_ { |
88 | icp_() { memset(&counts, 0, sizeof(counts)); } | |
89 | int version = ICP_VERSION_CURRENT; | |
a011edee | 90 | int counts[ICP_END+1]; |
a85952ab | 91 | unsigned short port = CACHE_ICP_PORT; |
a011edee FC |
92 | } icp; |
93 | ||
94 | #if USE_HTCP | |
95 | struct { | |
a85952ab | 96 | double version = 0.0; |
97 | int counts[2] = {0, 0}; | |
98 | unsigned short port = 0; | |
a011edee FC |
99 | } htcp; |
100 | #endif | |
101 | ||
a85952ab | 102 | unsigned short http_port = CACHE_HTTP_PORT; |
103 | NeighborTypeDomainList *typelist = nullptr; | |
104 | acl_access *access = nullptr; | |
a011edee FC |
105 | |
106 | struct { | |
a85952ab | 107 | bool proxy_only = false; |
108 | bool no_query = false; | |
109 | bool background_ping = false; | |
110 | bool no_digest = false; | |
111 | bool default_parent = false; | |
112 | bool roundrobin = false; | |
113 | bool weighted_roundrobin = false; | |
114 | bool mcast_responder = false; | |
115 | bool closest_only = false; | |
a011edee | 116 | #if USE_HTCP |
a85952ab | 117 | bool htcp = false; |
118 | bool htcp_oldsquid = false; | |
119 | bool htcp_no_clr = false; | |
120 | bool htcp_no_purge_clr = false; | |
121 | bool htcp_only_clr = false; | |
122 | bool htcp_forward_clr = false; | |
a011edee | 123 | #endif |
a85952ab | 124 | bool no_netdb_exchange = false; |
a011edee | 125 | #if USE_DELAY_POOLS |
a85952ab | 126 | bool no_delay = false; |
a011edee | 127 | #endif |
a85952ab | 128 | bool allow_miss = false; |
129 | bool carp = false; | |
a011edee | 130 | struct { |
a85952ab | 131 | bool set = false; //If false, whole url is to be used. Overrides others |
132 | bool scheme = false; | |
133 | bool host = false; | |
134 | bool port = false; | |
135 | bool path = false; | |
136 | bool params = false; | |
a011edee FC |
137 | } carp_key; |
138 | #if USE_AUTH | |
a85952ab | 139 | bool userhash = false; |
a011edee | 140 | #endif |
a85952ab | 141 | bool sourcehash = false; |
142 | bool originserver = false; | |
143 | bool no_tproxy = false; | |
a011edee | 144 | #if PEER_MULTICAST_SIBLINGS |
a85952ab | 145 | bool mcast_siblings = false; |
a011edee | 146 | #endif |
a85952ab | 147 | bool auth_no_keytab = false; |
a011edee FC |
148 | } options; |
149 | ||
a85952ab | 150 | int weight = 1; |
151 | int basetime = 0; | |
a011edee FC |
152 | |
153 | struct { | |
a85952ab | 154 | double avg_n_members = 0.0; |
155 | int n_times_counted = 0; | |
156 | int n_replies_expected = 0; | |
157 | int ttl = 0; | |
158 | int id = 0; | |
a011edee FC |
159 | |
160 | struct { | |
a85952ab | 161 | bool count_event_pending = false; |
162 | bool counting = false; | |
a011edee FC |
163 | } flags; |
164 | } mcast; | |
a011edee | 165 | |
a85952ab | 166 | #if USE_CACHE_DIGESTS |
167 | PeerDigest *digest = nullptr; | |
168 | char *digest_url = nullptr; | |
a011edee FC |
169 | #endif |
170 | ||
92c4f623 AR |
171 | /// The number of failures sufficient to stop selecting this cache_peer. All |
172 | /// cache_peer selection algorithms skip cache_peers with 0 tcp_up values. | |
173 | /// The initial 0 value prevents unprobed cache_peers from being selected. | |
174 | int tcp_up = 0; | |
175 | ||
883b9a4d AR |
176 | /// whether to do another TCP probe after current TCP probes |
177 | bool reprobe = false; | |
a011edee FC |
178 | |
179 | Ip::Address addresses[10]; | |
a85952ab | 180 | int n_addresses = 0; |
181 | int rr_count = 0; | |
a85952ab | 182 | int testing_now = 0; |
a011edee FC |
183 | |
184 | struct { | |
a85952ab | 185 | unsigned int hash = 0; |
186 | double load_multiplier = 0.0; | |
187 | double load_factor = 0.0; ///< normalized weight value | |
a011edee FC |
188 | } carp; |
189 | #if USE_AUTH | |
190 | struct { | |
a85952ab | 191 | unsigned int hash = 0; |
192 | double load_multiplier = 0.0; | |
193 | double load_factor = 0.0; ///< normalized weight value | |
a011edee FC |
194 | } userhash; |
195 | #endif | |
196 | struct { | |
a85952ab | 197 | unsigned int hash = 0; |
198 | double load_multiplier = 0.0; | |
199 | double load_factor = 0.0; ///< normalized weight value | |
a011edee FC |
200 | } sourcehash; |
201 | ||
a85952ab | 202 | char *login = nullptr; /* Proxy authorization */ |
5f5d319e | 203 | time_t connect_timeout_raw = 0; ///< connect_timeout; use connectTimeout() instead! |
a85952ab | 204 | int connect_fail_limit = 0; |
205 | int max_conn = 0; | |
206 | ||
207 | /// optional "cache_peer standby=limit" feature | |
e8dca475 | 208 | struct { |
a85952ab | 209 | PconnPool *pool = nullptr; ///< idle connection pool for this peer |
210 | CbcPointer<PeerPoolMgr> mgr; ///< pool manager | |
211 | int limit = 0; ///< the limit itself | |
212 | bool waitingForClose = false; ///< a conn must close before we open a standby conn | |
213 | } standby; | |
214 | ||
215 | char *domain = nullptr; ///< Forced domain | |
a011edee | 216 | |
cdfb670c AJ |
217 | /// security settings for peer connection |
218 | Security::PeerOptions secure; | |
900daee3 | 219 | Security::ContextPointer sslContext; |
5d9a65df | 220 | Security::SessionStatePointer sslSession; |
a011edee | 221 | |
a85952ab | 222 | int front_end_https = 0; ///< 0 - off, 1 - on, 2 - auto |
223 | int connection_auth = 2; ///< 0 - off, 1 - on, 2 - auto | |
022dbabd EB |
224 | |
225 | private: | |
226 | void countFailure(); | |
a011edee FC |
227 | }; |
228 | ||
022dbabd EB |
229 | /// reacts to a successful establishment of a connection to an origin server or cache_peer |
230 | /// \param peer nil if Squid established a connection to an origin server | |
231 | inline void | |
232 | NoteOutgoingConnectionSuccess(CachePeer * const peer) | |
233 | { | |
234 | if (peer) | |
235 | peer->noteSuccess(); | |
236 | } | |
237 | ||
2e7dea3c | 238 | /// reacts to a failed attempt to establish a connection to an origin server or cache_peer |
022dbabd | 239 | /// \param peer nil if the connection is to an origin server |
022dbabd | 240 | inline void |
2e7dea3c | 241 | NoteOutgoingConnectionFailure(CachePeer * const peer) |
022dbabd EB |
242 | { |
243 | if (peer) | |
2e7dea3c | 244 | peer->noteFailure(); |
022dbabd EB |
245 | } |
246 | ||
a555a85b AR |
247 | /// identify the given cache peer in cache.log messages and such |
248 | std::ostream &operator <<(std::ostream &, const CachePeer &); | |
249 | ||
ff9d9458 | 250 | #endif /* SQUID_SRC_CACHEPEER_H */ |
70ac5b29 | 251 |