summaryrefslogtreecommitdiff
path: root/src/database-redis.cpp
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2014-07-07 01:20:25 -0400
committerkwolekr <kwolekr@minetest.net>2014-07-07 01:20:25 -0400
commit8b3ed78e53d8ad19d8dee3968430be258559214c (patch)
tree497c583608f3d7e596e899934c9945e4a324db23 /src/database-redis.cpp
parente14c4cdd4c3c9b554dc9cb91f8f29078ad337ded (diff)
downloadminetest-8b3ed78e53d8ad19d8dee3968430be258559214c.tar.gz
minetest-8b3ed78e53d8ad19d8dee3968430be258559214c.tar.bz2
minetest-8b3ed78e53d8ad19d8dee3968430be258559214c.zip
Don't unload blocks if save failed
Improve error handling in saveBlock()
Diffstat (limited to 'src/database-redis.cpp')
-rw-r--r--src/database-redis.cpp35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/database-redis.cpp b/src/database-redis.cpp
index ff54753e6..595fb20ec 100644
--- a/src/database-redis.cpp
+++ b/src/database-redis.cpp
@@ -81,21 +81,24 @@ void Database_Redis::endSave() {
freeReplyObject(reply);
}
-void Database_Redis::saveBlock(MapBlock *block)
+bool Database_Redis::saveBlock(MapBlock *block)
{
DSTACK(__FUNCTION_NAME);
+
+ v3s16 p3d = block->getPos();
+
/*
Dummy blocks are not written
*/
if(block->isDummy())
{
- return;
+ errorstream << "WARNING: saveBlock: Not writing dummy block "
+ << PP(p3d) << std::endl;
+ return true;
}
// Format used for writing
u8 version = SER_FMT_VER_HIGHEST_WRITE;
- // Get destination
- v3s16 p3d = block->getPos();
/*
[0] u8 serialization version
@@ -110,16 +113,26 @@ void Database_Redis::saveBlock(MapBlock *block)
std::string tmp1 = o.str();
std::string tmp2 = i64tos(getBlockAsInteger(p3d));
- redisReply *reply;
- reply = (redisReply*) redisCommand(ctx, "HSET %s %s %b", hash.c_str(), tmp2.c_str(), tmp1.c_str(), tmp1.size());
- if(!reply)
- throw FileNotGoodException(std::string("redis command 'HSET %s %s %b' failed: ") + ctx->errstr);
- if(reply->type == REDIS_REPLY_ERROR)
- throw FileNotGoodException("Failed to store block in Database");
- freeReplyObject(reply);
+ redisReply *reply = (redisReply *)redisCommand(ctx, "HSET %s %s %b",
+ hash.c_str(), tmp2.c_str(), tmp1.c_str(), tmp1.size());
+ if (!reply) {
+ errorstream << "WARNING: saveBlock: redis command 'HSET' failed on "
+ "block " << PP(p3d) << ": " << ctx->errstr << std::endl;
+ freeReplyObject(reply);
+ return false;
+ }
+
+ if (reply->type == REDIS_REPLY_ERROR) {
+ errorstream << "WARNING: saveBlock: save block " << PP(p3d)
+ << "failed" << std::endl;
+ freeReplyObject(reply);
+ return false;
+ }
// We just wrote it to the disk so clear modified flag
block->resetModified();
+ freeReplyObject(reply);
+ return true;
}
MapBlock* Database_Redis::loadBlock(v3s16 blockpos)