summaryrefslogtreecommitdiffstats
path: root/src/server/image.c
diff options
context:
space:
mode:
authorSimon Rettberg2015-01-28 19:06:40 +0100
committerSimon Rettberg2015-01-28 19:06:40 +0100
commit7e0a4560dd7169a3e5177272f99ad5cef51b369a (patch)
treebe15ea1c5935ced528f4ffdefee5677e6a6eded6 /src/server/image.c
parent[SERVER] Also fix fd leak if uplink_init fails (diff)
downloaddnbd3-7e0a4560dd7169a3e5177272f99ad5cef51b369a.tar.gz
dnbd3-7e0a4560dd7169a3e5177272f99ad5cef51b369a.tar.xz
dnbd3-7e0a4560dd7169a3e5177272f99ad5cef51b369a.zip
[SERVER] Implement proper keep alive for uplinks
Diffstat (limited to 'src/server/image.c')
-rw-r--r--src/server/image.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/server/image.c b/src/server/image.c
index d20a149..81c649d 100644
--- a/src/server/image.c
+++ b/src/server/image.c
@@ -32,7 +32,7 @@ pthread_spinlock_t _images_lock;
static pthread_mutex_t remoteCloneLock = PTHREAD_MUTEX_INITIALIZER;
#define NAMELEN 500
-#define CACHELEN 100
+#define CACHELEN 20
typedef struct
{
char name[NAMELEN];
@@ -890,14 +890,16 @@ dnbd3_image_t* image_getOrClone(char *name, uint16_t revision)
const time_t now = time( NULL );
char *cmpname = name;
+ int useIndex = -1;
if ( len >= NAMELEN ) cmpname += 1 + len - NAMELEN;
pthread_mutex_lock( &remoteCloneLock );
for (i = 0; i < CACHELEN; ++i) {
- if ( remoteCloneCache[i].rid != revision
- || remoteCloneCache[i].deadline < now
- || strcmp( cmpname, remoteCloneCache[i].name ) != 0 ) continue;
- pthread_mutex_unlock( &remoteCloneLock ); // Was recently checked...
- return image_get( name, revision, true );
+ if ( remoteCloneCache[i].rid == revision && strcmp( cmpname, remoteCloneCache[i].name ) == 0 ) {
+ useIndex = i;
+ if ( remoteCloneCache[i].deadline < now ) break;
+ pthread_mutex_unlock( &remoteCloneLock ); // Was recently checked...
+ return image_get( name, revision, true );
+ }
}
// Re-check to prevent two clients at the same time triggering this
image = image_get( name, revision, true );
@@ -908,10 +910,12 @@ dnbd3_image_t* image_getOrClone(char *name, uint16_t revision)
// Reaching this point means we should contact an authority server
serialized_buffer_t serialized;
// Mark as recently checked
- remoteCloneCacheIndex = (remoteCloneCacheIndex + 1) % CACHELEN;
- remoteCloneCache[remoteCloneCacheIndex].deadline = now + SERVER_REMOTE_IMAGE_CHECK_CACHETIME;
- snprintf( remoteCloneCache[remoteCloneCacheIndex].name, NAMELEN, "%s", cmpname );
- remoteCloneCache[remoteCloneCacheIndex].rid = revision;
+ if ( useIndex == -1 ) {
+ useIndex = remoteCloneCacheIndex = (remoteCloneCacheIndex + 1) % CACHELEN;
+ }
+ remoteCloneCache[useIndex].deadline = now + SERVER_REMOTE_IMAGE_CHECK_CACHETIME;
+ snprintf( remoteCloneCache[useIndex].name, NAMELEN, "%s", cmpname );
+ remoteCloneCache[useIndex].rid = revision;
// Get some alt servers and try to get the image from there
dnbd3_host_t servers[4];
int uplinkSock = -1;