]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ipc/Strand.cc
Merged from parent (large-rock r12530 including trunk r12732; v3.3.3+).
[thirdparty/squid.git] / src / ipc / Strand.cc
CommitLineData
10cefb7b 1/*
10cefb7b 2 * DEBUG: section 54 Interprocess Communication
3 *
4 */
5
f7f3304a 6#include "squid.h"
e0d28505 7#include "base/Subscription.h"
a67d2b2e 8#include "base/TextException.h"
e0d28505 9#include "comm/Connection.h"
582c2af2 10#include "globals.h"
10cefb7b 11#include "ipc/Strand.h"
8822ebee 12#include "ipc/StrandCoord.h"
1bac0258 13#include "ipc/Messages.h"
0d0bce6a 14#include "ipc/SharedListen.h"
9a51593d 15#include "ipc/StrandSearch.h"
10cefb7b 16#include "ipc/Kids.h"
8822ebee
AR
17#include "mgr/Request.h"
18#include "mgr/Response.h"
19#include "mgr/Forwarder.h"
254912f3 20#include "SwapDir.h" /* XXX: scope boundary violation */
8822ebee 21#include "CacheManager.h"
fbb7e179
DK
22#if USE_DISKIO_IPCIO
23#include "DiskIO/IpcIo/IpcIoFile.h" /* XXX: scope boundary violation */
24#endif
f738d783 25#if SQUID_SNMP
d6e3ad20
CT
26#include "snmp/Forwarder.h"
27#include "snmp/Request.h"
28#include "snmp/Response.h"
f738d783 29#endif
10cefb7b 30
31CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand);
32
10cefb7b 33Ipc::Strand::Strand():
5667a628
AR
34 Port(MakeAddr(strandAddrPfx, KidIdentifier)),
35 isRegistered(false)
10cefb7b 36{
37}
38
39void Ipc::Strand::start()
40{
ba568924
AR
41 Port::start();
42 registerSelf();
10cefb7b 43}
44
ba568924 45void Ipc::Strand::registerSelf()
10cefb7b 46{
47 debugs(54, 6, HERE);
ba568924 48 Must(!isRegistered);
254912f3
AR
49
50 HereIamMessage ann(StrandCoord(KidIdentifier, getpid()));
1bac0258 51 TypedMsgHdr message;
254912f3 52 ann.pack(message);
1bac0258 53 SendMessage(coordinatorAddr, message);
ba568924 54 setTimeout(6, "Ipc::Strand::timeoutHandler"); // TODO: make 6 configurable?
10cefb7b 55}
56
1bac0258 57void Ipc::Strand::receive(const TypedMsgHdr &message)
10cefb7b 58{
7230e9c7 59 debugs(54, 6, HERE << message.type());
10cefb7b 60 switch (message.type()) {
61
ba568924 62 case mtRegistration:
254912f3 63 handleRegistrationResponse(HereIamMessage(message));
10cefb7b 64 break;
65
0d0bce6a
AR
66 case mtSharedListenResponse:
67 SharedListenJoined(SharedListenResponse(message));
68 break;
69
fbb7e179 70#if USE_DISKIO_IPCIO
9a51593d
DK
71 case mtStrandSearchResponse:
72 IpcIoFile::HandleOpenResponse(StrandSearchResponse(message));
254912f3
AR
73 break;
74
9a51593d
DK
75 case mtIpcIoNotification:
76 IpcIoFile::HandleNotification(message);
a1c98830 77 break;
fbb7e179 78#endif /* USE_DISKIO_IPCIO */
254912f3 79
3595fd68
CT
80 case mtCacheMgrRequest: {
81 const Mgr::Request req(message);
82 handleCacheMgrRequest(req);
83 }
84 break;
8822ebee 85
3595fd68
CT
86 case mtCacheMgrResponse: {
87 const Mgr::Response resp(message);
88 handleCacheMgrResponse(resp);
89 }
90 break;
8822ebee 91
f738d783 92#if SQUID_SNMP
3595fd68
CT
93 case mtSnmpRequest: {
94 const Snmp::Request req(message);
95 handleSnmpRequest(req);
96 }
97 break;
51ea0904 98
3595fd68
CT
99 case mtSnmpResponse: {
100 const Snmp::Response resp(message);
101 handleSnmpResponse(resp);
102 }
103 break;
f738d783 104#endif
8822ebee 105
10cefb7b 106 default:
e0236918 107 debugs(54, DBG_IMPORTANT, HERE << "Unhandled message type: " << message.type());
10cefb7b 108 break;
109 }
110}
111
254912f3 112void Ipc::Strand::handleRegistrationResponse(const HereIamMessage &msg)
10cefb7b 113{
ba568924 114 // handle registration response from the coordinator; it could be stale
254912f3 115 if (msg.strand.kidId == KidIdentifier && msg.strand.pid == getpid()) {
ba568924
AR
116 debugs(54, 6, "kid" << KidIdentifier << " registered");
117 clearTimeout(); // we are done
118 } else {
119 // could be an ACK to the registration message of our dead predecessor
120 debugs(54, 6, "kid" << KidIdentifier << " is not yet registered");
121 // keep listening, with a timeout
10cefb7b 122 }
123}
124
8822ebee
AR
125void Ipc::Strand::handleCacheMgrRequest(const Mgr::Request& request)
126{
127 Mgr::Action::Pointer action =
128 CacheManager::GetInstance()->createRequestedAction(request.params);
129 action->respond(request);
130}
131
132void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response)
133{
134 Mgr::Forwarder::HandleRemoteAck(response.requestId);
135}
136
f738d783 137#if SQUID_SNMP
51ea0904
CT
138void Ipc::Strand::handleSnmpRequest(const Snmp::Request& request)
139{
140 debugs(54, 6, HERE);
141 Snmp::SendResponse(request.requestId, request.pdu);
142}
143
144void Ipc::Strand::handleSnmpResponse(const Snmp::Response& response)
145{
146 debugs(54, 6, HERE);
147 Snmp::Forwarder::HandleRemoteAck(response.requestId);
148}
f738d783 149#endif
51ea0904 150
ba568924 151void Ipc::Strand::timedout()
10cefb7b 152{
ba568924
AR
153 debugs(54, 6, HERE << isRegistered);
154 if (!isRegistered)
155 fatalf("kid%d registration timed out", KidIdentifier);
10cefb7b 156}