Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
a3e8de04
Commit
a3e8de04
authored
Oct 29, 2015
by
antirez
Browse files
Lua script selective replication WIP.
parent
fc382356
Changes
2
Show whitespace changes
Inline
Side-by-side
src/scripting.c
View file @
a3e8de04
...
...
@@ -375,7 +375,8 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
* a Lua script in the context of AOF and slaves. */
if (server.lua_replicate_commands &&
!server.lua_multi_emitted &&
server
.
lua_write_dirty
)
server.lua_write_dirty &&
server.lua_repl != PROPAGATE_NONE)
{
execCommandPropagateMulti(server.lua_caller);
server.lua_multi_emitted = 1;
...
...
@@ -383,7 +384,13 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
/* Run the command */
int call_flags = CMD_CALL_SLOWLOG | CMD_CALL_STATS;
if
(
server
.
lua_replicate_commands
)
call_flags
|=
CMD_CALL_PROPAGATE
;
if (server.lua_replicate_commands) {
call_flags |= CMD_CALL_PROPAGATE;
/* Don't propagate AOf / replication stream if a redis.set_repl()
* call changed the default replication policy. */
if (!(server.lua_repl & PROPAGATE_AOF)) preventCommandAOF(c);
if (!(server.lua_repl & PROPAGATE_REPL)) preventCommandReplication(c);
}
call(c,call_flags);
/* Convert the result of the Redis command into a suitable Lua type.
...
...
@@ -540,6 +547,31 @@ int luaRedisReplicateCommandsCommand(lua_State *lua) {
return 1;
}
/* redis.set_repl()
*
* Set the propagation of write commands executed in the context of the
* script to on/off for AOF and slaves. */
int luaRedisSetReplCommand(lua_State *lua) {
int argc = lua_gettop(lua);
int flags;
if (server.lua_replicate_commands == 0) {
luaPushError(lua, "You can set the replication behavior only after turning on single commands replication with redis.replicate_commands().");
return 1;
} else if (argc != 1) {
luaPushError(lua, "redis.set_repl() requires two arguments.");
return 1;
}
flags = lua_tonumber(lua,-1);
if ((flags & ~(PROPAGATE_AOF|PROPAGATE_REPL)) != 0) {
luaPushError(lua, "Invalid replication flags. Use REPL_AOF, REPL_SLAVE, REPL_ALL or REPL_NONE.");
return 1;
}
server.lua_repl = flags;
return 0;
}
/* redis.log() */
int luaLogCommand(lua_State *lua) {
int j, argc = lua_gettop(lua);
...
...
@@ -741,6 +773,27 @@ void scriptingInit(void) {
lua_pushcfunction(lua, luaRedisReplicateCommandsCommand);
lua_settable(lua, -3);
/* redis.set_repl and associated flags. */
lua_pushstring(lua,"set_repl");
lua_pushcfunction(lua,luaRedisSetReplCommand);
lua_settable(lua,-3);
lua_pushstring(lua,"REPL_NONE");
lua_pushnumber(lua,PROPAGATE_NONE);
lua_settable(lua,-3);
lua_pushstring(lua,"REPL_AOF");
lua_pushnumber(lua,PROPAGATE_AOF);
lua_settable(lua,-3);
lua_pushstring(lua,"REPL_SLAVE");
lua_pushnumber(lua,PROPAGATE_REPL);
lua_settable(lua,-3);
lua_pushstring(lua,"REPL_ALL");
lua_pushnumber(lua,PROPAGATE_AOF|PROPAGATE_REPL);
lua_settable(lua,-3);
/* Finally set the table as 'redis' global var. */
lua_setglobal(lua,"redis");
...
...
@@ -987,6 +1040,7 @@ void evalGenericCommand(client *c, int evalsha) {
server.lua_write_dirty = 0;
server.lua_replicate_commands = 0;
server.lua_multi_emitted = 0;
server.lua_repl = PROPAGATE_AOF|PROPAGATE_REPL;
/* Get the number of arguments that are keys */
if (getLongLongFromObjectOrReply(c,c->argv[2],&numkeys,NULL) != C_OK)
...
...
src/server.h
View file @
a3e8de04
...
...
@@ -940,7 +940,7 @@ struct redisServer {
int
cluster_migration_barrier
;
/* Cluster replicas migration barrier. */
int
cluster_slave_validity_factor
;
/* Slave max data age for failover. */
int
cluster_require_full_coverage
;
/* If true, put the cluster down if
there is at least an uncovered slot.
*/
there is at least an uncovered slot.*/
/* Scripting */
lua_State
*
lua
;
/* The Lua interpreter. We use just one for all clients */
client
*
lua_client
;
/* The "fake client" to query Redis from Lua */
...
...
@@ -954,6 +954,7 @@ struct redisServer {
execution of the current script. */
int
lua_replicate_commands
;
/* True if we are doing single commands repl. */
int
lua_multi_emitted
;
/* True if we already proagated MULTI. */
int
lua_repl
;
/* Script replication flags for redis.set_repl(). */
int
lua_timedout
;
/* True if we reached the time limit for script
execution. */
int
lua_kill
;
/* Kill the script if true. */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment