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