]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ipc/Strand.cc
Merge 3p2-rock.
[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"
254912f3
AR
18#include "DiskIO/IpcIo/IpcIoFile.h" /* XXX: scope boundary violation */
19#include "SwapDir.h" /* XXX: scope boundary violation */
8822ebee 20#include "CacheManager.h"
10cefb7b 21
22
23CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand);
24
25
26Ipc::Strand::Strand():
5667a628
AR
27 Port(MakeAddr(strandAddrPfx, KidIdentifier)),
28 isRegistered(false)
10cefb7b 29{
30}
31
32void Ipc::Strand::start()
33{
ba568924
AR
34 Port::start();
35 registerSelf();
10cefb7b 36}
37
ba568924 38void Ipc::Strand::registerSelf()
10cefb7b 39{
40 debugs(54, 6, HERE);
ba568924 41 Must(!isRegistered);
254912f3
AR
42
43 HereIamMessage ann(StrandCoord(KidIdentifier, getpid()));
1bac0258 44 TypedMsgHdr message;
254912f3 45 ann.pack(message);
1bac0258 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:
254912f3 56 handleRegistrationResponse(HereIamMessage(message));
10cefb7b 57 break;
58
0d0bce6a
AR
59 case mtSharedListenResponse:
60 SharedListenJoined(SharedListenResponse(message));
61 break;
62
254912f3
AR
63 case mtIpcIoRequest:
64 IpcIoFile::HandleRequest(IpcIoRequest(message));
65 break;
66
67 case mtIpcIoResponse:
68 IpcIoFile::HandleResponse(message);
69 break;
70
8822ebee
AR
71 case mtCacheMgrRequest:
72 handleCacheMgrRequest(Mgr::Request(message));
73 break;
74
75 case mtCacheMgrResponse:
76 handleCacheMgrResponse(Mgr::Response(message));
77 break;
78
10cefb7b 79 default:
7230e9c7 80 debugs(54, 1, HERE << "Unhandled message type: " << message.type());
10cefb7b 81 break;
82 }
83}
84
254912f3 85void Ipc::Strand::handleRegistrationResponse(const HereIamMessage &msg)
10cefb7b 86{
ba568924 87 // handle registration response from the coordinator; it could be stale
254912f3 88 if (msg.strand.kidId == KidIdentifier && msg.strand.pid == getpid()) {
ba568924
AR
89 debugs(54, 6, "kid" << KidIdentifier << " registered");
90 clearTimeout(); // we are done
91 } else {
92 // could be an ACK to the registration message of our dead predecessor
93 debugs(54, 6, "kid" << KidIdentifier << " is not yet registered");
94 // keep listening, with a timeout
10cefb7b 95 }
96}
97
8822ebee
AR
98void Ipc::Strand::handleCacheMgrRequest(const Mgr::Request& request)
99{
100 Mgr::Action::Pointer action =
101 CacheManager::GetInstance()->createRequestedAction(request.params);
102 action->respond(request);
103}
104
105void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response)
106{
107 Mgr::Forwarder::HandleRemoteAck(response.requestId);
108}
109
ba568924 110void Ipc::Strand::timedout()
10cefb7b 111{
ba568924
AR
112 debugs(54, 6, HERE << isRegistered);
113 if (!isRegistered)
114 fatalf("kid%d registration timed out", KidIdentifier);
10cefb7b 115}