]>
Commit | Line | Data |
---|---|---|
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 | |
32 | CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand); | |
33 | ||
34 | ||
35 | Ipc::Strand::Strand(): | |
5667a628 AR |
36 | Port(MakeAddr(strandAddrPfx, KidIdentifier)), |
37 | isRegistered(false) | |
10cefb7b | 38 | { |
39 | } | |
40 | ||
41 | void Ipc::Strand::start() | |
42 | { | |
ba568924 AR |
43 | Port::start(); |
44 | registerSelf(); | |
10cefb7b | 45 | } |
46 | ||
ba568924 | 47 | void 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 | 59 | void 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 | 114 | void 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 |
127 | void 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 | ||
134 | void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response) | |
135 | { | |
136 | Mgr::Forwarder::HandleRemoteAck(response.requestId); | |
137 | } | |
138 | ||
f738d783 | 139 | #if SQUID_SNMP |
51ea0904 CT |
140 | void Ipc::Strand::handleSnmpRequest(const Snmp::Request& request) |
141 | { | |
142 | debugs(54, 6, HERE); | |
143 | Snmp::SendResponse(request.requestId, request.pdu); | |
144 | } | |
145 | ||
146 | void 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 | 153 | void 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 | } |