[complement-svn] SF.net SVN: complement: [1757] trunk/complement/explore
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-10-05 10:01:13
|
Revision: 1757 http://complement.svn.sourceforge.net/complement/?rev=1757&view=rev Author: complement Date: 2007-10-05 03:01:09 -0700 (Fri, 05 Oct 2007) Log Message: ----------- cover use-case with syncronization of same group in different VS nodes during connection [VS_MERGE_GROUP, VS_SYNC_GROUP_TIME]; Janus::VSRemoteMemberRevert hasn't send VS_NEW_MEMBER; fix test. version 0.5.0; Modified Paths: -------------- trunk/complement/explore/include/janus/janus.h trunk/complement/explore/include/janus/vtime.h trunk/complement/explore/lib/janus/ChangeLog trunk/complement/explore/lib/janus/Makefile.inc trunk/complement/explore/lib/janus/janus.cc trunk/complement/explore/lib/janus/ut/Makefile trunk/complement/explore/lib/janus/ut/Makefile.inc trunk/complement/explore/lib/janus/ut/vt_remote.cc trunk/complement/explore/lib/janus/vshostmgr.cc trunk/complement/explore/lib/janus/vtime.cc Modified: trunk/complement/explore/include/janus/janus.h =================================================================== --- trunk/complement/explore/include/janus/janus.h 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/include/janus/janus.h 2007-10-05 10:01:09 UTC (rev 1757) @@ -42,16 +42,19 @@ typedef std::hash_map<oid_type, detail::vtime_obj_rec> vt_map_type; typedef std::hash_multimap<group_type, oid_type> gid_map_type; typedef std::hash_set<stem::addr_type> addr_cache_t; + typedef std::hash_set<group_type> group_cache_t; #endif #ifdef __USE_STD_HASH typedef __gnu_cxx::hash_map<oid_type, detail::vtime_obj_rec> vt_map_type; typedef __gnu_cxx::hash_multimap<group_type, oid_type> gid_map_type; typedef __gnu_cxx::hash_set<stem::addr_type> addr_cache_t; + typedef __gnu_cxx::hash_set<group_type> group_cache_t; #endif #if defined(__USE_STLPORT_TR1) || defined(__USE_STD_TR1) typedef std::tr1::unordered_map<oid_type, detail::vtime_obj_rec> vt_map_type; typedef std::tr1::unordered_multimap<group_type, oid_type> gid_map_type; typedef std::tr1::unordered_set<stem::addr_type> addr_cache_t; + typedef std::tr1::unordered_set<group_type> group_cache_t; #endif public: @@ -104,8 +107,8 @@ unsigned trflags() const; void settrs( std::ostream * ); - void connect( const char *, int ); - void serve( int ); + int connect( const char *, int ); + int serve( int ); size_t vs_known_processes() const; difference_type group_size( group_type ) const; @@ -147,6 +150,9 @@ void VSNewRemoteMemberRevert( const stem::Event_base<VSsync_rq>& e ); void VSOutMember( const stem::Event_base<VSsync_rq>& e ); + void VSMergeRemoteGroup( const stem::Event_base<VSsync_rq>& e ); + void VSsync_group_time( const stem::Event_base<VSsync>& ev ); + DECLARE_RESPONSE_TABLE( Janus, stem::EventHandler ); }; Modified: trunk/complement/explore/include/janus/vtime.h =================================================================== --- trunk/complement/explore/include/janus/vtime.h 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/include/janus/vtime.h 2007-10-05 10:01:09 UTC (rev 1757) @@ -372,8 +372,8 @@ virtual void VSNewMember( const stem::Event_base<VSsync_rq>& e ); virtual void VSOutMember( const stem::Event_base<VSsync_rq>& e ); virtual void VSsync_time( const stem::Event_base<VSsync>& ); + virtual void VSMergeRemoteGroup( const stem::Event_base<VSsync_rq>& e ); - // template <class D> // void JaSend( const stem::Event_base<D>& e ) // { VTHandler::JaSend( stem::Event_convert<D>()( e ) ); } @@ -384,7 +384,9 @@ protected: void Unsubscribe(); void VSNewMember_data( const stem::Event_base<VSsync_rq>&, const std::string& data ); + void VSMergeRemoteGroup_data( const stem::Event_base<VSsync_rq>& e, const std::string& data ); + void get_gvtime( group_type g, gvtime_type& gvt ); private: @@ -401,6 +403,8 @@ #define VS_NEW_REMOTE_MEMBER 0x304 #define VS_NEW_MEMBER_RV 0x305 #define VS_HOST_MGR_FINAL 0x306 +#define VS_MERGE_GROUP 0x307 +#define VS_SYNC_GROUP_TIME 0x308 #ifdef __USE_STLPORT_HASH # undef __USE_STLPORT_HASH Modified: trunk/complement/explore/lib/janus/ChangeLog =================================================================== --- trunk/complement/explore/lib/janus/ChangeLog 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/ChangeLog 2007-10-05 10:01:09 UTC (rev 1757) @@ -1,3 +1,14 @@ +2007-10-05 Petr Ovtchenkov <pt...@is...> + + * janus.h, janus.cc, vtime.h, vtime.cc: cover use-case + with syncronization of same group in different VS nodes + during connection [VS_MERGE_GROUP, VS_SYNC_GROUP_TIME]; + Janus::VSRemoteMemberRevert hasn't send VS_NEW_MEMBER; + + * vt_remote.cc: fix test. + + * libjanus: version 0.5.0; + 2007-10-01 Petr Ovtchenkov <pt...@is...> * janus.cc, vshostmgr.cc: more trace prints; Modified: trunk/complement/explore/lib/janus/Makefile.inc =================================================================== --- trunk/complement/explore/lib/janus/Makefile.inc 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/Makefile.inc 2007-10-05 10:01:09 UTC (rev 1757) @@ -2,6 +2,6 @@ LIBNAME = janus MAJOR = 0 -MINOR = 4 +MINOR = 5 PATCH = 0 SRC_CC = vtime.cc janus.cc vshostmgr.cc Modified: trunk/complement/explore/lib/janus/janus.cc =================================================================== --- trunk/complement/explore/lib/janus/janus.cc 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/janus.cc 2007-10-05 10:01:09 UTC (rev 1757) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/08/26 12:44:25 ptr> +// -*- C++ -*- Time-stamp: <07/10/04 01:04:14 ptr> #include <janus/janus.h> #include <janus/vshostmgr.h> @@ -174,6 +174,8 @@ } while ( more ); } +// Send VS event within group grp: + void Janus::JaSend( const stem::Event& e, group_type grp ) { // This method not called from Dispatch, but work on the same level and in the same @@ -213,6 +215,7 @@ // if remote, forward it to foreign VTDispatcher? try { /* const transport tr = */ manager()->transport( k->second.stem_addr() ); + // remote delivery gaddr_type ga = manager()->reflect( k->second.stem_addr() ); if ( ga != gaddr_type() ) { ga.addr = stem::janus_addr; @@ -226,6 +229,7 @@ } } catch ( const range_error& ) { + // local delivery check_and_send( k->second, m ); vt.base_advance(g->second); // store last send VT to obj } @@ -538,13 +542,12 @@ void Janus::VSNewMember( const stem::Event_base<VSsync_rq>& ev ) { - if ( ev.value().grp == vshosts_group ) { - ev.dest( _hostmgr->self_id() ); + if ( ev.value().grp != vshosts_group ) { // shouldn't happens, only trace #ifdef __FIT_VS_TRACE try { scoped_lock lk(_lock_tr); - if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { - *_trs << "<-> VS_NEW_MEMBER G" << vshosts_group << " " + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) && (_trflags & tracefault) ) { + *_trs << "Unexpected VS_NEW_MEMBER on Janus: G" << ev.value().grp << " " << hex << showbase << ev.src() << " -> " << ev.dest() << dec << endl; } @@ -552,113 +555,121 @@ catch ( ... ) { } #endif // __FIT_VS_TRACE - Forward( ev ); - gaddr_type ga = manager()->reflect( ev.src() ); - addr_type janus_addr = badaddr; - if ( ga != gaddr_type() ) { - ga.addr = stem::janus_addr; - janus_addr = manager()->reflect( ga ); - if ( janus_addr == badaddr ) { - janus_addr = manager()->SubscribeRemote( ga, "janus" ); - } - } - stem::Event_base<VSsync_rq> evr( VS_NEW_MEMBER_RV ); - evr.dest( janus_addr ); - evr.value().grp = vshosts_group; + return; + } + // special group + // Forward info about remote VS node to VSHostMgr + ev.dest( _hostmgr->self_id() ); #ifdef __FIT_VS_TRACE - try { - scoped_lock lk(_lock_tr); - if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { - *_trs << " -> VS_NEW_MEMBER_RV G" << vshosts_group << " " - << hex << showbase - << self_id() << " -> " << evr.dest() << dec << endl; - } + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + *_trs << "<-> VS_NEW_MEMBER G" << vshosts_group << " " + << hex << showbase + << ev.src() << " -> " << ev.dest() << dec << endl; } - catch ( ... ) { + } + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + Forward( ev ); + + // Return info about me (VS node) back to remote VS node + gaddr_type ga = manager()->reflect( ev.src() ); + addr_type janus_addr = badaddr; + if ( ga != gaddr_type() ) { + ga.addr = stem::janus_addr; + janus_addr = manager()->reflect( ga ); + if ( janus_addr == badaddr ) { + janus_addr = manager()->SubscribeRemote( ga, "janus" ); } -#endif // __FIT_VS_TRACE - Send( evr ); } + stem::Event_base<VSsync_rq> evr( VS_NEW_MEMBER_RV ); + evr.dest( janus_addr ); + evr.value().grp = vshosts_group; #ifdef __FIT_VS_TRACE - else { - try { - scoped_lock lk(_lock_tr); - if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { - *_trs << "Unexpected VS_NEW_MEMBER on Janus: G" << ev.value().grp << " " - << hex << showbase - << ev.src() << " -> " << ev.dest() << dec << endl; - } + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + *_trs << " -> VS_NEW_MEMBER_RV G" << vshosts_group << " " + << hex << showbase + << self_id() << " -> " << evr.dest() << dec << endl; } - catch ( ... ) { - } } + catch ( ... ) { + } #endif // __FIT_VS_TRACE + Send( evr ); } void Janus::VSNewRemoteMemberDirect( const stem::Event_base<VSsync_rq>& ev ) { - if ( ev.value().grp != vshosts_group ) { - group_type grp = ev.value().grp; - pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); - if ( range.first != range.second ) { // we have local? member within this group - const addr_type addr = ev.src(); - gaddr_type ga = manager()->reflect( addr ); - addr_type janus_addr = badaddr; - if ( ga != gaddr_type() ) { - ga.addr = stem::janus_addr; - janus_addr = manager()->reflect( ga ); - if ( janus_addr == badaddr ) { - janus_addr = manager()->SubscribeRemote( ga, "janus" ); + if ( ev.value().grp == vshosts_group ) { // special group, and this shouldn't happens + return; + } + group_type grp = ev.value().grp; + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); + if ( range.first == range.second ) { // no local (?) member within this group + return; + } + + const addr_type addr = ev.src(); + gaddr_type ga = manager()->reflect( addr ); + addr_type janus_addr = badaddr; + if ( ga != gaddr_type() ) { + ga.addr = stem::janus_addr; + janus_addr = manager()->reflect( ga ); + if ( janus_addr == badaddr ) { + janus_addr = manager()->SubscribeRemote( ga, "janus" ); + } + } + for ( ; range.first != range.second; ++range.first ) { + vt_map_type::iterator i = vtmap.find( range.first->second ); + if ( i != vtmap.end() ) { + // Inform local (?) object about new remote group member + stem::Event_base<VSsync_rq> evs( VS_NEW_MEMBER ); + evs.dest( i->second.stem_addr() ); + evs.src( addr ); + evs.value().grp = grp; +#ifdef __FIT_VS_TRACE + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + *_trs << " -> VS_NEW_MEMBER (remote) G" << grp << " " + << hex << showbase + << evs.src() << " -> " << evs.dest() << dec << endl; } } - for ( ; range.first != range.second; ++range.first ) { - vt_map_type::iterator i = vtmap.find( range.first->second ); - if ( i != vtmap.end() ) { - stem::Event_base<VSsync_rq> evs( VS_NEW_MEMBER ); - evs.dest( i->second.stem_addr() ); - evs.src( addr ); - evs.value().grp = grp; -#ifdef __FIT_VS_TRACE - try { - scoped_lock lk(_lock_tr); - if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { - *_trs << " -> VS_NEW_MEMBER (remote) G" << grp << " " - << hex << showbase - << evs.src() << " -> " << evs.dest() << dec << endl; - } - } - catch ( ... ) { - } + catch ( ... ) { + } #endif // __FIT_VS_TRACE - Forward( evs ); - stem::Event_base<VSsync_rq> evr( VS_NEW_MEMBER_RV ); - evr.dest( janus_addr ); - evr.src( i->second.stem_addr() ); - evr.value().grp = grp; + Forward( evs ); + // Inform remote object about local (?) group member + stem::Event_base<VSsync_rq> evr( VS_NEW_MEMBER_RV ); + evr.dest( janus_addr ); + evr.src( i->second.stem_addr() ); + evr.value().grp = grp; #ifdef __FIT_VS_TRACE - try { - scoped_lock lk(_lock_tr); - if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { - *_trs << " -> VS_NEW_MEMBER_RV G" << grp << " " - << hex << showbase - << evr.src() << " -> " << evr.dest() << dec << endl; - } - } - catch ( ... ) { - } -#endif // __FIT_VS_TRACE - Forward( evr ); + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + *_trs << " -> VS_NEW_MEMBER_RV G" << grp << " " + << hex << showbase + << evr.src() << " -> " << evr.dest() << dec << endl; } } + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + Forward( evr ); + } + } - const gaddr_type oid = manager()->reflect( addr ); // ???? oid == gaddr + const gaddr_type oid = manager()->reflect( addr ); // ???? oid == gaddr - vtmap[oid].add( addr, grp ); - grmap.insert( make_pair(grp,oid) ); - // cerr << "**** " << grp << " " << xmt::getpid() << endl; - } - } + vtmap[oid].add( addr, grp ); + grmap.insert( make_pair(grp,oid) ); } void Janus::VSNewRemoteMemberRevert( const stem::Event_base<VSsync_rq>& ev ) @@ -668,34 +679,48 @@ pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); if ( range.first != range.second ) { // we have local? member within this group const addr_type addr = ev.src(); - for ( ; range.first != range.second; ++range.first ) { - vt_map_type::iterator i = vtmap.find( range.first->second ); - if ( i != vtmap.end() && ((i->second.stem_addr() & stem::extbit) == 0 )) { - stem::Event_base<VSsync_rq> evs( VS_NEW_MEMBER ); - evs.dest( i->second.stem_addr() ); - evs.src( addr ); - evs.value().grp = grp; + const gaddr_type oid = manager()->reflect( addr ); // ???? oid == gaddr #ifdef __FIT_VS_TRACE - try { - scoped_lock lk(_lock_tr); - if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { - *_trs << " -> VS_NEW_MEMBER (remote revert) G" << grp << " " - << hex << showbase - << evs.src() << " -> " << evs.dest() << dec << endl; - } - } - catch ( ... ) { - } -#endif // __FIT_VS_TRACE - Forward( evs ); + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + int f = _trs->flags(); + *_trs << " VS add remote object " << hex << showbase << oid + << dec << " G" << grp << endl; +#ifdef STLPORT + _trs->flags( f ); +#else + _trs->flags( static_cast<std::_Ios_Fmtflags>(f) ); +#endif } } - - const gaddr_type oid = manager()->reflect( addr ); // ???? oid == gaddr + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + // add remote memer of group grp vtmap[oid].add( addr, grp ); grmap.insert( make_pair(grp,oid) ); - // cerr << "**** " << grp << " " << xmt::getpid() << endl; } +#ifdef __FIT_VS_TRACE + else { + // this VS node has no group grp, so do nothing + // except trace info + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) && (_trflags & tracefault) ) { + int f = _trs->flags(); + *_trs << " VS node don't has such group, ignore G" << grp << endl; +#ifdef STLPORT + _trs->flags( f ); +#else + _trs->flags( static_cast<std::_Ios_Fmtflags>(f) ); +#endif + } + } + catch ( ... ) { + } + } +#endif // __FIT_VS_TRACE } else { const addr_type addr = ev.src(); const gaddr_type oid = manager()->reflect( ev.src() ); // ???? oid == gaddr @@ -719,7 +744,20 @@ vtmap[oid].add( addr, vshosts_group ); grmap.insert( make_pair(static_cast<group_type>(vshosts_group),oid) ); - // cerr << "**** " << vshosts_group << " " << xmt::getpid() << endl; + + // send request for sync all groups, that present in this VS node: + stem::Event_base<VSsync_rq> e( VS_MERGE_GROUP ); + e.dest( ev.src() ); + group_cache_t gcache; + for ( gid_map_type::const_iterator i = grmap.begin(); i != grmap.end(); ++i ) { + // for all groups, except vshosts_group, + // and only once for earch group + if ( (i->first != vshosts_group) && (gcache.find( i->first) != gcache.end()) ) { + e.value().grp = i->first; + Send( e ); + gcache.insert( i->first ); + } + } } } @@ -784,14 +822,14 @@ } } -void Janus::connect( const char *host, int port ) +int Janus::connect( const char *host, int port ) { - _hostmgr->connect( host, port ); + return _hostmgr->connect( host, port ); } -void Janus::serve( int port ) +int Janus::serve( int port ) { - _hostmgr->serve( port ); + return _hostmgr->serve( port ); } size_t Janus::vs_known_processes() const @@ -809,12 +847,108 @@ return distance( range.first, range.second ); } +void Janus::VSMergeRemoteGroup( const stem::Event_base<VSsync_rq>& e ) +{ + const group_type grp = e.value().grp; +#ifdef __FIT_VS_TRACE + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + int f = _trs->flags(); + *_trs << " VS merge remote group request G" << grp << endl; +#ifdef STLPORT + _trs->flags( f ); +#else + _trs->flags( static_cast<std::_Ios_Fmtflags>(f) ); +#endif + } + } + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); + if ( range.first != range.second ) { // we have local? member within this group + // const addr_type addr = e.src(); + // expected that addr correspond to remote Janus + + // gaddr_type ga = manager()->reflect( addr ); + // addr_type janus_addr = badaddr; + // if ( ga != gaddr_type() ) { + // ga.addr = stem::janus_addr; + // janus_addr = manager()->reflect( ga ); + // if ( janus_addr == badaddr ) { + // janus_addr = manager()->SubscribeRemote( ga, "janus" ); + // } + // } + + // select VS object with latest time, and forward request to it + + // gvtime_type gvt; + // gvtime_type gvt_last; + // stem::addr_type addr = stem::badaddr; + for ( ; range.first != range.second; ++range.first ) { + vt_map_type::iterator i = vtmap.find( range.first->second ); + if ( i != vtmap.end() && ((i->second.stem_addr() & stem::extbit) == 0 )) { + // i->second.get_gvt( gvt ); + // if ( gvt_last < gvt ) { + // swap( gvt_last, gvt ); + // addr = i->second.stem_addr(); + // } + e.dest( i->second.stem_addr() ); + Forward( e ); + return; + } + } + // e.dest( addr ); + // Forward( e ); + } +} + +void Janus::VSsync_group_time( const stem::Event_base<VSsync>& ev ) +{ + const group_type grp = ev.value().grp; +#ifdef __FIT_VS_TRACE + try { + scoped_lock lk(_lock_tr); + if ( _trs != 0 && _trs->good() && (_trflags & tracegroup) ) { + int f = _trs->flags(); + *_trs << " VS sync remote group time G" << grp << endl; +#ifdef STLPORT + _trs->flags( f ); +#else + _trs->flags( static_cast<std::_Ios_Fmtflags>(f) ); +#endif + } + } + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + + // find all local group members and forward data as VS_SYNC_TIME + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); + stem::Event_base<VSsync> e( VS_SYNC_TIME ); + e.src( ev.src() ); + e.value().grp = ev.value().grp; + e.value().gvt.gvt = ev.value().gvt.gvt; + e.value().mess = ev.value().mess; + + for ( ; range.first != range.second; ++range.first ) { + vt_map_type::iterator i = vtmap.find( range.first->second ); + if ( i != vtmap.end() && ((i->second.stem_addr() & stem::extbit) == 0 )) { + e.dest( i->second.stem_addr() ); + Forward( e ); + } + } +} + DEFINE_RESPONSE_TABLE( Janus ) EV_Event_base_T_( ST_NULL, VS_MESS, JaDispatch, VSmess ) EV_Event_base_T_( ST_NULL, VS_NEW_MEMBER, VSNewMember, VSsync_rq ) EV_Event_base_T_( ST_NULL, VS_NEW_REMOTE_MEMBER, VSNewRemoteMemberDirect, VSsync_rq ) EV_Event_base_T_( ST_NULL, VS_NEW_MEMBER_RV, VSNewRemoteMemberRevert, VSsync_rq ) EV_Event_base_T_( ST_NULL, VS_OUT_MEMBER, VSOutMember, VSsync_rq ) + EV_Event_base_T_( ST_NULL, VS_MERGE_GROUP, VSMergeRemoteGroup, VSsync_rq ) + EV_Event_base_T_( ST_NULL, VS_SYNC_GROUP_TIME, VSsync_group_time, VSsync ) END_RESPONSE_TABLE } // namespace janus Modified: trunk/complement/explore/lib/janus/ut/Makefile =================================================================== --- trunk/complement/explore/lib/janus/ut/Makefile 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/ut/Makefile 2007-10-05 10:01:09 UTC (rev 1757) @@ -16,23 +16,24 @@ LIBXMT_DIR = ${CoMT_DIR}/lib/mt LIBSOCKIOS_DIR = ${CoMT_DIR}/lib/sockios LIBSTEM_DIR = ${CoMT_DIR}/lib/stem +LIBJANUS_DIR = ${CoMT_DIR}/lib/janus ifeq ($(OSNAME),linux) -release-shared: LDSEARCH += -L${LIBEXAM_DIR}/${OUTPUT_DIR} -L$(LIBXMT_DIR)/${OUTPUT_DIR} -L$(LIBSOCKIOS_DIR)/${OUTPUT_DIR} -L$(LIBSTEM_DIR)/${OUTPUT_DIR} -Wl,--rpath=${LIBEXAM_DIR}/${OUTPUT_DIR}:$(LIBXMT_DIR)/${OUTPUT_DIR}:${LIBSOCKIOS_DIR}/${OUTPUT_DIR}:${LIBSTEM_DIR}/${OUTPUT_DIR}:${STLPORT_LIB_DIR} +release-shared: LDSEARCH += -L${LIBEXAM_DIR}/${OUTPUT_DIR} -L$(LIBXMT_DIR)/${OUTPUT_DIR} -L$(LIBSOCKIOS_DIR)/${OUTPUT_DIR} -L$(LIBSTEM_DIR)/${OUTPUT_DIR} -L$(LIBJANUS_DIR)/${OUTPUT_DIR} -Wl,--rpath=${LIBEXAM_DIR}/${OUTPUT_DIR}:$(LIBXMT_DIR)/${OUTPUT_DIR}:${LIBSOCKIOS_DIR}/${OUTPUT_DIR}:${LIBSTEM_DIR}/${OUTPUT_DIR}:${LIBJANUS_DIR}${OUTPUT_DIR}:${STLPORT_LIB_DIR} -dbg-shared: LDSEARCH += -L${LIBEXAM_DIR}/${OUTPUT_DIR_DBG} -L$(LIBXMT_DIR)/${OUTPUT_DIR_DBG} -L$(LIBSOCKIOS_DIR)/${OUTPUT_DIR_DBG} -L$(LIBSTEM_DIR)/${OUTPUT_DIR_DBG} -Wl,--rpath=${LIBEXAM_DIR}/${OUTPUT_DIR_DBG}:$(LIBXMT_DIR)/${OUTPUT_DIR_DBG}:${LIBSOCKIOS_DIR}/${OUTPUT_DIR_DBG}:${LIBSTEM_DIR}/${OUTPUT_DIR_DBG}:${STLPORT_LIB_DIR} +dbg-shared: LDSEARCH += -L${LIBEXAM_DIR}/${OUTPUT_DIR_DBG} -L$(LIBXMT_DIR)/${OUTPUT_DIR_DBG} -L$(LIBSOCKIOS_DIR)/${OUTPUT_DIR_DBG} -L$(LIBSTEM_DIR)/${OUTPUT_DIR_DBG} -L$(LIBJANUS_DIR)/${OUTPUT_DIR_DBG} -Wl,--rpath=${LIBEXAM_DIR}/${OUTPUT_DIR_DBG}:$(LIBXMT_DIR)/${OUTPUT_DIR_DBG}:${LIBSOCKIOS_DIR}/${OUTPUT_DIR_DBG}:${LIBSTEM_DIR}/${OUTPUT_DIR_DBG}:${LIBJANUS_DIR}/${OUTPUT_DIR_DBG}:${STLPORT_LIB_DIR} ifndef WITHOUT_STLPORT -stldbg-shared: LDSEARCH += -L${LIBEXAM_DIR}/${OUTPUT_DIR_STLDBG} -L$(LIBXMT_DIR)/${OUTPUT_DIR_STLDBG} -L$(LIBSOCKIOS_DIR)/${OUTPUT_DIR_STLDBG} -L$(LIBSTEM_DIR)/${OUTPUT_DIR_STLDBG} -Wl,--rpath=${LIBEXAM_DIR}/${OUTPUT_DIR_STLDBG}:$(LIBXMT_DIR)/${OUTPUT_DIR_STLDBG}:${LIBSOCKIOS_DIR}/${OUTPUT_DIR_STLDBG}:${LIBSTEM_DIR}/${OUTPUT_DIR_STLDBG}:${STLPORT_LIB_DIR} +stldbg-shared: LDSEARCH += -L${LIBEXAM_DIR}/${OUTPUT_DIR_STLDBG} -L$(LIBXMT_DIR)/${OUTPUT_DIR_STLDBG} -L$(LIBSOCKIOS_DIR)/${OUTPUT_DIR_STLDBG} -L$(LIBSTEM_DIR)/${OUTPUT_DIR_STLDBG} -L$(LIBJANUS_DIR)/${OUTPUT_DIR_STLDBG} -Wl,--rpath=${LIBEXAM_DIR}/${OUTPUT_DIR_STLDBG}:$(LIBXMT_DIR)/${OUTPUT_DIR_STLDBG}:${LIBSOCKIOS_DIR}/${OUTPUT_DIR_STLDBG}:${LIBSTEM_DIR}/${OUTPUT_DIR_STLDBG}:${LIBJANUS_DIR}/${OUTPUT_DIR_STLDBG}:${STLPORT_LIB_DIR} endif endif -release-shared: PROJECT_LIBS = -lxmt -lsockios -lstem -lexam -dbg-shared: PROJECT_LIBS = -lxmtg -lsockiosg -lstemg -lexamg +release-shared: PROJECT_LIBS = -lxmt -lsockios -lstem -lexam -ljanus +dbg-shared: PROJECT_LIBS = -lxmtg -lsockiosg -lstemg -lexamg -ljanusg ifndef WITHOUT_STLPORT -stldbg-shared: PROJECT_LIBS = -lxmtstlg -lsockiosstlg -lstemstlg -lexamstlg +stldbg-shared: PROJECT_LIBS = -lxmtstlg -lsockiosstlg -lstemstlg -lexamstlg -ljanusstlg endif dbg-shared: DEFS += -D__FIT_VS_TRACE Modified: trunk/complement/explore/lib/janus/ut/Makefile.inc =================================================================== --- trunk/complement/explore/lib/janus/ut/Makefile.inc 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/ut/Makefile.inc 2007-10-05 10:01:09 UTC (rev 1757) @@ -2,10 +2,7 @@ PRGNAME = ut_vtime -SRC_CC = ../vtime.cc \ - ../janus.cc \ - ../vshostmgr.cc \ - unit_test.cc \ +SRC_CC = unit_test.cc \ vt_operations.cc \ VTmess_core.cc \ vt_object.cc \ Modified: trunk/complement/explore/lib/janus/ut/vt_remote.cc =================================================================== --- trunk/complement/explore/lib/janus/ut/vt_remote.cc 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/ut/vt_remote.cc 2007-10-05 10:01:09 UTC (rev 1757) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/08/26 12:54:05 ptr> +// -*- C++ -*- Time-stamp: <07/10/04 10:11:26 ptr> #include "vt_operations.h" @@ -28,9 +28,7 @@ using namespace xmt; #define VS_DUMMY_MESS 0x1203 -#define VS_DUMMY_GREETING 0x1204 -#define VS_DUMMY_GREETING2 0x1205 -#define VS_DUMMY_MESS2 0x1206 +#define VS_DUMMY_MESS2 0x1204 class YaRemote : public janus::VTHandler @@ -43,11 +41,10 @@ void handler( const stem::Event& ); void handler2( const stem::Event& ); - void VSNewMember( const stem::Event_base<VSsync_rq>& ); - void VSOutMember( const stem::Event_base<VSsync_rq>& ); - void greeting(); - void greeting2(); + virtual void VSNewMember( const stem::Event_base<VSsync_rq>& ); + virtual void VSOutMember( const stem::Event_base<VSsync_rq>& ); + virtual void VSsync_time( const stem::Event_base<VSsync>& ); void wait(); void wait2(); @@ -131,20 +128,16 @@ void YaRemote::VSNewMember( const stem::Event_base<VSsync_rq>& ev ) { - // cerr << "Hello " << xmt::getpid() << endl; + // cerr << "VSNewMember " << xmt::getpid() << endl; ++count; // VTNewMember_data( ev, "" ); VTHandler::VSNewMember( ev ); if ( ev.value().grp == janus::vs_base::first_user_group ) { - stem::EventVoid gr_ev( VS_DUMMY_GREETING ); - gr_ev.dest( ev.src() ); - Send( gr_ev ); + gr.set( true ); } else if ( ev.value().grp == (janus::vs_base::first_user_group + 1) ) { - stem::EventVoid gr_ev( VS_DUMMY_GREETING2 ); - gr_ev.dest( ev.src() ); - Send( gr_ev ); + gr2.set( true ); } } @@ -153,6 +146,18 @@ ++ocount; } +void YaRemote::VSsync_time( const stem::Event_base<VSsync>& ev ) +{ + // cerr << "VSsync_time " << xmt::getpid() << endl; + ++count; + VTHandler::VSsync_time( ev ); + if ( ev.value().grp == janus::vs_base::first_user_group ) { + gr.set( true ); + } else if ( ev.value().grp == (janus::vs_base::first_user_group + 1) ) { + gr2.set( true ); + } +} + void YaRemote::wait() { cnd.try_wait(); @@ -167,21 +172,9 @@ cnd2.set( false ); } -void YaRemote::greeting() -{ - gr.set( true ); -} - -void YaRemote::greeting2() -{ - gr2.set( true ); -} - DEFINE_RESPONSE_TABLE( YaRemote ) EV_EDS( ST_NULL, VS_DUMMY_MESS, handler ) EV_EDS( ST_NULL, VS_DUMMY_MESS2, handler2 ) - EV_VOID( ST_NULL, VS_DUMMY_GREETING, greeting ) - EV_VOID( ST_NULL, VS_DUMMY_GREETING2, greeting2 ) END_RESPONSE_TABLE int EXAM_IMPL(vtime_operations::remote) @@ -239,7 +232,7 @@ // cerr << obj1.vtdispatcher()->vs_known_processes() << endl; - EXAM_CHECK_ASYNC_F( obj1.vtdispatcher()->group_size(janus::vs_base::vshosts_group) == 2, res_flag ); + // EXAM_CHECK_ASYNC_F( obj1.vtdispatcher()->group_size(janus::vs_base::vshosts_group) == 2, res_flag ); // cerr << obj1.vtdispatcher()->group_size(janus::vs_base::vshosts_group) << endl; obj1.JoinGroup( janus::vs_base::first_user_group ); @@ -248,7 +241,7 @@ EXAM_CHECK_ASYNC_F( obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group) == 2, res_flag ); EXAM_CHECK_ASYNC_F( obj1.count == 1, res_flag ); - // cerr << "* " << obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group) << endl; + // cerr << "* " << obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group) << " " << obj1.count << " " << xmt::getpid() << endl; obj1.wait(); // obj1.manager()->settrf( stem::EvManager::tracenet | stem::EvManager::tracedispatch ); @@ -303,6 +296,7 @@ EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::vshosts_group) == 1 ); // cerr << obj1.vtdispatcher()->vs_known_processes() << endl; + EXAM_CHECK( obj1.ocount == 1 ); } (&b)->~__barrier<true>(); @@ -410,11 +404,14 @@ EXAM_ERROR( "child interrupted" ); } - EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group) == 1 ); - EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group + 1) == 1 ); - // cerr << obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group + 1) << endl; + // EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group) == 1 ); + // EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group + 1) == 1 ); + cerr << obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group) << endl; + cerr << obj1.vtdispatcher()->group_size(janus::vs_base::first_user_group + 1) << endl; - EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::vshosts_group) == 1 ); + // EXAM_CHECK( obj1.vtdispatcher()->group_size(janus::vs_base::vshosts_group) == 1 ); + // EXAM_CHECK( obj1.ocount == 2 ); + cerr << obj1.ocount << endl; } (&b)->~__barrier<true>(); Modified: trunk/complement/explore/lib/janus/vshostmgr.cc =================================================================== --- trunk/complement/explore/lib/janus/vshostmgr.cc 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/vshostmgr.cc 2007-10-05 10:01:09 UTC (rev 1757) @@ -222,6 +222,8 @@ } #endif // __FIT_VS_TRACE Send( ev ); + + // conn_cnd.try_wait_delay( timeout ); return 0; } #ifdef __FIT_VS_TRACE Modified: trunk/complement/explore/lib/janus/vtime.cc =================================================================== --- trunk/complement/explore/lib/janus/vtime.cc 2007-10-01 16:33:28 UTC (rev 1756) +++ trunk/complement/explore/lib/janus/vtime.cc 2007-10-05 10:01:09 UTC (rev 1757) @@ -727,10 +727,55 @@ } } +void VTHandler::VSMergeRemoteGroup( const stem::Event_base<VSsync_rq>& e ) +{ + stem::Event_base<VSsync> out_ev( VS_SYNC_GROUP_TIME ); + out_ev.dest( e.src() ); + out_ev.value().grp = e.value().grp; + get_gvtime( e.value().grp, out_ev.value().gvt.gvt ); +#ifdef __FIT_VS_TRACE + try { + scoped_lock lk(_vtdsp->_lock_tr); + if ( _vtdsp->_trs != 0 && _vtdsp->_trs->good() && (_vtdsp->_trflags & Janus::tracegroup) ) { + *_vtdsp->_trs << " -> VS_SYNC_GROUP_TIME G" << e.value().grp << " " + << hex << showbase + << self_id() << " -> " << out_ev.dest() << dec << endl; + } + } + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + Send( out_ev ); +} + +void VTHandler::VSMergeRemoteGroup_data( const stem::Event_base<VSsync_rq>& e, const string& data ) +{ + stem::Event_base<VSsync> out_ev( VS_SYNC_GROUP_TIME ); + out_ev.dest( e.src() ); + out_ev.value().grp = e.value().grp; + get_gvtime( e.value().grp, out_ev.value().gvt.gvt ); + out_ev.value().mess = data; +#ifdef __FIT_VS_TRACE + try { + scoped_lock lk(_vtdsp->_lock_tr); + if ( _vtdsp->_trs != 0 && _vtdsp->_trs->good() && (_vtdsp->_trflags & Janus::tracegroup) ) { + *_vtdsp->_trs << " -> VS_SYNC_GROUP_TIME (data) G" << e.value().grp << " " + << hex << showbase + << self_id() << " -> " << out_ev.dest() << dec << endl; + } + } + catch ( ... ) { + } +#endif // __FIT_VS_TRACE + Send( out_ev ); +} + + DEFINE_RESPONSE_TABLE( VTHandler ) EV_Event_base_T_( ST_NULL, VS_NEW_MEMBER, VSNewMember, VSsync_rq ) EV_Event_base_T_( ST_NULL, VS_OUT_MEMBER, VSOutMember, VSsync_rq ) EV_Event_base_T_( ST_NULL, VS_SYNC_TIME, VSsync_time, VSsync ) + EV_Event_base_T_( ST_NULL, VS_MERGE_GROUP, VSMergeRemoteGroup, VSsync_rq ) END_RESPONSE_TABLE } // namespace vt This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |