X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/70cb03e172a892e75542d895932b320ee7bf5167..d8ba159b6cac421e97535fc40cfc8846d073940d:/src/redis.c?ds=sidebyside diff --git a/src/redis.c b/src/redis.c index 658d2486..a9d44fa9 100644 --- a/src/redis.c +++ b/src/redis.c @@ -209,12 +209,14 @@ struct redisCommand redisCommandTable[] = { {"cluster",clusterCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"restore",restoreCommand,4,"awm",0,NULL,1,1,1,0,0}, {"migrate",migrateCommand,6,"aw",0,NULL,0,0,0,0,0}, + {"asking",askingCommand,1,"r",0,NULL,0,0,0,0,0}, {"dump",dumpCommand,2,"ar",0,NULL,0,0,0,0,0}, {"object",objectCommand,-2,"r",0,NULL,0,0,0,0,0}, {"client",clientCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"eval",evalCommand,-3,"wms",0,zunionInterGetKeys,0,0,0,0,0}, {"evalsha",evalShaCommand,-3,"wms",0,zunionInterGetKeys,0,0,0,0,0}, - {"slowlog",slowlogCommand,-2,"r",0,NULL,0,0,0,0,0} + {"slowlog",slowlogCommand,-2,"r",0,NULL,0,0,0,0,0}, + {"script",scriptCommand,-2,"ras",0,NULL,0,0,0,0,0} }; /*============================ Utility functions ============================ */ @@ -791,6 +793,8 @@ void createSharedObjects(void) { "-NOSCRIPT No matching script. Please use EVAL.\r\n")); shared.loadingerr = createObject(REDIS_STRING,sdsnew( "-LOADING Redis is loading the dataset in memory\r\n")); + shared.slowscripterr = createObject(REDIS_STRING,sdsnew( + "-BUSY Redis is busy running a script. Please wait or stop the server with SHUTDOWN.\r\n")); shared.space = createObject(REDIS_STRING,sdsnew(" ")); shared.colon = createObject(REDIS_STRING,sdsnew(":")); shared.plus = createObject(REDIS_STRING,sdsnew("+")); @@ -868,6 +872,8 @@ void initServerConfig() { server.cluster_enabled = 0; server.cluster.configfile = zstrdup("nodes.conf"); server.lua_time_limit = REDIS_LUA_TIME_LIMIT; + server.lua_client = NULL; + server.lua_timedout = 0; updateLRUClock(); resetServerSaveParams(); @@ -1180,6 +1186,12 @@ int processCommand(redisClient *c) { return REDIS_OK; } + /* Lua script too slow? */ + if (server.lua_timedout && c->cmd->proc != shutdownCommand) { + addReply(c, shared.slowscripterr); + return REDIS_OK; + } + /* Exec the command */ if (c->flags & REDIS_MULTI && c->cmd->proc != execCommand && c->cmd->proc != discardCommand && @@ -1249,7 +1261,9 @@ int prepareForShutdown() { /*================================== Commands =============================== */ void authCommand(redisClient *c) { - if (!server.requirepass || !strcmp(c->argv[1]->ptr, server.requirepass)) { + if (!server.requirepass) { + addReplyError(c,"Client sent AUTH, but no password is set"); + } else if (!strcmp(c->argv[1]->ptr, server.requirepass)) { c->authenticated = 1; addReply(c,shared.ok); } else { @@ -1800,8 +1814,13 @@ int main(int argc, char **argv) { if (loadAppendOnlyFile(server.appendfilename) == REDIS_OK) redisLog(REDIS_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000); } else { - if (rdbLoad(server.dbfilename) == REDIS_OK) - redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds",(float)(ustime()-start)/1000000); + if (rdbLoad(server.dbfilename) == REDIS_OK) { + redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds", + (float)(ustime()-start)/1000000); + } else if (errno != ENOENT) { + redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting."); + exit(1); + } } if (server.ipfd > 0) redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port);