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