From 1190c6cbf7f240691fee0d8fb21a7c19938116be Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 4 Jan 2011 19:03:23 +0100 Subject: [PATCH] handle end of space on device in a better way --- src/diskstore.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/diskstore.c b/src/diskstore.c index 3e0ad406ffaf..7250390eb87d 100644 --- a/src/diskstore.c +++ b/src/diskstore.c @@ -191,7 +191,16 @@ int dsSet(redisDb *db, robj *key, robj *val) { len = dsKeyToPath(db,buf,key); memcpy(buf2,buf,len); snprintf(buf2+len,sizeof(buf2)-len,"_%ld_%ld",(long)time(NULL),(long)val); - fp = fopen(buf2,"w"); + while ((fp = fopen(buf2,"w")) == NULL) { + if (errno == ENOSPC) { + redisLog(REDIS_WARNING,"Diskstore: No space left on device. Please make room and wait 30 seconds for Redis to continue."); + sleep(30); + } else { + redisLog(REDIS_WARNING,"diskstore error opening %s: %s", + buf2, strerror(errno)); + redisPanic("Unrecoverable diskstore error. Exiting."); + } + } if ((retval = rdbSaveKeyValuePair(fp,db,key,val,time(NULL))) == -1) return REDIS_ERR; fclose(fp);