diff options
author | Simon Rettberg | 2017-09-02 18:03:15 +0200 |
---|---|---|
committer | Simon Rettberg | 2017-09-02 18:03:15 +0200 |
commit | 9858ab5bbb2fc5d1569257c0ee8f794fdae1c512 (patch) | |
tree | 7bb448cc73f852f5ed0f258daf8c9280755bb52d /src/server/image.c | |
parent | [*] Continue splitting #defines to clientconfig.h etc. (diff) | |
download | dnbd3-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.c | 26 |
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() { |