summaryrefslogtreecommitdiffstats
path: root/src/fuse/connection.c
diff options
context:
space:
mode:
authorSimon Rettberg2015-12-02 15:43:40 +0100
committerSimon Rettberg2015-12-02 15:43:40 +0100
commit4a3ea16925c56328f457720749375877d2eb086f (patch)
tree70bfdde8e2d9c117b8e3724db1e6e7ac0c910d87 /src/fuse/connection.c
parent[FUSE] Request alt servers from connected server (diff)
downloaddnbd3-4a3ea16925c56328f457720749375877d2eb086f.tar.gz
dnbd3-4a3ea16925c56328f457720749375877d2eb086f.tar.xz
dnbd3-4a3ea16925c56328f457720749375877d2eb086f.zip
[FUSE] Add virtual status file
Diffstat (limited to 'src/fuse/connection.c')
-rw-r--r--src/fuse/connection.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/fuse/connection.c b/src/fuse/connection.c
index 43e2907..a90a53c 100644
--- a/src/fuse/connection.c
+++ b/src/fuse/connection.c
@@ -213,6 +213,55 @@ void connection_close()
pthread_mutex_unlock( &connection.sendMutex );
}
+int connection_printStats(char *buffer, const int len)
+{
+ int ret;
+ int remaining = len;
+ if ( remaining > 0 ) {
+ ret = snprintf( buffer, remaining, "Image: %s\nRevision: %d\n\nCurrent connection time: %ds\n\n",
+ image.name, (int)image.rid, (int)( (nowMilli() - connection.startupTime) / 1000 ) );
+ if ( ret > 0 ) {
+ remaining -= ret;
+ buffer += ret;
+ }
+ }
+ int i = -1;
+ pthread_spin_lock( &altLock );
+ while ( remaining > 3 && ++i < MAX_ALTS ) {
+ if ( altservers[i].host.type == 0 )
+ continue;
+ if ( isSameAddressPort( &connection.currentServer, &altservers[i].host ) ) {
+ *buffer++ = '*';
+ } else {
+ *buffer++ = ' ';
+ }
+ ret = sock_printHost( &altservers[i].host, buffer, remaining );
+ remaining -= (ret + 1); // For space or * above
+ buffer += ret;
+ if ( remaining < 3 )
+ break;
+ int width = MAX( 35 - ret, 0 );
+ char *unit;
+ int value, failSpaces;
+ if ( altservers[i].rtt > 5000 ) {
+ unit = "ms";
+ value = altservers[i].rtt / 1000;
+ failSpaces = 6;
+ } else {
+ unit = "µs";
+ value = altservers[i].rtt;
+ width += 3;
+ failSpaces = 3;
+ }
+ ret = snprintf( buffer, remaining, "% *d %s Unreachable: % *d\n",
+ width, value, unit, failSpaces, altservers[i].consecutiveFails );
+ remaining -= ret;
+ buffer += ret;
+ }
+ pthread_spin_unlock( &altLock );
+ return len - remaining;
+}
+
static void* connection_receiveThreadMain(void *sockPtr)
{
int sockFd = (int)(size_t)sockPtr;