diff options
author | Oran Agra <oran@redislabs.com> | 2020-05-17 15:10:25 +0300 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2020-05-22 12:37:49 +0200 |
commit | f9d2ffdc5deb71bbdba9bef6db330320c2a3e170 (patch) | |
tree | 99eb3c5862354a77aa82d68e61256000c305c0b5 | |
parent | d7968ee92023a0f228979dec772c3f3d34651100 (diff) | |
download | redis-f9d2ffdc5deb71bbdba9bef6db330320c2a3e170.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.c | 34 |
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 |