summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOran Agra <oran@redislabs.com>2020-05-17 15:10:25 +0300
committerOran Agra <oran@redislabs.com>2020-05-20 14:09:22 +0300
commit5d83e9e1de94fb0250073565c051e71b7648d42d (patch)
tree3da37a3b93576c1124881a648283a5ca4280c32f
parent23a85ba191ed4d42cc88b76972dc3cb409e765dc (diff)
downloadredis-5d83e9e1de94fb0250073565c051e71b7648d42d.tar.gz
improve DEBUG MALLCTL to be able to write to write only fields.
also support: debug mallctl-str thread.tcache.flush VOID
-rw-r--r--src/debug.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/src/debug.c b/src/debug.c
index 587ff7c5d..d79226bf2 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -311,6 +311,13 @@ void mallctl_int(client *c, robj **argv, int argc) {
size_t sz = sizeof(old);
while (sz > 0) {
if ((ret=je_mallctl(argv[0]->ptr, &old, &sz, argc > 1? &val: NULL, argc > 1?sz: 0))) {
+ if (ret == EPERM && argc > 1) {
+ /* if this option is write only, try just writing to it. */
+ if (!(ret=je_mallctl(argv[0]->ptr, NULL, 0, &val, sz))) {
+ addReply(c, shared.ok);
+ return;
+ }
+ }
if (ret==EINVAL) {
/* size might be wrong, try a smaller one */
sz /= 2;
@@ -333,17 +340,30 @@ void mallctl_int(client *c, robj **argv, int argc) {
}
void mallctl_string(client *c, robj **argv, int argc) {
- int ret;
+ int rret, wret;
char *old;
size_t sz = sizeof(old);
/* for strings, it seems we need to first get the old value, before overriding it. */
- if ((ret=je_mallctl(argv[0]->ptr, &old, &sz, NULL, 0))) {
- addReplyErrorFormat(c,"%s", strerror(ret));
- return;
+ if ((rret=je_mallctl(argv[0]->ptr, &old, &sz, NULL, 0))) {
+ /* return error unless this option is write only. */
+ if (!(rret == EPERM && argc > 1)) {
+ addReplyErrorFormat(c,"%s", strerror(rret));
+ return;
+ }
+ }
+ if(argc > 1) {
+ char *val = argv[1]->ptr;
+ char **valref = &val;
+ if ((!strcmp(val,"VOID")))
+ valref = NULL, sz = 0;
+ wret = je_mallctl(argv[0]->ptr, NULL, 0, valref, sz);
}
- addReplyBulkCString(c, old);
- if(argc > 1)
- je_mallctl(argv[0]->ptr, NULL, 0, &argv[1]->ptr, sizeof(char*));
+ if (!rret)
+ addReplyBulkCString(c, old);
+ else if (wret)
+ addReplyErrorFormat(c,"%s", strerror(wret));
+ else
+ addReply(c, shared.ok);
}
#endif