diff options
| -rw-r--r-- | src/rmd_cache.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/src/rmd_cache.c b/src/rmd_cache.c index 9e42be3..5b3323e 100644 --- a/src/rmd_cache.c +++ b/src/rmd_cache.c @@ -42,7 +42,10 @@  #define CACHE_FILE_SIZE_LIMIT (500 * 1024 * 1024) -/* periodic fdatasync thread for cache writers when fdatasyncing is enabled */ +/* Periodic fdatasync thread for cache writers. + * Note all writers create this thread initially to try perform a + * posix_fallocate() of CACHE_FILE_SIZE_LIMIT + */  static void * rmdCacheFileSyncer(CacheFile *file)  {  	struct timespec	delay; @@ -53,14 +56,19 @@ static void * rmdCacheFileSyncer(CacheFile *file)  	rmdThreadsSetName("rmdCacheSyncer"); -	delay.tv_sec = file->periodic_datasync_ms / 1000; -	delay.tv_nsec = (file->periodic_datasync_ms - delay.tv_sec * 1000) * 1000000; -  	if (file->gzfp)  		fd = file->gzfd;  	else  		fd = fileno(file->fp); +	(void) posix_fallocate(fd, 0, CACHE_FILE_SIZE_LIMIT); + +	if (!file->periodic_datasync_ms) +		return NULL; + +	delay.tv_sec = file->periodic_datasync_ms / 1000; +	delay.tv_nsec = (file->periodic_datasync_ms - delay.tv_sec * 1000) * 1000000; +  	for (;;) {  		nanosleep(&delay, NULL);  		fdatasync(fd); @@ -106,7 +114,7 @@ static int _rmdCacheFileOpen(CacheFile *file, const char *path)  	file->chapter_n_bytes = 0; -	if (file->mode == RMD_CACHE_FILE_MODE_WRITE && file->periodic_datasync_ms) +	if (file->mode == RMD_CACHE_FILE_MODE_WRITE)  		pthread_create(&file->syncer_thread, NULL, (void *(*)(void *))rmdCacheFileSyncer, file);  	return 0; @@ -118,7 +126,7 @@ static int _rmdCacheFileClose(CacheFile *file)  {  	assert(file); -	if (file->mode == RMD_CACHE_FILE_MODE_WRITE && file->periodic_datasync_ms) { +	if (file->mode == RMD_CACHE_FILE_MODE_WRITE) {  		pthread_cancel(file->syncer_thread);  		pthread_join(file->syncer_thread, NULL);  	}  | 
