]> git.saurik.com Git - redis.git/commitdiff
Stop using /dev/null to find out the serialized object length
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Sun, 21 Nov 2010 15:27:47 +0000 (16:27 +0100)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Sun, 21 Nov 2010 15:31:27 +0000 (16:31 +0100)
Now the rdbSave* functions return the number of bytes written (or
required to write) in serializing a Redis object, writing to /dev/null
and using ftell (which doesn't work on FreeBSD) isn't needed anymore.

src/debug.c
src/rdb.c
src/redis.c
src/redis.h
src/vm.c

index b364dd1635ad9acef4569d486ef77d331aa5f967..9e97868ddf35148db63091346acdd03128e33be1 100644 (file)
@@ -216,7 +216,7 @@ void debugCommand(redisClient *c) {
                 "encoding:%s serializedlength:%lld "
                 "lru:%d lru_seconds_idle:%lu",
                 (void*)val, val->refcount,
-                strenc, (long long) rdbSavedObjectLen(val,NULL),
+                strenc, (long long) rdbSavedObjectLen(val),
                 val->lru, estimateObjectIdleTime(val));
         } else {
             vmpointer *vp = (vmpointer*) val;
index 913938a324ec1a80db482b31f5f61ff8a838b0be..5e69a32443a31f673b9a825dc80492a739fbc15b 100644 (file)
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -389,20 +389,15 @@ int rdbSaveObject(FILE *fp, robj *o) {
  * the rdbSaveObject() function. Currently we use a trick to get
  * this length with very little changes to the code. In the future
  * we could switch to a faster solution. */
-off_t rdbSavedObjectLen(robj *o, FILE *fp) {
-    int nwritten;
-    if (fp == NULL) fp = server.devnull;
-    rewind(fp);
-
-    /* Determining the saved length of an object should never return -1 */
-    redisAssert((nwritten = rdbSaveObject(fp,o)) != -1);
-    return nwritten;
+off_t rdbSavedObjectLen(robj *o) {
+    int len = rdbSaveObject(NULL,o);
+    redisAssert(len != -1);
+    return len;
 }
 
 /* Return the number of pages required to save this object in the swap file */
-off_t rdbSavedObjectPages(robj *o, FILE *fp) {
-    off_t bytes = rdbSavedObjectLen(o,fp);
-
+off_t rdbSavedObjectPages(robj *o) {
+    off_t bytes = rdbSavedObjectLen(o);
     return (bytes+(server.vm_page_size-1))/server.vm_page_size;
 }
 
index cf5673a3aa4ce7e9276ba4feffe98e1c93c3edee..5b39c011f537e5e4e6845e483c3b4b90449e1bc1 100644 (file)
@@ -814,11 +814,6 @@ void initServer() {
     setupSigSegvAction();
 
     server.mainthread = pthread_self();
-    server.devnull = fopen("/dev/null","w");
-    if (server.devnull == NULL) {
-        redisLog(REDIS_WARNING, "Can't open /dev/null: %s", server.neterr);
-        exit(1);
-    }
     server.clients = listCreate();
     server.slaves = listCreate();
     server.monitors = listCreate();
index 087002bf72fe44e8ccdb9494270ec1595b1b197c..11e4e557f312a928942f2d7e9d479d463ef5abaa 100644 (file)
@@ -481,7 +481,6 @@ struct redisServer {
     dict *pubsub_channels; /* Map channels to list of subscribed clients */
     list *pubsub_patterns; /* A list of pubsub_patterns */
     /* Misc */
-    FILE *devnull;
     unsigned lruclock:22;        /* clock incrementing every minute, for LRU */
     unsigned lruclock_padding:10;
 };
@@ -743,8 +742,8 @@ int rdbSaveBackground(char *filename);
 void rdbRemoveTempFile(pid_t childpid);
 int rdbSave(char *filename);
 int rdbSaveObject(FILE *fp, robj *o);
-off_t rdbSavedObjectPages(robj *o, FILE *fp);
-off_t rdbSavedObjectLen(robj *o, FILE *fp);
+off_t rdbSavedObjectLen(robj *o);
+off_t rdbSavedObjectPages(robj *o);
 robj *rdbLoadObject(int type, FILE *fp);
 void backgroundSaveDoneHandler(int statloc);
 
index c2e0d9ed475bfe1b4576d00cf58d7118127a69a7..ac0d92e332cf091b88c5caeb2b3a9b439869a2a5 100644 (file)
--- a/src/vm.c
+++ b/src/vm.c
@@ -263,7 +263,7 @@ int vmWriteObjectOnSwap(robj *o, off_t page) {
  * If we can't find enough contiguous empty pages to swap the object on disk
  * NULL is returned. */
 vmpointer *vmSwapObjectBlocking(robj *val) {
-    off_t pages = rdbSavedObjectPages(val,NULL);
+    off_t pages = rdbSavedObjectPages(val);
     off_t page;
     vmpointer *vp;
 
@@ -821,9 +821,7 @@ void *IOThreadEntryPoint(void *arg) {
             vmpointer *vp = (vmpointer*)j->id;
             j->val = vmReadObjectFromSwap(j->page,vp->vtype);
         } else if (j->type == REDIS_IOJOB_PREPARE_SWAP) {
-            FILE *fp = fopen("/dev/null","w+");
-            j->pages = rdbSavedObjectPages(j->val,fp);
-            fclose(fp);
+            j->pages = rdbSavedObjectPages(j->val);
         } else if (j->type == REDIS_IOJOB_DO_SWAP) {
             if (vmWriteObjectOnSwap(j->val,j->page) == REDIS_ERR)
                 j->canceled = 1;