(trunk libT) fsync busy files every 15 seconds or so. On linux, use posix_fadvise() to tell the system no to cache torrent blocks

This commit is contained in:
Charles Kerr 2009-01-26 00:36:34 +00:00
parent 9d7c74cc8a
commit 1e8c374fd5
1 changed files with 15 additions and 2 deletions

View File

@ -79,6 +79,9 @@ enum
{
NOFILE_BUFFER = 512, /* the process' number of open files is
globalMaxPeers + NOFILE_BUFFER */
SYNC_INTERVAL = 15 /* (arbitrary number) how many seconds to go
between fsync calls for files in heavy use */
};
struct tr_openfile
@ -89,6 +92,7 @@ struct tr_openfile
char filename[MAX_PATH_LENGTH];
int fd;
uint64_t date;
time_t syncAt;
};
struct tr_fd_s
@ -387,8 +391,7 @@ tr_fdFileCheckout( const char * folder,
}
else
{
dbgmsg(
"everything's full! waiting for someone else to finish something" );
dbgmsg( "everything's full! waiting for someone else to finish something" );
tr_lockUnlock( gFd->lock );
tr_wait( 200 );
tr_lockLock( gFd->lock );
@ -410,6 +413,7 @@ tr_fdFileCheckout( const char * folder,
doWrite ? 'y' : 'n' );
tr_strlcpy( o->filename, filename, sizeof( o->filename ) );
o->isWritable = doWrite;
o->syncAt = time( NULL ) + SYNC_INTERVAL;
}
dbgmsg( "checking out '%s' in slot %d", filename, winner );
@ -437,6 +441,15 @@ tr_fdFileReturn( int fd )
o->isCheckedOut = 0;
if( o->closeWhenDone )
TrCloseFile( i );
else if( o->syncAt <= time( NULL ) ) {
dbgmsg( "fsync()ing file '%s' in slot #%d", o->filename, i );
fsync( o->fd );
#ifdef HAVE_POSIX_FADVISE
/* TODO: test performance with and without this */
posix_fadvise( o->fd, 0, 0, POSIX_FADV_DONTNEED );
#endif
o->syncAt = time( NULL ) + SYNC_INTERVAL;
}
break;
}