From ec507460768fb9ebe0bf037855864e9a94f3b36a Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 12 Nov 2013 18:37:30 +0100 Subject: [SERVER] Save cache maps every 30 mins --- src/config.h | 1 + src/server/altservers.c | 9 +++++++++ src/server/image.c | 14 +++++++++++++- src/server/image.h | 2 ++ 4 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/config.h b/src/config.h index 0228ae9..ba908ae 100644 --- a/src/config.h +++ b/src/config.h @@ -33,6 +33,7 @@ #define SERVER_BAD_UPLINK_IGNORE 120 // How many seconds is a server considered bad? #define SERVER_UPLINK_QUEUELEN_THRES 900 #define SERVER_MAX_PENDING_ALT_CHECKS 50 +#define SERVER_CACHE_MAP_SAVE_INTERVAL 1800 // +++++ Other magic constants #define SERVER_RTT_PROBES 5 diff --git a/src/server/altservers.c b/src/server/altservers.c index 8962e15..7360791 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -5,6 +5,7 @@ #include "memlog.h" #include "helper.h" #include "globals.h" +#include "image.h" #include #include #include @@ -344,6 +345,7 @@ static void *altservers_main(void *data) dnbd3_host_t servers[ALTS + 1]; serialized_buffer_t serialized; struct timespec start, end; + time_t nextCacheMapSave = time(NULL) + 120; setThreadName( "altserver-check" ); blockNoncriticalSignals(); @@ -518,6 +520,13 @@ static void *altservers_main(void *data) pending[itLink] = NULL; pthread_mutex_unlock( &pendingLockConsume ); } + // Save cache maps of all images if applicable + const time_t now = time(NULL); + if (now > nextCacheMapSave) { + nextCacheMapSave = now + SERVER_CACHE_MAP_SAVE_INTERVAL; + printf("[DEBUG] Saving cache maps...\n"); + image_saveAllCacheMaps(); + } } cleanup: ; if ( fdEpoll != -1 ) close( fdEpoll ); diff --git a/src/server/image.c b/src/server/image.c index 53b8aea..40de3fd 100644 --- a/src/server/image.c +++ b/src/server/image.c @@ -155,6 +155,18 @@ void image_markComplete(dnbd3_image_t *image) remove( mapfile ); } +/** + * Save cache map of every image + */ +void image_saveAllCacheMaps() +{ + spin_lock( &_images_lock ); + for (int i = 0; i < _num_images; ++i) { + image_saveCacheMap( _images[i] ); + } + spin_unlock( &_images_lock ); +} + /** * Saves the cache map of the given image. * Return TRUE on success. @@ -1173,7 +1185,7 @@ static int image_ensureDiskSpace(uint64_t size) if ( oldest->atime == 0 ) mtime = file_lastModification( oldest->path ); } else if ( oldest->atime == 0 && current->atime == 0 ) { // Oldest access time is 0 (=never used since server startup), so take file modification time into account - const time_t m = file_lastModification(current->path ); + const time_t m = file_lastModification( current->path ); if ( m < mtime ) { mtime = m; oldest = current; diff --git a/src/server/image.h b/src/server/image.h index 5d6f027..5ed2f97 100644 --- a/src/server/image.h +++ b/src/server/image.h @@ -14,6 +14,8 @@ void image_updateCachemap(dnbd3_image_t *image, uint64_t start, uint64_t end, co void image_markComplete(dnbd3_image_t *image); +void image_saveAllCacheMaps(); + int image_saveCacheMap(dnbd3_image_t *image); dnbd3_image_t* image_get(char *name, uint16_t revision); -- cgit v1.2.3-55-g7522