Changeset 2483 for source/ariba/overlay


Ignore:
Timestamp:
Feb 24, 2009, 10:06:43 PM (16 years ago)
Author:
Christoph Mayer
Message:

-autolinks impl. (funktioniert noch nicht komplett, macht aber im moment nichts schlechter)
-einige fixes im ablauf etc.

Location:
source/ariba/overlay
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/overlay/BaseOverlay.cpp

    r2473 r2483  
    6969//              ovl.visChangeNodeIcon(ovlId, nodeId, OvlVis::ICON_ID_CHARACTER_W);
    7070//      }
     71
     72        // timer for auto link management
     73        Timer::setInterval( 5000 );
     74        Timer::start();
    7175}
    7276
     
    7579        logging_info("deleting base overlay");
    7680
     81        Timer::stop();
    7782        bc.unregisterMessageReceiver( this );
    7883        bc.unregisterEventListener( this );
     
    147152        //
    148153        // create the overlay
    149         // and bootstrap against ourselfs
    150154        //
    151155
    152156        overlayInterface->createOverlay();
     157        BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
     158                i->onOverlayCreate( spovnetId );
     159        }
     160
     161        //
     162        // bootstrap against ourselfs
     163        //
     164
    153165        overlayInterface->joinOverlay();
     166        BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
     167                i->onJoinSuccess( spovnetId );
     168        }
    154169
    155170        ovl.visChangeNodeIcon ( ovlId, nodeId, OvlVis::ICON_ID_CAMERA );
    156171        ovl.visChangeNodeColor( ovlId, nodeId, OvlVis::NODE_COLORS_GREEN);
    157 
    158         // inform all registered services of the event
    159         BOOST_FOREACH( ServiceInterface* i, listenerMux.getOneList() ){
    160                 i->onOverlayCreate( spovnetId );
    161         }
    162172}
    163173
     
    245255        overmsg.encapsulate( const_cast<Message*>(message) );
    246256
     257        i->second.markused();
    247258        return bc.sendMessage( link, &overmsg );
    248259}
     
    263274
    264275        if( link == LinkID::UNSPECIFIED ){
    265                 logging_error( "no link could be found to send message to node " <<
    266                                 node.toString() << " for service " << service.toString() );
    267                 return -1;
    268         }
    269 
     276
     277                logging_info( "no link could be found to send message to node " <<
     278                                node.toString() << " for service " << service.toString() <<
     279                                ". creating auto link ...");
     280               
     281                const LinkID link = establishLink( node, service );
     282                LinkMapping::iterator i = linkMapping.find( link );
     283
     284                if( i == linkMapping.end() ){
     285                        logging_error( "failed to establish auto link to node " << node.toString() <<
     286                                        " for service " << service.toString() );
     287                        return -1;
     288                }
     289
     290                i->second.autolink = true;
     291
     292        } // if( link != LinkID::UNSPECIFIED )
     293
     294        i->second.markused();
    270295        return sendMessage( message, link );
    271296}
     
    352377                                " on link " << id.toString() );
    353378
    354                 OverlayMsg overMsg( OverlayMsg::OverlayMessageTypeUpdate, i->second.service, nodeId );
     379                OverlayMsg overMsg(
     380                        OverlayMsg::OverlayMessageTypeUpdate,
     381                        i->second.service,
     382                        nodeId
     383                        );
     384
    355385                bc.sendMessage( id, &overMsg );
     386                i->second.markused();
    356387
    357388        } // if( i == linkMapping.end() )
     
    397428        if( i->second.interface != NULL )
    398429                i->second.interface->onLinkChanged( id, nodeId, i->second.node );
     430
     431        i->second.markused();
    399432}
    400433
     
    412445        if( i->second.interface != NULL )
    413446                i->second.interface->onLinkFail( id, nodeId, i->second.node );
     447
     448        i->second.markused();
    414449}
    415450
     
    427462        if( i->second.interface != NULL )
    428463                i->second.interface->onLinkQoSChanged( id, nodeId, i->second.node, qos );
     464
     465        i->second.markused();
    429466}
    430467
     
    434471        OverlayMsg* overlayMsg = ((Message*)message)->decapsulate<OverlayMsg>();
    435472        if( overlayMsg == NULL ) return false;
     473
     474        // mark the link as in action
     475        LinkMapping::iterator item = linkMapping.find( link );
     476        if( item != linkMapping.end() ) item->second.markused();
    436477
    437478        //
     
    683724                i->second.interface = iface;
    684725                iface->onLinkUp( link, nodeId, sourcenode );
     726                i->second.markused();
    685727
    686728                return true ;
     
    828870}
    829871
     872void BaseOverlay::eventFunction(){
     873
     874        list<LinkID> oldlinks;
     875        time_t now = time(NULL);
     876
     877        // first gather all the links from linkMapping that need droppin
     878        // don't directly drop, as the dropLink function affects the
     879        // linkMapping structure that we are traversing here.
     880        // drop links after a timeout of 30s
     881
     882        // the macro gets confused if type is passed directly
     883        // because of the comma in the pair definition
     884        typedef pair<LinkID,LinkItem> pairitem;
     885
     886        BOOST_FOREACH( pairitem item, linkMapping ){
     887                if( item.second.autolink && difftime(now, item.second.lastuse) > 30)
     888                        oldlinks.push_back( item.first );
     889        }
     890
     891        BOOST_FOREACH( const LinkID lnk, oldlinks ){
     892                dropLink( lnk );
     893        }
     894}
     895
    830896}} // namespace ariba, overlay
  • source/ariba/overlay/BaseOverlay.h

    r2473 r2483  
    4343#include <iostream>
    4444#include <algorithm>
     45#include <ctime>
    4546#include <boost/foreach.hpp>
    4647
     
    5051#include "ariba/utility/misc/Demultiplexer.hpp"
    5152#include "ariba/utility/logging/Logging.h"
     53#include "ariba/utility/system/Timer.h"
    5254
    5355#include "ariba/communication/EndpointDescriptor.h"
     
    6769using std::map;
    6870using std::make_pair;
     71using std::pair;
    6972
    7073using ariba::communication::EndpointDescriptor;
     
    9295using ariba::utility::MessageSender;
    9396using ariba::utility::seqnum_t;
     97using ariba::utility::Timer;
    9498
    9599#define ovl OvlVis::instance()
     
    109113        public MessageReceiver,
    110114        public CommunicationEvents,
    111         public OverlayStructureEvents {
     115        public OverlayStructureEvents,
     116        protected Timer {
    112117
    113118        use_logging_h( BaseOverlay );
     
    248253        virtual void onNodeJoin( const NodeID& node );
    249254
     255        // for timer events
     256        virtual void eventFunction();
     257
    250258private:
    251259
     
    316324                static const LinkItem UNSPECIFIED;
    317325
    318                 LinkItem( const LinkID& _link, const NodeID& _node,
     326                LinkItem( const LinkID& _link, const NodeID& _node, 
    319327                                const ServiceID& _service, ServiceInterface* _interface )
    320                         : link( _link ), node( _node ), service( _service ), interface( _interface ){
     328                        : link( _link ), node( _node ), service( _service ), interface( _interface ),
     329                                autolink( false ), lastuse( time(NULL) ) {
    321330                }
     331
     332                // general information about the link
    322333
    323334                const LinkID link;
     
    325336                ServiceID service;
    326337                ServiceInterface* interface;
     338
     339                // information needed for auto links
     340
     341                void markused(){
     342                        lastuse = time(NULL);
     343                }
     344
     345                bool autolink;
     346                time_t lastuse;
    327347        };
    328348
Note: See TracChangeset for help on using the changeset viewer.