Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
684b140a
Unverified
Commit
684b140a
authored
Mar 21, 2019
by
Salvatore Sanfilippo
Committed by
GitHub
Mar 21, 2019
Browse files
Merge pull request #3650 from yossigo/key_name_from_module_io
Add RedisModule_GetKeyNameFromIO()
parents
3eaa2cdc
a88264d9
Changes
8
Show whitespace changes
Inline
Side-by-side
src/aof.c
View file @
684b140a
...
@@ -1239,7 +1239,7 @@ int rewriteModuleObject(rio *r, robj *key, robj *o) {
...
@@ -1239,7 +1239,7 @@ int rewriteModuleObject(rio *r, robj *key, robj *o) {
RedisModuleIO
io
;
RedisModuleIO
io
;
moduleValue
*
mv
=
o
->
ptr
;
moduleValue
*
mv
=
o
->
ptr
;
moduleType
*
mt
=
mv
->
type
;
moduleType
*
mt
=
mv
->
type
;
moduleInitIOContext
(
io
,
mt
,
r
);
moduleInitIOContext
(
io
,
mt
,
r
,
key
);
mt
->
aof_rewrite
(
&
io
,
key
,
mv
->
value
);
mt
->
aof_rewrite
(
&
io
,
key
,
mv
->
value
);
if
(
io
.
ctx
)
{
if
(
io
.
ctx
)
{
moduleFreeContext
(
io
.
ctx
);
moduleFreeContext
(
io
.
ctx
);
...
...
src/cluster.c
View file @
684b140a
...
@@ -4776,7 +4776,7 @@ NULL
...
@@ -4776,7 +4776,7 @@ NULL
/* Generates a DUMP-format representation of the object 'o', adding it to the
/* Generates a DUMP-format representation of the object 'o', adding it to the
* io stream pointed by 'rio'. This function can't fail. */
* io stream pointed by 'rio'. This function can't fail. */
void
createDumpPayload
(
rio
*
payload
,
robj
*
o
)
{
void
createDumpPayload
(
rio
*
payload
,
robj
*
o
,
robj
*
key
)
{
unsigned
char
buf
[
2
];
unsigned
char
buf
[
2
];
uint64_t
crc
;
uint64_t
crc
;
...
@@ -4784,7 +4784,7 @@ void createDumpPayload(rio *payload, robj *o) {
...
@@ -4784,7 +4784,7 @@ void createDumpPayload(rio *payload, robj *o) {
* byte followed by the serialized object. This is understood by RESTORE. */
* byte followed by the serialized object. This is understood by RESTORE. */
rioInitWithBuffer
(
payload
,
sdsempty
());
rioInitWithBuffer
(
payload
,
sdsempty
());
serverAssert
(
rdbSaveObjectType
(
payload
,
o
));
serverAssert
(
rdbSaveObjectType
(
payload
,
o
));
serverAssert
(
rdbSaveObject
(
payload
,
o
));
serverAssert
(
rdbSaveObject
(
payload
,
o
,
key
));
/* Write the footer, this is how it looks like:
/* Write the footer, this is how it looks like:
* ----------------+---------------------+---------------+
* ----------------+---------------------+---------------+
...
@@ -4842,7 +4842,7 @@ void dumpCommand(client *c) {
...
@@ -4842,7 +4842,7 @@ void dumpCommand(client *c) {
}
}
/* Create the DUMP encoded representation. */
/* Create the DUMP encoded representation. */
createDumpPayload
(
&
payload
,
o
);
createDumpPayload
(
&
payload
,
o
,
c
->
argv
[
1
]
);
/* Transfer to the client */
/* Transfer to the client */
dumpobj
=
createObject
(
OBJ_STRING
,
payload
.
io
.
buffer
.
ptr
);
dumpobj
=
createObject
(
OBJ_STRING
,
payload
.
io
.
buffer
.
ptr
);
...
@@ -4915,7 +4915,7 @@ void restoreCommand(client *c) {
...
@@ -4915,7 +4915,7 @@ void restoreCommand(client *c) {
rioInitWithBuffer
(
&
payload
,
c
->
argv
[
3
]
->
ptr
);
rioInitWithBuffer
(
&
payload
,
c
->
argv
[
3
]
->
ptr
);
if
(((
type
=
rdbLoadObjectType
(
&
payload
))
==
-
1
)
||
if
(((
type
=
rdbLoadObjectType
(
&
payload
))
==
-
1
)
||
((
obj
=
rdbLoadObject
(
type
,
&
payload
))
==
NULL
))
((
obj
=
rdbLoadObject
(
type
,
&
payload
,
c
->
argv
[
1
]
))
==
NULL
))
{
{
addReplyError
(
c
,
"Bad data format"
);
addReplyError
(
c
,
"Bad data format"
);
return
;
return
;
...
@@ -5203,7 +5203,7 @@ try_again:
...
@@ -5203,7 +5203,7 @@ try_again:
/* Emit the payload argument, that is the serialized object using
/* Emit the payload argument, that is the serialized object using
* the DUMP format. */
* the DUMP format. */
createDumpPayload
(
&
payload
,
ov
[
j
]);
createDumpPayload
(
&
payload
,
ov
[
j
]
,
kv
[
j
]
);
serverAssertWithInfo
(
c
,
NULL
,
serverAssertWithInfo
(
c
,
NULL
,
rioWriteBulkString
(
&
cmd
,
payload
.
io
.
buffer
.
ptr
,
rioWriteBulkString
(
&
cmd
,
payload
.
io
.
buffer
.
ptr
,
sdslen
(
payload
.
io
.
buffer
.
ptr
)));
sdslen
(
payload
.
io
.
buffer
.
ptr
)));
...
...
src/module.c
View file @
684b140a
...
@@ -3438,6 +3438,14 @@ RedisModuleCtx *RM_GetContextFromIO(RedisModuleIO *io) {
...
@@ -3438,6 +3438,14 @@ RedisModuleCtx *RM_GetContextFromIO(RedisModuleIO *io) {
return
io
->
ctx
;
return
io
->
ctx
;
}
}
/* Returns a RedisModuleString with the name of the key currently saving or
* loading, when an IO data type callback is called. There is no guarantee
* that the key name is always available, so this may return NULL.
*/
const
RedisModuleString
*
RM_GetKeyNameFromIO
(
RedisModuleIO
*
io
)
{
return
io
->
key
;
}
/* --------------------------------------------------------------------------
/* --------------------------------------------------------------------------
* Logging
* Logging
* -------------------------------------------------------------------------- */
* -------------------------------------------------------------------------- */
...
@@ -5164,6 +5172,7 @@ void moduleRegisterCoreAPI(void) {
...
@@ -5164,6 +5172,7 @@ void moduleRegisterCoreAPI(void) {
REGISTER_API
(
RetainString
);
REGISTER_API
(
RetainString
);
REGISTER_API
(
StringCompare
);
REGISTER_API
(
StringCompare
);
REGISTER_API
(
GetContextFromIO
);
REGISTER_API
(
GetContextFromIO
);
REGISTER_API
(
GetKeyNameFromIO
);
REGISTER_API
(
BlockClient
);
REGISTER_API
(
BlockClient
);
REGISTER_API
(
UnblockClient
);
REGISTER_API
(
UnblockClient
);
REGISTER_API
(
IsBlockedReplyRequest
);
REGISTER_API
(
IsBlockedReplyRequest
);
...
...
src/rdb.c
View file @
684b140a
...
@@ -751,7 +751,7 @@ size_t rdbSaveStreamConsumers(rio *rdb, streamCG *cg) {
...
@@ -751,7 +751,7 @@ size_t rdbSaveStreamConsumers(rio *rdb, streamCG *cg) {
/* Save a Redis object.
/* Save a Redis object.
* Returns -1 on error, number of bytes written on success. */
* Returns -1 on error, number of bytes written on success. */
ssize_t
rdbSaveObject
(
rio
*
rdb
,
robj
*
o
)
{
ssize_t
rdbSaveObject
(
rio
*
rdb
,
robj
*
o
,
robj
*
key
)
{
ssize_t
n
=
0
,
nwritten
=
0
;
ssize_t
n
=
0
,
nwritten
=
0
;
if
(
o
->
type
==
OBJ_STRING
)
{
if
(
o
->
type
==
OBJ_STRING
)
{
...
@@ -966,7 +966,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
...
@@ -966,7 +966,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
RedisModuleIO
io
;
RedisModuleIO
io
;
moduleValue
*
mv
=
o
->
ptr
;
moduleValue
*
mv
=
o
->
ptr
;
moduleType
*
mt
=
mv
->
type
;
moduleType
*
mt
=
mv
->
type
;
moduleInitIOContext
(
io
,
mt
,
rdb
);
moduleInitIOContext
(
io
,
mt
,
rdb
,
key
);
/* Write the "module" identifier as prefix, so that we'll be able
/* Write the "module" identifier as prefix, so that we'll be able
* to call the right module during loading. */
* to call the right module during loading. */
...
@@ -996,7 +996,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
...
@@ -996,7 +996,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
* this length with very little changes to the code. In the future
* this length with very little changes to the code. In the future
* we could switch to a faster solution. */
* we could switch to a faster solution. */
size_t
rdbSavedObjectLen
(
robj
*
o
)
{
size_t
rdbSavedObjectLen
(
robj
*
o
)
{
ssize_t
len
=
rdbSaveObject
(
NULL
,
o
);
ssize_t
len
=
rdbSaveObject
(
NULL
,
o
,
NULL
);
serverAssertWithInfo
(
NULL
,
o
,
len
!=
-
1
);
serverAssertWithInfo
(
NULL
,
o
,
len
!=
-
1
);
return
len
;
return
len
;
}
}
...
@@ -1038,7 +1038,7 @@ int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime) {
...
@@ -1038,7 +1038,7 @@ int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime) {
/* Save type, key, value */
/* Save type, key, value */
if
(
rdbSaveObjectType
(
rdb
,
val
)
==
-
1
)
return
-
1
;
if
(
rdbSaveObjectType
(
rdb
,
val
)
==
-
1
)
return
-
1
;
if
(
rdbSaveStringObject
(
rdb
,
key
)
==
-
1
)
return
-
1
;
if
(
rdbSaveStringObject
(
rdb
,
key
)
==
-
1
)
return
-
1
;
if
(
rdbSaveObject
(
rdb
,
val
)
==
-
1
)
return
-
1
;
if
(
rdbSaveObject
(
rdb
,
val
,
key
)
==
-
1
)
return
-
1
;
return
1
;
return
1
;
}
}
...
@@ -1380,7 +1380,7 @@ robj *rdbLoadCheckModuleValue(rio *rdb, char *modulename) {
...
@@ -1380,7 +1380,7 @@ robj *rdbLoadCheckModuleValue(rio *rdb, char *modulename) {
/* Load a Redis object of the specified type from the specified file.
/* Load a Redis object of the specified type from the specified file.
* On success a newly allocated object is returned, otherwise NULL. */
* On success a newly allocated object is returned, otherwise NULL. */
robj
*
rdbLoadObject
(
int
rdbtype
,
rio
*
rdb
)
{
robj
*
rdbLoadObject
(
int
rdbtype
,
rio
*
rdb
,
robj
*
key
)
{
robj
*
o
=
NULL
,
*
ele
,
*
dec
;
robj
*
o
=
NULL
,
*
ele
,
*
dec
;
uint64_t
len
;
uint64_t
len
;
unsigned
int
i
;
unsigned
int
i
;
...
@@ -1767,7 +1767,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
...
@@ -1767,7 +1767,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
exit
(
1
);
exit
(
1
);
}
}
RedisModuleIO
io
;
RedisModuleIO
io
;
moduleInitIOContext
(
io
,
mt
,
rdb
);
moduleInitIOContext
(
io
,
mt
,
rdb
,
key
);
io
.
ver
=
(
rdbtype
==
RDB_TYPE_MODULE
)
?
1
:
2
;
io
.
ver
=
(
rdbtype
==
RDB_TYPE_MODULE
)
?
1
:
2
;
/* Call the rdb_load method of the module providing the 10 bit
/* Call the rdb_load method of the module providing the 10 bit
* encoding version in the lower 10 bits of the module ID. */
* encoding version in the lower 10 bits of the module ID. */
...
@@ -2023,7 +2023,7 @@ int rdbLoadRio(rio *rdb, rdbSaveInfo *rsi, int loading_aof) {
...
@@ -2023,7 +2023,7 @@ int rdbLoadRio(rio *rdb, rdbSaveInfo *rsi, int loading_aof) {
/* Read key */
/* Read key */
if
((
key
=
rdbLoadStringObject
(
rdb
))
==
NULL
)
goto
eoferr
;
if
((
key
=
rdbLoadStringObject
(
rdb
))
==
NULL
)
goto
eoferr
;
/* Read value */
/* Read value */
if
((
val
=
rdbLoadObject
(
type
,
rdb
))
==
NULL
)
goto
eoferr
;
if
((
val
=
rdbLoadObject
(
type
,
rdb
,
key
))
==
NULL
)
goto
eoferr
;
/* Check if the key already expired. This function is used when loading
/* Check if the key already expired. This function is used when loading
* an RDB file from disk, either at startup, or when an RDB was
* an RDB file from disk, either at startup, or when an RDB was
* received from the master. In the latter case, the master is
* received from the master. In the latter case, the master is
...
...
src/rdb.h
View file @
684b140a
...
@@ -140,9 +140,9 @@ int rdbSaveBackground(char *filename, rdbSaveInfo *rsi);
...
@@ -140,9 +140,9 @@ int rdbSaveBackground(char *filename, rdbSaveInfo *rsi);
int
rdbSaveToSlavesSockets
(
rdbSaveInfo
*
rsi
);
int
rdbSaveToSlavesSockets
(
rdbSaveInfo
*
rsi
);
void
rdbRemoveTempFile
(
pid_t
childpid
);
void
rdbRemoveTempFile
(
pid_t
childpid
);
int
rdbSave
(
char
*
filename
,
rdbSaveInfo
*
rsi
);
int
rdbSave
(
char
*
filename
,
rdbSaveInfo
*
rsi
);
ssize_t
rdbSaveObject
(
rio
*
rdb
,
robj
*
o
);
ssize_t
rdbSaveObject
(
rio
*
rdb
,
robj
*
o
,
robj
*
key
);
size_t
rdbSavedObjectLen
(
robj
*
o
);
size_t
rdbSavedObjectLen
(
robj
*
o
);
robj
*
rdbLoadObject
(
int
type
,
rio
*
rdb
);
robj
*
rdbLoadObject
(
int
type
,
rio
*
rdb
,
robj
*
key
);
void
backgroundSaveDoneHandler
(
int
exitcode
,
int
bysignal
);
void
backgroundSaveDoneHandler
(
int
exitcode
,
int
bysignal
);
int
rdbSaveKeyValuePair
(
rio
*
rdb
,
robj
*
key
,
robj
*
val
,
long
long
expiretime
);
int
rdbSaveKeyValuePair
(
rio
*
rdb
,
robj
*
key
,
robj
*
val
,
long
long
expiretime
);
robj
*
rdbLoadStringObject
(
rio
*
rdb
);
robj
*
rdbLoadStringObject
(
rio
*
rdb
);
...
...
src/redis-check-rdb.c
View file @
684b140a
...
@@ -285,7 +285,7 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
...
@@ -285,7 +285,7 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
rdbstate
.
keys
++
;
rdbstate
.
keys
++
;
/* Read value */
/* Read value */
rdbstate
.
doing
=
RDB_CHECK_DOING_READ_OBJECT_VALUE
;
rdbstate
.
doing
=
RDB_CHECK_DOING_READ_OBJECT_VALUE
;
if
((
val
=
rdbLoadObject
(
type
,
&
rdb
))
==
NULL
)
goto
eoferr
;
if
((
val
=
rdbLoadObject
(
type
,
&
rdb
,
key
))
==
NULL
)
goto
eoferr
;
/* Check if the key already expired. */
/* Check if the key already expired. */
if
(
expiretime
!=
-
1
&&
expiretime
<
now
)
if
(
expiretime
!=
-
1
&&
expiretime
<
now
)
rdbstate
.
already_expired
++
;
rdbstate
.
already_expired
++
;
...
...
src/redismodule.h
View file @
684b140a
...
@@ -278,6 +278,7 @@ int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, Re
...
@@ -278,6 +278,7 @@ int REDISMODULE_API_FUNC(RedisModule_StringAppendBuffer)(RedisModuleCtx *ctx, Re
void
REDISMODULE_API_FUNC
(
RedisModule_RetainString
)(
RedisModuleCtx
*
ctx
,
RedisModuleString
*
str
);
void
REDISMODULE_API_FUNC
(
RedisModule_RetainString
)(
RedisModuleCtx
*
ctx
,
RedisModuleString
*
str
);
int
REDISMODULE_API_FUNC
(
RedisModule_StringCompare
)(
RedisModuleString
*
a
,
RedisModuleString
*
b
);
int
REDISMODULE_API_FUNC
(
RedisModule_StringCompare
)(
RedisModuleString
*
a
,
RedisModuleString
*
b
);
RedisModuleCtx
*
REDISMODULE_API_FUNC
(
RedisModule_GetContextFromIO
)(
RedisModuleIO
*
io
);
RedisModuleCtx
*
REDISMODULE_API_FUNC
(
RedisModule_GetContextFromIO
)(
RedisModuleIO
*
io
);
const
RedisModuleString
*
REDISMODULE_API_FUNC
(
RedisModule_GetKeyNameFromIO
)(
RedisModuleIO
*
io
);
long
long
REDISMODULE_API_FUNC
(
RedisModule_Milliseconds
)(
void
);
long
long
REDISMODULE_API_FUNC
(
RedisModule_Milliseconds
)(
void
);
void
REDISMODULE_API_FUNC
(
RedisModule_DigestAddStringBuffer
)(
RedisModuleDigest
*
md
,
unsigned
char
*
ele
,
size_t
len
);
void
REDISMODULE_API_FUNC
(
RedisModule_DigestAddStringBuffer
)(
RedisModuleDigest
*
md
,
unsigned
char
*
ele
,
size_t
len
);
void
REDISMODULE_API_FUNC
(
RedisModule_DigestAddLongLong
)(
RedisModuleDigest
*
md
,
long
long
ele
);
void
REDISMODULE_API_FUNC
(
RedisModule_DigestAddLongLong
)(
RedisModuleDigest
*
md
,
long
long
ele
);
...
@@ -442,6 +443,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
...
@@ -442,6 +443,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
REDISMODULE_GET_API
(
RetainString
);
REDISMODULE_GET_API
(
RetainString
);
REDISMODULE_GET_API
(
StringCompare
);
REDISMODULE_GET_API
(
StringCompare
);
REDISMODULE_GET_API
(
GetContextFromIO
);
REDISMODULE_GET_API
(
GetContextFromIO
);
REDISMODULE_GET_API
(
GetKeyNameFromIO
);
REDISMODULE_GET_API
(
Milliseconds
);
REDISMODULE_GET_API
(
Milliseconds
);
REDISMODULE_GET_API
(
DigestAddStringBuffer
);
REDISMODULE_GET_API
(
DigestAddStringBuffer
);
REDISMODULE_GET_API
(
DigestAddLongLong
);
REDISMODULE_GET_API
(
DigestAddLongLong
);
...
...
src/server.h
View file @
684b140a
...
@@ -578,16 +578,18 @@ typedef struct RedisModuleIO {
...
@@ -578,16 +578,18 @@ typedef struct RedisModuleIO {
int
ver
;
/* Module serialization version: 1 (old),
int
ver
;
/* Module serialization version: 1 (old),
* 2 (current version with opcodes annotation). */
* 2 (current version with opcodes annotation). */
struct
RedisModuleCtx
*
ctx
;
/* Optional context, see RM_GetContextFromIO()*/
struct
RedisModuleCtx
*
ctx
;
/* Optional context, see RM_GetContextFromIO()*/
struct
redisObject
*
key
;
/* Optional name of key processed */
}
RedisModuleIO
;
}
RedisModuleIO
;
/* Macro to initialize an IO context. Note that the 'ver' field is populated
/* Macro to initialize an IO context. Note that the 'ver' field is populated
* inside rdb.c according to the version of the value to load. */
* inside rdb.c according to the version of the value to load. */
#define moduleInitIOContext(iovar,mtype,rioptr) do { \
#define moduleInitIOContext(iovar,mtype,rioptr
,keyptr
) do { \
iovar.rio = rioptr; \
iovar.rio = rioptr; \
iovar.type = mtype; \
iovar.type = mtype; \
iovar.bytes = 0; \
iovar.bytes = 0; \
iovar.error = 0; \
iovar.error = 0; \
iovar.ver = 0; \
iovar.ver = 0; \
iovar.key = keyptr; \
iovar.ctx = NULL; \
iovar.ctx = NULL; \
} while(0);
} while(0);
...
...
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