added additional statistics from turtle router. Needs full recompilation.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4221 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2011-05-26 22:11:06 +00:00
parent 265650c88d
commit 4d846513e2
7 changed files with 183 additions and 12 deletions

View file

@ -58,6 +58,18 @@ struct TurtleRequestDisplayInfo
uint32_t depth ; // Depth of the request. Might be altered.
};
class TurtleTrafficStatisticsInfo
{
public:
float unknown_updn_Bps ; // unknown data transit bitrate (in Bytes per sec.)
float data_up_Bps ; // upload (in Bytes per sec.)
float data_dn_Bps ; // download (in Bytes per sec.)
float tr_up_Bps ; // tunnel requests upload bitrate (in Bytes per sec.)
float tr_dn_Bps ; // tunnel requests dnload bitrate (in Bytes per sec.)
float total_up_Bps ; // turtle network management bitrate (in Bytes per sec.)
float total_dn_Bps ; // turtle network management bitrate (in Bytes per sec.)
};
// Interface class for turtle hopping.
//
// This class mainly interacts with the turtle router, that is responsible
@ -100,9 +112,14 @@ class RsTurtle
virtual void stopMonitoringFileTunnels(const std::string& file_hash) = 0 ;
// Get info from the turtle router. I use std strings to hide the internal structs.
//
virtual void getInfo(std::vector<std::vector<std::string> >&,std::vector<std::vector<std::string> >&,
std::vector<TurtleRequestDisplayInfo>&,std::vector<TurtleRequestDisplayInfo>&) const = 0;
// Get info about turtle traffic. See TurtleTrafficStatisticsInfo members for details.
//
virtual void getTrafficStatistics(TurtleTrafficStatisticsInfo& info) const = 0;
// Convenience function.
virtual bool isTurtlePeer(const std::string& peer_id) const = 0 ;

View file

@ -102,6 +102,8 @@ p3turtle::p3turtle(p3ConnectMgr *cm,ftServer *fs)
_last_tunnel_management_time = 0 ;
_last_tunnel_campaign_time = 0 ;
_last_tunnel_speed_estimate_time = 0 ;
_traffic_info.reset() ;
}
int p3turtle::tick()
@ -139,8 +141,15 @@ int p3turtle::tick()
#endif
manageTunnels() ;
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
_last_tunnel_management_time = now ;
{
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
_last_tunnel_management_time = now ;
// update traffic statistics
_traffic_info = _traffic_info*0.75 + _traffic_info_buffer*0.25 ;
_traffic_info_buffer.reset() ;
}
}
// Clean every 10 sec.
@ -880,7 +889,7 @@ void p3turtle::routeGenericTunnelItem(RsTurtleGenericTunnelItem *item)
if(item->shouldStampTunnel())
tunnel.time_stamp = time(NULL) ;
tunnel.transfered_bytes += item->serial_size() ;
tunnel.transfered_bytes += static_cast<RsTurtleItem*>(item)->serial_size() ;
// Let's figure out whether this packet is for us or not.
@ -891,6 +900,8 @@ void p3turtle::routeGenericTunnelItem(RsTurtleGenericTunnelItem *item)
#endif
item->PeerId(tunnel.local_src) ;
_traffic_info_buffer.unknown_updn_Bps += static_cast<RsTurtleItem*>(item)->serial_size() ;
sendItem(item) ;
return ;
}
@ -902,6 +913,8 @@ void p3turtle::routeGenericTunnelItem(RsTurtleGenericTunnelItem *item)
#endif
item->PeerId(tunnel.local_dst) ;
_traffic_info_buffer.unknown_updn_Bps += static_cast<RsTurtleItem*>(item)->serial_size() ;
sendItem(item) ;
return ;
}
@ -1000,6 +1013,8 @@ void p3turtle::handleRecvFileData(RsTurtleFileDataItem *item)
{
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
_traffic_info_buffer.data_dn_Bps += static_cast<RsTurtleItem*>(item)->serial_size() ;
std::map<TurtleTunnelId,TurtleTunnel>::iterator it2(_local_tunnels.find(item->tunnel_id)) ;
if(it2 == _local_tunnels.end())
@ -1251,7 +1266,7 @@ void p3turtle::sendFileData(const std::string& peerId, const std::string& , uint
item->chunk_size = chunksize ;
item->chunk_data = malloc(chunksize) ;
tunnel.transfered_bytes += item->serial_size();
tunnel.transfered_bytes += static_cast<RsTurtleItem*>(item)->serial_size();
if(item->chunk_data == NULL)
{
@ -1265,6 +1280,8 @@ void p3turtle::sendFileData(const std::string& peerId, const std::string& , uint
#ifdef P3TURTLE_DEBUG
std::cerr << "p3turtle: sending file data (chunksize=" << item->chunk_size << ", offset=" << item->chunk_offset << ", hash=0x" << hash << ") through tunnel " << (void*)item->tunnel_id << ", next peer=" << tunnel.local_src << std::endl ;
#endif
_traffic_info_buffer.data_up_Bps += static_cast<RsTurtleItem*>(item)->serial_size() ;
sendItem(item) ;
}
@ -1524,6 +1541,8 @@ void p3turtle::handleTunnelRequest(RsTurtleOpenTunnelItem *item)
{
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
_traffic_info_buffer.tr_dn_Bps += static_cast<RsTurtleItem*>(item)->serial_size() ;
std::map<TurtleTunnelRequestId,TurtleRequestInfo>::iterator it = _tunnel_requests_origins.find(item->request_id) ;
if(it != _tunnel_requests_origins.end())
@ -1606,6 +1625,8 @@ void p3turtle::handleTunnelRequest(RsTurtleOpenTunnelItem *item)
res_item->tunnel_id = item->partial_tunnel_id ^ generatePersonalFilePrint(item->file_hash,false) ;
res_item->PeerId(item->PeerId()) ;
_traffic_info_buffer.tr_up_Bps += static_cast<RsTurtleItem*>(res_item)->serial_size() ;
sendItem(res_item) ;
// Note in the tunnels list that we have an ending tunnel here.
@ -1660,6 +1681,11 @@ void p3turtle::handleTunnelRequest(RsTurtleOpenTunnelItem *item)
++(fwd_item->depth) ; // increase tunnel depth
fwd_item->PeerId(*it) ;
{
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
_traffic_info_buffer.tr_up_Bps += static_cast<RsTurtleItem*>(fwd_item)->serial_size() ;
}
sendItem(fwd_item) ;
}
}
@ -2038,6 +2064,12 @@ static std::string printNumber(uint64_t num,bool hex=false)
}
}
void p3turtle::getTrafficStatistics(TurtleTrafficStatisticsInfo& info) const
{
RsStackMutex stack(mTurtleMtx); /********** STACK LOCKED MTX ******/
info = _traffic_info ;
}
void p3turtle::getInfo( std::vector<std::vector<std::string> >& hashes_info,
std::vector<std::vector<std::string> >& tunnels_info,
std::vector<TurtleRequestDisplayInfo >& search_reqs_info,

View file

@ -148,6 +148,7 @@
#include "ft/ftsearch.h"
#include "retroshare/rsturtle.h"
#include "rsturtleitem.h"
#include "turtlestatistics.h"
//#define TUNNEL_STATISTICS
@ -247,6 +248,8 @@ class p3turtle: public p3Service, /*public pqiMonitor,*/ public RsTurtle,/* publ
std::vector<TurtleRequestDisplayInfo >&,
std::vector<TurtleRequestDisplayInfo >&) const ;
virtual void getTrafficStatistics(TurtleTrafficStatisticsInfo& info) const ;
#ifdef TO_REMOVE
/************* from pqiMonitor *******************/
/// Informs the turtle router that some peers are (dis)connected. This should initiate digging new tunnels,
@ -410,6 +413,11 @@ class p3turtle: public p3Service, /*public pqiMonitor,*/ public RsTurtle,/* publ
///
uint32_t _random_bias ;
// Used to collect statistics on turtle traffic.
//
TurtleTrafficStatisticsInfoOp _traffic_info ; // used for recording speed
TurtleTrafficStatisticsInfoOp _traffic_info_buffer ; // used as a buffer to collect bytes
#ifdef P3TURTLE_DEBUG
// debug function
void dumpState() ;

View file

@ -0,0 +1,51 @@
#include <retroshare/rsturtle.h>
class TurtleTrafficStatisticsInfoOp: public TurtleTrafficStatisticsInfo
{
public:
TurtleTrafficStatisticsInfoOp()
{
reset() ;
}
void reset()
{
unknown_updn_Bps = 0.0f ;
data_up_Bps = 0.0f ;
data_dn_Bps = 0.0f ;
tr_up_Bps = 0.0f ;
tr_dn_Bps = 0.0f ;
total_up_Bps = 0.0f ;
total_dn_Bps = 0.0f ;
}
TurtleTrafficStatisticsInfoOp operator*(float f) const
{
TurtleTrafficStatisticsInfoOp i(*this) ;
i.unknown_updn_Bps *= f ;
i.data_up_Bps *= f ;
i.data_dn_Bps *= f ;
i.tr_up_Bps *= f ;
i.tr_dn_Bps *= f ;
i.total_up_Bps *= f ;
i.total_dn_Bps *= f ;
return i ;
}
TurtleTrafficStatisticsInfoOp operator+(const TurtleTrafficStatisticsInfoOp& j) const
{
TurtleTrafficStatisticsInfoOp i(*this) ;
i.unknown_updn_Bps += j.unknown_updn_Bps ;
i.data_up_Bps += j.data_up_Bps ;
i.data_dn_Bps += j.data_dn_Bps ;
i.tr_up_Bps += j.tr_up_Bps ;
i.tr_dn_Bps += j.tr_dn_Bps ;
i.total_up_Bps += j.total_up_Bps ;
i.total_dn_Bps += j.total_dn_Bps ;
return i ;
}
};