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