]>
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" | |
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 | ||
23 | CBDATA_NAMESPACED_CLASS_INIT(Ipc, Strand); | |
24 | ||
25 | ||
26 | Ipc::Strand::Strand(): | |
5667a628 AR |
27 | Port(MakeAddr(strandAddrPfx, KidIdentifier)), |
28 | isRegistered(false) | |
10cefb7b | 29 | { |
30 | } | |
31 | ||
32 | void Ipc::Strand::start() | |
33 | { | |
ba568924 AR |
34 | Port::start(); |
35 | registerSelf(); | |
10cefb7b | 36 | } |
37 | ||
ba568924 | 38 | void 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 | 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: |
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 | 85 | void 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 |
98 | void 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 | ||
105 | void Ipc::Strand::handleCacheMgrResponse(const Mgr::Response& response) | |
106 | { | |
107 | Mgr::Forwarder::HandleRemoteAck(response.requestId); | |
108 | } | |
109 | ||
ba568924 | 110 | void 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 | } |