summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsr2013-01-06 20:14:41 +0100
committersr2013-01-06 20:14:41 +0100
commitddc9be6a043339d75bd19e2d2108483f6ec1d08c (patch)
tree9692bdcfb2b69b138b76d1d9fe10dfa9f9c12ea8
parent[SERVER] Fix nullpointer deref when last image is deleted (diff)
downloaddnbd3-ddc9be6a043339d75bd19e2d2108483f6ec1d08c.tar.gz
dnbd3-ddc9be6a043339d75bd19e2d2108483f6ec1d08c.tar.xz
dnbd3-ddc9be6a043339d75bd19e2d2108483f6ec1d08c.zip
[SERVER] Ignore trusted server if soft- or hard-deadline for an image has been reached
-rw-r--r--src/server/job.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/server/job.c b/src/server/job.c
index 6281b3a..cc3065c 100644
--- a/src/server/job.c
+++ b/src/server/job.c
@@ -526,6 +526,13 @@ static void query_servers()
if (local_image == NULL && trust->auto_replicate)
{
pthread_spin_unlock(&_spinlock);
+ const time_t deadline = time(NULL) + 60;
+ if ((softdelete != 0 && softdelete < deadline)
+ || (harddelete != 0 && harddelete < deadline))
+ { // Image is already about to be deleted, ignore it
+ printf("[DEBUG] Not replicating old image: '%s'\n", xmlbuffer);
+ goto free_current_image;
+ }
// Image is NEW, add it!
dnbd3_image_t newimage;
char cachefile[90];
@@ -550,12 +557,16 @@ static void query_servers()
else if (local_image != NULL)
{
// Image is already KNOWN, add alt server if appropriate
- if (local_image->filesize == 0) // Size is unknown, just assume the trusted server got it right
- local_image->filesize = size;
- if (size != local_image->filesize)
- printf("[DEBUG] Ignoring remote image '%s' because it has a different size from the local version! (remote: %llu, local: %llu)\n", local_image->config_group, size, (unsigned long long)local_image->filesize);
- else
- add_alt_server(local_image, &host);
+ const time_t deadline = time(NULL) + 60;
+ if (softdelete == 0 || softdelete > deadline)
+ {
+ if (local_image->filesize == 0) // Size is unknown, just assume the trusted server got it right
+ local_image->filesize = size;
+ if (size != local_image->filesize)
+ printf("[DEBUG] Ignoring remote image '%s' because it has a different size from the local version! (remote: %llu, local: %llu)\n", local_image->config_group, size, (unsigned long long)local_image->filesize);
+ else
+ add_alt_server(local_image, &host);
+ }
if (local_image->cache_file && trust->auto_replicate) {
local_image->delete_hard = harddelete;
local_image->delete_soft = softdelete;