]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ipc/Strand.cc
Amos requests
[thirdparty/squid.git] / src / ipc / Strand.cc
CommitLineData
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
25CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand);
26
27
28Ipc::Strand::Strand():
5667a628
AR
29 Port(MakeAddr(strandAddrPfx, KidIdentifier)),
30 isRegistered(false)
10cefb7b 31{
32}
33
34void Ipc::Strand::start()
35{
ba568924
AR
36 Port::start();
37 registerSelf();
10cefb7b 38}
39
ba568924 40void 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 50void 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 87void 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
100void 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
107void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response)
108{
109 Mgr::Forwarder::HandleRemoteAck(response.requestId);
110}
111
f738d783 112#if SQUID_SNMP
51ea0904
CT
113void Ipc::Strand::handleSnmpRequest(const Snmp::Request& request)
114{
115 debugs(54, 6, HERE);
116 Snmp::SendResponse(request.requestId, request.pdu);
117}
118
119void 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 126void 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}