summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Rettberg2013-11-12 18:37:30 +0100
committerSimon Rettberg2013-11-12 18:37:30 +0100
commitec507460768fb9ebe0bf037855864e9a94f3b36a (patch)
treed724ad0e6f70365d73539362aba6ffa5b7444d40 /src
parentMerge branch 'simon' of dnbd3:dnbd3 into simon (diff)
downloaddnbd3-ec507460768fb9ebe0bf037855864e9a94f3b36a.tar.gz
dnbd3-ec507460768fb9ebe0bf037855864e9a94f3b36a.tar.xz
dnbd3-ec507460768fb9ebe0bf037855864e9a94f3b36a.zip
[SERVER] Save cache maps every 30 mins
Diffstat (limited to 'src')
-rw-r--r--src/config.h1
-rw-r--r--src/server/altservers.c9
-rw-r--r--src/server/image.c14
-rw-r--r--src/server/image.h2
4 files changed, 25 insertions, 1 deletions
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 <stdlib.h>
#include <unistd.h>
#include <sys/epoll.h>
@@ -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
@@ -156,6 +156,18 @@ void image_markComplete(dnbd3_image_t *image)
}
/**
+ * 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.
* Locks on: image.lock
@@ -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);