]>
Commit | Line | Data |
---|---|---|
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 | |
38 | CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand); | |
39 | ||
10cefb7b | 40 | Ipc::Strand::Strand(): |
f53969cc SM |
41 | Port(MakeAddr(strandAddrLabel, KidIdentifier)), |
42 | isRegistered(false) | |
10cefb7b | 43 | { |
44 | } | |
45 | ||
46 | void Ipc::Strand::start() | |
47 | { | |
ba568924 AR |
48 | Port::start(); |
49 | registerSelf(); | |
10cefb7b | 50 | } |
51 | ||
ba568924 | 52 | void 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 | 61 | void 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 |
119 | void |
120 | Ipc::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 |
133 | void 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 | ||
140 | void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response) | |
141 | { | |
142 | Mgr::Forwarder::HandleRemoteAck(response.requestId); | |
143 | } | |
144 | ||
f738d783 | 145 | #if SQUID_SNMP |
51ea0904 CT |
146 | void 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 | ||
152 | void 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 | 159 | void 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 |