@@ -44,10 +44,12 @@ namespace graybat {
4444 using Message = graybat::communicationPolicy::socket::Message<CommunicationPolicy>;
4545 using Uri = graybat::communicationPolicy::socket::Uri<CommunicationPolicy>;
4646 using Socket = graybat::communicationPolicy::socket::Socket<CommunicationPolicy>;
47+ using ContextName = graybat::communicationPolicy::socket::ContextName<CommunicationPolicy>;
4748
4849 // Members
4950 const Uri masterUri;
5051 const size_t contextSize;
52+ const ContextName contextName;
5153 unsigned maxMsgID;
5254 std::mutex sendMtx;
5355 std::map<ContextID, std::map<VAddr, std::size_t > > sendSocketMappings;
@@ -62,6 +64,7 @@ namespace graybat {
6264 std::map<ContextID, std::map<VAddr, Uri> > ctrlPhoneBook;
6365 std::map<ContextID, std::map<Uri, VAddr> > inversePhoneBook;
6466 std::map<ContextID, std::map<Uri, VAddr> > inverseCtrlPhoneBook;
67+ std::map<ContextID, ContextName> contextNames;
6568
6669 std::thread recvHandler;
6770 std::thread ctrlHandler;
@@ -161,7 +164,7 @@ namespace graybat {
161164 ContextID getInitialContextID (T_Socket& socket, size_t const contextSize);
162165
163166 template <typename T_Socket>
164- ContextID getContextID (T_Socket& socket, size_t const size );
167+ ContextID getContextID (T_Socket& socket, ContextName const contextName );
165168
166169 template <typename T_Socket>
167170 VAddr getVAddr (T_Socket &socket, ContextID const contextID, Uri const uri, Uri const ctrlUri);
@@ -199,6 +202,7 @@ namespace graybat {
199202 Base<T_CommunicationPolicy>::Base(Config const config) :
200203 masterUri (config.masterUri),
201204 contextSize(config.contextSize),
205+ contextName(config.contextName),
202206 maxMsgID(0 ),
203207 inBox(config.maxBufferSize),
204208 ctrlBox(config.maxBufferSize){
@@ -219,7 +223,8 @@ namespace graybat {
219223 static_cast <CommunicationPolicy*>(this )->connectToSocket (static_cast <CommunicationPolicy*>(this )->signalingSocket , masterUri);
220224
221225 // Retrieve Context id for initial context from signaling process
222- ContextID contextID = getInitialContextID (static_cast <CommunicationPolicy*>(this )->signalingSocket , contextSize);
226+ ContextID contextID = getContextID (static_cast <CommunicationPolicy*>(this )->signalingSocket , contextName);
227+ contextNames[contextID] = contextName;
223228
224229 // Retrieve own vAddr from signaling process for initial context
225230 VAddr vAddr = getVAddr (static_cast <CommunicationPolicy*>(this )->signalingSocket , contextID, static_cast <CommunicationPolicy*>(this )->peerUri , static_cast <CommunicationPolicy*>(this )->ctrlUri );
@@ -260,7 +265,7 @@ namespace graybat {
260265 auto Base<T_CommunicationPolicy>::deinit()
261266 -> void {
262267 std::stringstream ss;
263- ss << static_cast <size_t >(MsgType::DESTRUCT);
268+ ss << static_cast <size_t >(MsgType::DESTRUCT) << " " << contextName ;
264269 static_cast <CommunicationPolicy*>(this )->sendToSocket (static_cast <CommunicationPolicy*>(this )->signalingSocket , ss);
265270
266271 std::array<unsigned , 1 > null;
@@ -404,26 +409,31 @@ namespace graybat {
404409
405410 // Peer with VAddr 0 collects new members
406411 if ( oldContext.getVAddr () == masterVAddr){
407- std::array<unsigned , 2 > nMembers {{ 0 }};
408- std::vector<VAddr> vAddrs;
412+ std::array<ContextID, 1 > newContextID {{ 0 }};
413+ std::array<unsigned , 1 > newContextSize {{ 0 }};
414+ std::vector<VAddr> newContextWhiteList (0 , 0 );
409415
410416 for (auto const &vAddr : oldContext){
411417 std::array<unsigned , 1 > remoteIsMember {{ 0 }};
412418 // std::cout << "Recv remoteIsMember: " << vAddr << std::endl;
413419 static_cast <CommunicationPolicy*>(this )->recvImpl (MsgType::SPLIT, oldContext, vAddr, 0 , remoteIsMember);
414420
415421 if (remoteIsMember[0 ]) {
416- nMembers[0 ]++;
417- vAddrs.push_back (vAddr);
422+ newContextWhiteList.push_back (vAddr);
418423
419424 }
420425
421426 }
422427
423- nMembers[1 ] = getContextID (static_cast <CommunicationPolicy*>(this )->signalingSocket , nMembers[0 ]);
428+ ContextName newContextName = contextName + " _" + std::to_string (std::rand ());
429+ newContextID[0 ] = getContextID (static_cast <CommunicationPolicy*>(this )->signalingSocket , newContextName);
430+ contextNames[newContextID[0 ]] = newContextName;
431+ newContextSize[0 ] = newContextWhiteList.size ();
424432
425- for (VAddr vAddr : vAddrs){
426- static_cast <CommunicationPolicy*>(this )->asyncSendImpl (MsgType::SPLIT, getMsgID (), oldContext, vAddr, 0 , nMembers);
433+ for (VAddr vAddr : newContextWhiteList){
434+ static_cast <CommunicationPolicy*>(this )->asyncSendImpl (MsgType::SPLIT, getMsgID (), oldContext, vAddr, 0 , newContextID);
435+ static_cast <CommunicationPolicy*>(this )->asyncSendImpl (MsgType::SPLIT, getMsgID (), oldContext, vAddr, 0 , newContextSize);
436+ static_cast <CommunicationPolicy*>(this )->asyncSendImpl (MsgType::SPLIT, getMsgID (), oldContext, vAddr, 0 , newContextWhiteList);
427437
428438 }
429439
@@ -432,29 +442,35 @@ namespace graybat {
432442 // std::cout << oldContext.getVAddr() << " check 0" << std::endl;
433443
434444 if (isMember){
435- std::array<unsigned , 2 > nMembers {{ 0 , 0 }};
445+ std::array<ContextID, 1 > newContextID {{ 0 }};
446+ std::array<unsigned , 1 > newContextSize {{ 0 }};
436447
437- static_cast <CommunicationPolicy*>(this )->recvImpl (MsgType::SPLIT, oldContext, 0 , 0 , nMembers );
438- ContextID newContextID = nMembers[ 1 ] ;
448+ static_cast <CommunicationPolicy*>(this )->recvImpl (MsgType::SPLIT, oldContext, 0 , 0 , newContextID );
449+ static_cast <CommunicationPolicy*>( this )-> recvImpl (MsgType::SPLIT, oldContext, 0 , 0 , newContextSize) ;
439450
440- newContext = Context (newContextID, getVAddr (static_cast <CommunicationPolicy*>(this )->signalingSocket , newContextID, static_cast <CommunicationPolicy*>(this )->peerUri , static_cast <CommunicationPolicy*>(this )->ctrlUri ), nMembers[0 ]);
451+ std::vector<VAddr> newContextWhiteList (newContextSize[0 ], 0 );
452+
453+ static_cast <CommunicationPolicy*>(this )->recvImpl (MsgType::SPLIT, oldContext, 0 , 0 , newContextWhiteList);
454+
455+ newContext = Context (newContextID[0 ], oldContext.getVAddr (), newContextWhiteList);
441456 contexts[newContext.getID ()] = newContext;
442457
443458 // std::cout << oldContext.getVAddr() << " check 1" << std::endl;
444459 // Update phonebook for new context
445460 for (auto const &vAddr : newContext){
446- Uri remoteUri;
447- Uri ctrlUri;
448- std::tie (remoteUri, ctrlUri) = getUri (static_cast <CommunicationPolicy*>(this )->signalingSocket , newContext.getID (), vAddr);
461+ Uri remoteUri = phoneBook[oldContext.getID ()][vAddr];
462+ Uri ctrlUri = ctrlPhoneBook[oldContext.getID ()][vAddr];
449463 phoneBook[newContext.getID ()][vAddr] = remoteUri;
450- inversePhoneBook[newContext.getID ()][remoteUri] = vAddr;
464+ ctrlPhoneBook[newContext.getID ()][vAddr] = ctrlUri;
465+ inversePhoneBook[newContext.getID ()][remoteUri] = inversePhoneBook[oldContext.getID ()][remoteUri];
466+ inverseCtrlPhoneBook[newContext.getID ()][ctrlUri] = inverseCtrlPhoneBook[oldContext.getID ()][ctrlUri];
451467
452468 }
453469
454470 // std::cout << oldContext.getVAddr() << " check 2" << std::endl;
455471 // Create mappings to sockets for new context
456472 for (auto const &vAddr : newContext){
457- Uri uri = phoneBook.at (newContext .getID ()).at (vAddr);
473+ Uri uri = phoneBook.at (oldContext .getID ()).at (vAddr);
458474 VAddr oldVAddr = inversePhoneBook.at (oldContext.getID ()).at (uri);
459475 sendSocketMappings[newContext.getID ()][vAddr] = sendSocketMappings.at (oldContext.getID ()).at (oldVAddr);
460476
@@ -505,15 +521,15 @@ namespace graybat {
505521
506522 template <typename T_CommunicationPolicy>
507523 template <typename T_Socket>
508- auto Base<T_CommunicationPolicy>::getContextID(T_Socket& socket, size_t const size )
524+ auto Base<T_CommunicationPolicy>::getContextID(T_Socket& socket, ContextName const contextName )
509525 -> graybat::communicationPolicy::ContextID<T_CommunicationPolicy> {
510526 using ContextID = graybat::communicationPolicy::ContextID<T_CommunicationPolicy>;
511527
512528 ContextID contextID = 0 ;
513529
514530 // Send vAddr request
515531 std::stringstream ss;
516- ss << static_cast <size_t >(MsgType::CONTEXT_REQUEST) << " " << size; ;
532+ ss << static_cast <size_t >(MsgType::CONTEXT_REQUEST) << " " << contextName << " " ;
517533
518534 static_cast <CommunicationPolicy*>(this )->sendToSocket (socket, ss);
519535
0 commit comments