summaryrefslogtreecommitdiffstats
path: root/src/server/image.c
diff options
context:
space:
mode:
authorSimon Rettberg2017-09-02 18:03:15 +0200
committerSimon Rettberg2017-09-02 18:03:15 +0200
commit9858ab5bbb2fc5d1569257c0ee8f794fdae1c512 (patch)
tree7bb448cc73f852f5ed0f258daf8c9280755bb52d /src/server/image.c
parent[*] Continue splitting #defines to clientconfig.h etc. (diff)
downloaddnbd3-9858ab5bbb2fc5d1569257c0ee8f794fdae1c512.tar.gz
dnbd3-9858ab5bbb2fc5d1569257c0ee8f794fdae1c512.tar.xz
dnbd3-9858ab5bbb2fc5d1569257c0ee8f794fdae1c512.zip
[SERVER] Implement closeUnusedFd config option
This will close the readFd of images that have no active clients after some idle period (1 hour currently). Prevents deleted images from taking up space until the server is shut down.
Diffstat (limited to 'src/server/image.c')
-rw-r--r--src/server/image.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/server/image.c b/src/server/image.c
index 5b1a582..cc5915d 100644
--- a/src/server/image.c
+++ b/src/server/image.c
@@ -1662,6 +1662,32 @@ static bool image_ensureDiskSpace(uint64_t size)
return false;
}
+void image_closeUnusedFd()
+{
+ int fd, i;
+ time_t deadline = time( NULL ) - UNUSED_FD_TIMEOUT;
+ spin_lock( &imageListLock );
+ for (i = 0; i < _num_images; ++i) {
+ dnbd3_image_t * const image = _images[i];
+ if ( image == NULL )
+ continue;
+ spin_lock( &image->lock );
+ spin_unlock( &imageListLock );
+ if ( image->users == 0 && image->atime < deadline ) {
+ fd = image->readFd;
+ image->readFd = -1;
+ } else {
+ fd = -1;
+ }
+ spin_unlock( &image->lock );
+ if ( fd != -1 ) {
+ close( fd );
+ }
+ spin_lock( &imageListLock );
+ }
+ spin_unlock( &imageListLock );
+}
+
/*
void image_find_latest()
{