]>
Commit | Line | Data |
---|---|---|
10cefb7b | 1 | /* |
77b1029d | 2 | * Copyright (C) 1996-2020 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 | |
37 | CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand); | |
38 | ||
10cefb7b | 39 | Ipc::Strand::Strand(): |
f53969cc SM |
40 | Port(MakeAddr(strandAddrLabel, KidIdentifier)), |
41 | isRegistered(false) | |
10cefb7b | 42 | { |
43 | } | |
44 | ||
45 | void Ipc::Strand::start() | |
46 | { | |
ba568924 AR |
47 | Port::start(); |
48 | registerSelf(); | |
10cefb7b | 49 | } |
50 | ||
ba568924 | 51 | void 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 | 63 | void 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 | 122 | void 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 |
135 | void 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 | ||
142 | void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response) | |
143 | { | |
144 | Mgr::Forwarder::HandleRemoteAck(response.requestId); | |
145 | } | |
146 | ||
f738d783 | 147 | #if SQUID_SNMP |
51ea0904 CT |
148 | void Ipc::Strand::handleSnmpRequest(const Snmp::Request& request) |
149 | { | |
150 | debugs(54, 6, HERE); | |
151 | Snmp::SendResponse(request.requestId, request.pdu); | |
152 | } | |
153 | ||
154 | void 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 | 161 | void 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 |