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