summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2011-01-04 19:03:23 +0100
committerantirez <antirez@gmail.com>2011-01-04 19:03:23 +0100
commit1190c6cbf7f240691fee0d8fb21a7c19938116be (patch)
tree9c4d8d30e9a730f2552315cafbc1d5d20abc1eb7
parent418d5eaf500935e77e29fdd9335aaca845e6c5cd (diff)
downloadredis-1190c6cbf7f240691fee0d8fb21a7c19938116be.tar.gz
handle end of space on device in a better way
-rw-r--r--src/diskstore.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/diskstore.c b/src/diskstore.c
index 3e0ad406f..7250390eb 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);