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