summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
0ca4750)
If enough space cannot be deleted in the disk cache, drop nearly all clean
data from memory so that most disk cache files are unreferenced, then make
another pass to delete log/cache files.
* memory-mapped from log file or similar, so the kernel can drop this clean
* data from memory for us and hence memory management isn't too important.
* Mainly, we'll want to drop references to data that hasn't been accessed in a
* memory-mapped from log file or similar, so the kernel can drop this clean
* data from memory for us and hence memory management isn't too important.
* Mainly, we'll want to drop references to data that hasn't been accessed in a
- * while so that it is possible to reclaim log segments on disk. */
-static void flushd_clean(BlueSkyFS *fs)
+ * while so that it is possible to reclaim log segments on disk.
+ *
+ * If aggressive is set, try much harder to drop data from the caches to free
+ * up space. */
+static void flushd_clean(BlueSkyFS *fs, int aggressive)
{
g_mutex_lock(fs->lock);
{
g_mutex_lock(fs->lock);
inode = fs->accessed_list.prev->data;
uint64_t elapsed = bluesky_get_current_time() - inode->access_time;
inode = fs->accessed_list.prev->data;
uint64_t elapsed = bluesky_get_current_time() - inode->access_time;
- if (elapsed < CACHE_DROP_DELAY)
+ if (elapsed < CACHE_DROP_DELAY && !aggressive)
break;
if (bluesky_verbose) {
break;
if (bluesky_verbose) {
files = g_list_delete_link(files, files);
}
g_list_free(files);
files = g_list_delete_link(files, files);
}
g_list_free(files);
+ g_print("\nEnding cache size: %d kB\n", fs->log->disk_used);
g_mutex_unlock(fs->log->mmap_lock);
}
g_mutex_unlock(fs->log->mmap_lock);
}
flushd_dirty(fs);
flushd_cloud(fs);
flushd_dirty(fs);
flushd_cloud(fs);
bluesky_cachefile_gc(fs);
bluesky_cachefile_gc(fs);
+
+ /* If running out of disk cache space, make another more aggressive pass to
+ * free up space. */
+ if (g_atomic_int_get(&fs->log->disk_used) > bluesky_options.cache_size) {
+ g_print("Still short on disk space, trying again to free space...\n");
+ flushd_clean(fs, 1);
+ bluesky_cachefile_gc(fs);
+ }
+
g_mutex_unlock(fs->flushd_lock);
return NULL;
g_mutex_unlock(fs->flushd_lock);
return NULL;