PeerSelectState.h
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 #ifndef SQUID_PEERSELECTSTATE_H
10 #define SQUID_PEERSELECTSTATE_H
11 
12 #include "AccessLogEntry.h"
13 #include "acl/Checklist.h"
14 #include "base/CbcPointer.h"
15 #include "comm/forward.h"
16 #include "hier_code.h"
17 #include "ip/Address.h"
18 #include "ipcache.h"
19 #include "mem/forward.h"
20 #include "PingData.h"
21 
22 class ErrorState;
23 class HtcpReplyData;
24 class HttpRequest;
25 class icp_common_t;
26 class StoreEntry;
27 
28 void peerSelectInit(void);
29 
32 {
33 public:
34  virtual ~PeerSelectionInitiator() = default;
35 
37  virtual void noteDestination(Comm::ConnectionPointer path) = 0;
38 
42  virtual void noteDestinationsEnd(ErrorState *error) = 0;
43 
45  bool subscribed = false;
46 
47  /* protected: */
52 };
53 
54 class FwdServer;
55 
59 {
61 
62 public:
64  virtual ~PeerSelector() override;
65 
66  /* Dns::IpReceiver API */
67  virtual void noteIp(const Ip::Address &ip) override;
68  virtual void noteIps(const Dns::CachedIps *ips, const Dns::LookupDetails &details) override;
69  virtual void noteLookup(const Dns::LookupDetails &details) override;
70 
71  // Produce a URL for display identifying the transaction we are
72  // trying to locate a peer for.
73  const SBuf url() const;
74 
76  PeerSelectionInitiator *interestedInitiator();
77 
79  bool wantsMoreDestinations() const;
80 
82  void handlePath(const Comm::ConnectionPointer &path, FwdServer &fs);
83 
85  void selectMore();
86 
90 
91  void *peerCountMcastPeerXXX = nullptr;
92 
94 
95 protected:
96  bool selectionAborted();
97 
98  void handlePingTimeout();
99  void handleIcpReply(CachePeer*, const peer_t, icp_common_t *header);
100  void handleIcpParentMiss(CachePeer*, icp_common_t*);
101 #if USE_HTCP
102  void handleHtcpParentMiss(CachePeer*, HtcpReplyData*);
103  void handleHtcpReply(CachePeer*, const peer_t, HtcpReplyData*);
104 #endif
105 
106  int checkNetdbDirect();
107  void checkAlwaysDirectDone(const allow_t answer);
108  void checkNeverDirectDone(const allow_t answer);
109 
110  void selectSomeNeighbor();
111  void selectSomeNeighborReplies();
112  void selectSomeDirect();
113  void selectSomeParent();
114  void selectAllParents();
115  void selectPinned();
116 
117  void addSelection(CachePeer*, const hier_code);
118 
119  void resolveSelected();
120 
125 
126 private:
129  int direct; // TODO: fold always_direct/never_direct/prefer_direct into this now that ACL can do a multi-state result.
130  size_t foundPaths = 0;
132 
134 
135  /*
136  * Why are these Ip::Address instead of CachePeer *? Because a
137  * CachePeer structure can become invalid during the CachePeer selection
138  * phase, specifically after a reconfigure. Thus we need to lookup
139  * the CachePeer * based on the address when we are finally ready to
140  * reference the CachePeer structure.
141  */
142 
144 
146  /*
147  * ->hit can be CachePeer* because it should only be
148  * accessed during the thread when it is set
149  */
153 
155  Initiator initiator_;
156 
158 };
159 
160 #endif /* SQUID_PEERSELECTSTATE_H */
161 
HttpRequest * request
an interface for receiving IP::Addresses from nbgethostbyname()
Definition: ipcache.h:194
ErrorState * lastError
ping_data ping
Definition: Acl.h:113
Definition: SBuf.h:86
struct _request * request(char *urlin)
Definition: tcp-banger2.c:291
void error(char *format,...)
ACLChecklist * acl_checklist
FwdServer * servers
a linked list of (unresolved) selected peers
encapsulates DNS lookup results
Definition: LookupDetails.h:20
static EVH HandlePingTimeout
static ACLCB CheckNeverDirectDone
Interface for those who need a list of peers to forward a request to.
const InstanceId< PeerSelector > id
unique identification in worker log
Ip::Address closest_parent_miss
allow_t always_direct
static IRCB HandlePingReply
StoreEntry * entry
void EVH(void *)
Definition: event.h:19
bool subscribed
whether noteDestination() and noteDestinationsEnd() calls are allowed
virtual void noteDestination(Comm::ConnectionPointer path)=0
called when a new unique destination has been found
CachePeer * hit
void IRCB(CachePeer *, peer_t, AnyP::ProtocolType, void *, void *data)
Definition: typedefs.h:22
void peerSelectInit(void)
Definition: peer_select.cc:777
Initiator initiator_
recipient of the destinations we select; use interestedInitiator() to access
AccessLogEntry::Pointer al
info for the future access.log entry
hier_code
Definition: hier_code.h:12
virtual void noteDestinationsEnd(ErrorState *error)=0
Ip::Address first_parent_miss
peer_t
Definition: enums.h:27
#define CBDATA_CHILD(type)
Definition: cbdata.h:307
CbcPointer< PeerSelectionInitiator > Initiator
void startSelectingDestinations(HttpRequest *request, const AccessLogEntry::Pointer &ale, StoreEntry *entry)
Definition: peer_select.cc:193
allow_t never_direct
void ACLCB(allow_t, void *)
ACL checklist callback.
Definition: Checklist.h:19
static ACLCB CheckAlwaysDirectDone
virtual ~PeerSelectionInitiator()=default

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors