Changeset 888

Show
Ignore:
Timestamp:
10/04/06 08:52:34 (2 years ago)
Author:
alban
Message:

[Bug 16] add statistics support to the tracker and stats.xml servert

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/source/org/kolaka/freecast/node/DefaultNode.java

    r405 r888  
    162162                Validate.notNull(receiverControler, "No specified ReceiverControler"); 
    163163 
    164                 if (receiverControler instanceof PeerReceiverControler) { 
    165                         order = Order.UNKNOWN; 
    166                 } else { 
    167                         order = Order.ZERO; 
     164                if (!(receiverControler instanceof PeerReceiverControler)) { 
     165      changeOrder(Order.ZERO); 
    168166                } 
    169167 
     
    229227                        LogFactory.getLog(getClass()).debug("set order to " + order); 
    230228                        this.order = order; 
     229      reference.setAttribute(PeerReference.ORDER_ATTRIBUTE, order); 
    231230                        nodeStatusProvider.fireNodeStatus(); 
    232231                } 
  • trunk/source/org/kolaka/freecast/tracker/DefaultMultiTracker.java

    r832 r888  
    3838import org.kolaka.freecast.timer.Timer; 
    3939import org.kolaka.freecast.timer.TimerUser; 
    40 import org.kolaka.freecast.tracker.DefaultTracker.ClientInfoProvider; 
    4140 
    42 public class DefaultMultiTracker implements TimerUser { 
     41public class DefaultMultiTracker implements MultiTracker, TimerUser, ClientInfoProviderUser, MultiTrackerStatisticsProvider { 
    4342 
    4443  private Map trackers = new TreeMap(); 
    4544 
    46   private final ClientInfoProvider clientInfoProvider; 
     45  private ClientInfoProvider clientInfoProvider; 
    4746 
    48   public DefaultMultiTracker(final ClientInfoProvider clientInfoProvider) { 
    49     this.clientInfoProvider = clientInfoProvider; 
    50  
     47  public DefaultMultiTracker() { 
    5148    Runnable purgeRunnable = new Runnable() { 
    5249      public void run() { 
     
    5552    }; 
    5653    timer.executePeriodically(DefaultTimer.minutes(1), purgeRunnable , false); 
    57 
     54  } 
     55   
     56  public TrackerStatistics getStatistics(NetworkIdentifier identifier) { 
     57    Tracker tracker = (Tracker) trackers.get(identifier); 
     58    if (tracker == null) { 
     59      return new DefaultTrackerStatistics(); 
     60    } 
     61    return ((TrackerStatisticsProvider) tracker).getStatistics(); 
     62  } 
     63 
     64  public void setClientInfoProvider(ClientInfoProvider clientInfoProvider) { 
     65    this.clientInfoProvider = clientInfoProvider; 
     66  } 
     67   
     68  private ClientInfoProvider getClientInfoProvider() { 
     69    if (clientInfoProvider == null) { 
     70      throw new IllegalStateException("No specified ClientInfoProvider"); 
     71    } 
     72    return clientInfoProvider; 
     73  } 
    5874 
    5975  private synchronized Tracker getTracker(NetworkIdentifier identifier) { 
     
    6177    if (tracker == null) { 
    6278      LogFactory.getLog(getClass()).info("create tracker for network " + identifier); 
    63       tracker = createTracker(clientInfoProvider); 
     79      tracker = createTracker(getClientInfoProvider()); 
    6480      trackers.put(identifier, tracker); 
    6581    } 
     
    6884   
    6985  protected Tracker createTracker(ClientInfoProvider clientInfoProvider) { 
    70     return new TimedTracker(new DefaultTracker(clientInfoProvider)); 
     86    DefaultTracker tracker = new DefaultTracker(); 
     87    tracker.setClientInfoProvider(clientInfoProvider); 
     88    return new TimedTracker(tracker); 
    7189  } 
    7290 
     
    114132  } 
    115133   
    116   static class TimedTracker implements Tracker
     134  static class TimedTracker implements Tracker, TrackerStatisticsProvider
    117135     
    118136    private final Tracker delegate; 
     
    122140      Validate.notNull(delegate); 
    123141      this.delegate = delegate; 
     142    } 
     143     
     144    public TrackerStatistics getStatistics() { 
     145      return ((TrackerStatisticsProvider) delegate).getStatistics(); 
    124146    } 
    125147 
  • trunk/source/org/kolaka/freecast/tracker/DefaultTracker.java

    r832 r888  
    4141import org.kolaka.freecast.peer.InetPeerReference; 
    4242import org.kolaka.freecast.peer.PeerReference; 
     43import org.kolaka.freecast.peer.PeerReferences; 
    4344import org.kolaka.freecast.service.ControlException; 
    4445 
     
    4849 * @author <a href="mailto:alban.peignier@free.fr">Alban Peignier </a> 
    4950 */ 
    50 public class DefaultTracker implements Tracker
     51public class DefaultTracker implements Tracker, ClientInfoProviderUser, TrackerStatisticsProvider
    5152 
    5253        private Map entries = new HashMap(); 
     
    5455        private final Tracker.Auditor auditor; 
    5556 
    56         private final ClientInfoProvider clientInfoProvider; 
    57  
    58         public DefaultTracker(ClientInfoProvider clientInfoProvider) { 
    59                 this.clientInfoProvider = clientInfoProvider; 
     57        private ClientInfoProvider clientInfoProvider; 
     58   
     59  private final TrackerStatisticsComputer statisticsComputer = new TrackerStatisticsComputer(); 
     60   
     61  public TrackerStatistics getStatistics() { 
     62    return statisticsComputer.getStatistics(); 
     63  } 
     64 
     65        public DefaultTracker() { 
    6066                this.auditor = (Tracker.Auditor) AuditorFactory.getInstance().get( 
    6167                                Tracker.Auditor.class, this); 
    6268        } 
     69   
     70  public void setClientInfoProvider(ClientInfoProvider clientInfoProvider) { 
     71    this.clientInfoProvider = clientInfoProvider; 
     72  } 
    6373 
    6474        public Set getPeerReferences(NodeIdentifier identifier) { 
     
    123133                                "registration performed with id " + identifier); 
    124134 
    125                 auditor.register(validatedReference); 
     135                nodeConnected(validatedReference); 
     136 
     137                return identifier; 
     138        } 
     139 
     140  private void nodeConnected(PeerReference reference) { 
     141    auditor.register(reference); 
    126142                auditor.connectedNodes(entries.size()); 
    127  
    128                 return identifier; 
    129         } 
    130  
     143     
     144    statisticsComputer.nodeConnected(PeerReferences.isRootNode(reference)); 
     145  } 
     146 
     147  private void nodeDisconnected(PeerReference reference) { 
     148    auditor.unregister(reference); 
     149    auditor.connectedNodes(entries.size()); 
     150     
     151    statisticsComputer.nodeDisconnected(PeerReferences.isRootNode(reference)); 
     152  } 
     153   
    131154        public void unregister(NodeIdentifier identifier) { 
    132155                NodeEntry entry = (NodeEntry) entries.remove(identifier); 
    133156                if (entry != null) { 
    134157                        LogFactory.getLog(getClass()).debug("unregister " + entry); 
    135       auditor.unregister(entry.getReference()); 
     158      nodeDisconnected(entry.getReference()); 
    136159                } else { 
    137160                        String clientHost = "unknown"; 
     
    146169                        LogFactory.getLog(getClass()).warn(msg); 
    147170                } 
    148                  
    149                 auditor.connectedNodes(entries.size()); 
    150171        } 
    151172 
     
    203224                                LogFactory.getLog(getClass()).debug("remove " + entry); 
    204225                                iter.remove(); 
    205                                 auditor.unregister(entry.getReference()); 
    206                         } 
    207                 } 
    208                 auditor.connectedNodes(entries.size()); 
     226        nodeDisconnected(entry.getReference()); 
     227                        } 
     228                } 
    209229        } 
    210230 
     
    288308        } 
    289309 
    290         interface ClientInfoProvider { 
    291  
    292                 public String getClientHost() throws TrackerException; 
    293  
    294         } 
    295  
    296310} 
  • trunk/source/org/kolaka/freecast/tracker/HessianClientInfoProvider.java

    r830 r888  
    2626import com.caucho.services.server.ServiceContext; 
    2727 
    28 final class HessianClientInfoProvider implements DefaultTracker.ClientInfoProvider { 
     28final class HessianClientInfoProvider implements ClientInfoProvider { 
    2929  public String getClientHost() throws TrackerException { 
    3030    return ServiceContext.getContextRequest().getRemoteHost(); 
  • trunk/source/org/kolaka/freecast/tracker/HttpMultiTrackerConnector.java

    r840 r888  
    2626import java.util.Set; 
    2727 
     28import javax.servlet.ServletException; 
     29 
    2830import org.kolaka.freecast.node.NodeIdentifier; 
    2931import org.kolaka.freecast.node.NodeStatus; 
    3032import org.kolaka.freecast.peer.PeerReference; 
    3133 
    32 import com.caucho.hessian.server.HessianServlet; 
    33  
    34 public class HttpMultiTrackerConnector extends HessianServlet implements MultiTracker { 
     34public class HttpMultiTrackerConnector extends HttpTrackerConnector implements MultiTracker { 
    3535 
    3636  private static final long serialVersionUID = 1568160755433034061L; 
    37   private final DefaultMultiTracker tracker; 
     37  private MultiTracker tracker; 
    3838   
    39   public HttpMultiTrackerConnector() { 
    40     tracker = new DefaultMultiTracker(new HessianClientInfoProvider()); 
     39  public void init() throws ServletException { 
     40    super.init(); 
     41    tracker = (MultiTracker) getTracker(); 
    4142  } 
    4243 
  • trunk/source/org/kolaka/freecast/tracker/HttpSimpleTrackerConnector.java

    r830 r888  
    2626import java.util.Set; 
    2727 
     28import javax.servlet.ServletException; 
     29 
    2830import org.kolaka.freecast.node.NodeIdentifier; 
    2931import org.kolaka.freecast.node.NodeStatus; 
    3032import org.kolaka.freecast.peer.PeerReference; 
    3133 
    32 import com.caucho.hessian.server.HessianServlet; 
    33  
    34 public class HttpSimpleTrackerConnector extends HessianServlet implements Tracker { 
     34public class HttpSimpleTrackerConnector extends HttpTrackerConnector implements Tracker { 
    3535 
    3636  private static final long serialVersionUID = 8802338594786705476L; 
    37   private final Tracker tracker; 
    38  
    39   public HttpSimpleTrackerConnector() { 
    40     tracker = new DefaultTracker(new HessianClientInfoProvider()); 
     37  private Tracker tracker; 
     38   
     39  public void init() throws ServletException { 
     40    super.init(); 
     41    tracker = (Tracker) getTracker();  
    4142  } 
    4243 
  • trunk/source/org/kolaka/freecast/tracker/HttpTracker.java

    r840 r888  
    3131import org.mortbay.http.SocketListener; 
    3232import org.mortbay.jetty.Server; 
     33import org.mortbay.jetty.servlet.ServletHolder; 
    3334import org.mortbay.jetty.servlet.ServletHttpContext; 
    3435 
     
    5556        } 
    5657   
    57   public Class connectorClass
    58    
    59   public void setConnectorClass(Class connectorClass) { 
    60     this.connectorClass = connectorClass
     58  private boolean multiTracker
     59 
     60  public void setMultiTracker(boolean multiTracker) { 
     61    this.multiTracker = multiTracker
    6162  } 
    6263 
     
    6465    LogFactory.getLog(Main.class).info( 
    6566        "start a HttpConnector on port " + listenAddress); 
     67     
     68    Class connectorClass = HttpSimpleTrackerConnector.class; 
     69    Object tracker = new DefaultTracker(); 
     70     
     71    if (multiTracker) { 
     72      LogFactory.getLog(Main.class).info("multi network support enabled"); 
     73 
     74      connectorClass = HttpMultiTrackerConnector.class; 
     75      tracker = new DefaultMultiTracker(); 
     76    } 
     77     
    6678    LogFactory.getLog(Main.class).trace( 
    6779        "use connector " + connectorClass.getName()); 
    68     if (connectorClass.equals(HttpMultiTrackerConnector.class)) { 
    69       LogFactory.getLog(Main.class).info("multi network support enabled"); 
    70     } 
    7180 
    7281    server = new Server(); 
     
    8089 
    8190                try { 
    82                         context.addServlet("Tracker", "/tracker", connectorClass.getName()); 
     91                        ServletHolder servletHolder = context.addServlet("Tracker", "/tracker", connectorClass.getName()); 
     92      servletHolder.getServletContext().setAttribute(HttpTrackerConnector.TRACKER_ATTRIBUTE, tracker); 
    8393                } catch (Exception e) { 
    8494                        throw new ControlException("Can't install the tracker servlet", e); 
    8595                } 
     96 
     97    try { 
     98      ServletHolder servletHolder = context.addServlet("Statistics", "/stats.xml", IceStatsServlet.class.getName()); 
     99      servletHolder.getServletContext().setAttribute(IceStatsServlet.STATSPROVIDER_ATTRIBUTE, tracker); 
     100    } catch (Exception e) { 
     101      throw new ControlException("Can't install the statistics servlet", e); 
     102    } 
    86103 
    87104                try { 
  • trunk/source/org/kolaka/freecast/tracker/HttpTrackerConfigurator.java

    r840 r888  
    4242     */  
    4343    String trackerClass = configuration.getString("class", "single"); 
    44     Class connectorClass = HttpSimpleTrackerConnector.class;  
     44    boolean multiTracker = false;  
    4545    if (trackerClass.equals("multi")) { 
    46       connectorClass = HttpMultiTrackerConnector.class
     46      multiTracker = true
    4747    } else if (trackerClass.equals("none")) { 
    4848      throw new NoConfiguredTrackerException(); 
    4949    } 
    50     tracker.setConnectorClass(connectorClass); 
     50    tracker.setMultiTracker(multiTracker); 
    5151     
    5252                Configuration listenAddressConfiguration = configuration