]> git.saurik.com Git - redis.git/commitdiff
support for blocking VM in config file
authorantirez <antirez@gmail.com>
Tue, 12 Jan 2010 20:23:52 +0000 (15:23 -0500)
committerantirez <antirez@gmail.com>
Tue, 12 Jan 2010 20:23:52 +0000 (15:23 -0500)
TODO
redis.c
redis.conf

diff --git a/TODO b/TODO
index ca8e6ddc2e749420e8f31aeb9c6db7d36b34b90f..cfd21b763cb3ae8d8c2454d139e1587d19fa8300 100644 (file)
--- a/TODO
+++ b/TODO
@@ -16,6 +16,7 @@ Virtual Memory sub-TODO:
 * Divide swappability of objects by refcount
 * vm-swap-file <filename>. The swap file should go where the user wants, and if it's already there and of the right size we can avoid to create it again.
 * it should be possible to give the vm-max-memory option in megabyte, gigabyte, ..., just using 2GB, 100MB, and so forth.
+* Make sure to wait all the IO threads are done before to fork() for BGSAVE and BGREWRITEAOF
 
 VERSION 1.6 TODO (Virtual memory)
 =================================
diff --git a/redis.c b/redis.c
index 43a0bf783117fd965543f38f6a8215436513d1e0..009493eb5c5fe62902d810e28bf1c617ad554e1a 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -1262,18 +1262,23 @@ static int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientD
         while (server.vm_enabled && zmalloc_used_memory() >
                 server.vm_max_memory)
         {
+            int retval;
+
             if (tryFreeOneObjectFromFreelist() == REDIS_OK) continue;
-            if (vmSwapOneObjectThreaded() == REDIS_ERR) {
-                if ((loops % 30) == 0 && zmalloc_used_memory() >
-                    (server.vm_max_memory+server.vm_max_memory/10)) {
-                    redisLog(REDIS_WARNING,"WARNING: vm-max-memory limit exceeded by more than 10%% but unable to swap more objects out!");
-                }
+            retval = (server.vm_max_threads == 0) ?
+                        vmSwapOneObjectBlocking() :
+                        vmSwapOneObjectThreaded();
+            if (retval == REDIS_ERR && (loops % 30) == 0 &&
+                zmalloc_used_memory() >
+                (server.vm_max_memory+server.vm_max_memory/10))
+            {
+                redisLog(REDIS_WARNING,"WARNING: vm-max-memory limit exceeded by more than 10%% but unable to swap more objects out!");
             }
-            /* Note that we freed just one object, because anyway when
-             * the I/O thread in charge to swap this object out will
-             * do its work, the handler of completed jobs will try to swap
-             * more objects if we are out of memory. */
-            break;
+            /* Note that when using threade I/O we free just one object,
+             * because anyway when the I/O thread in charge to swap this
+             * object out will finish, the handler of completed jobs
+             * will try to swap more objects if we are still out of memory. */
+            if (retval == REDIS_ERR || server.vm_max_threads > 0) break;
         }
     }
 
index b541cbe203351b8dd4093a292dd2f309dc356a2f..f675ac203143716e2c02a17467e9afa6bc175e0e 100644 (file)
@@ -222,6 +222,9 @@ vm-pages 104857600
 # number of threads can help with big objects even if they can't help with
 # I/O itself as the physical device may not be able to couple with many
 # reads/writes operations at the same time.
+#
+# The special value of 0 turn off threaded I/O and enables the blocking
+# Virtual Memory implementation.
 vm-max-threads 4
 
 ############################### ADVANCED CONFIG ###############################