Skip to content

Commit f9d2ffd

Browse files
oranagraantirez
authored andcommitted
improve DEBUG MALLCTL to be able to write to write only fields.
also support: debug mallctl-str thread.tcache.flush VOID
1 parent d7968ee commit f9d2ffd

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

src/debug.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,13 @@ void mallctl_int(client *c, robj **argv, int argc) {
311311
size_t sz = sizeof(old);
312312
while (sz > 0) {
313313
if ((ret=je_mallctl(argv[0]->ptr, &old, &sz, argc > 1? &val: NULL, argc > 1?sz: 0))) {
314+
if (ret == EPERM && argc > 1) {
315+
/* if this option is write only, try just writing to it. */
316+
if (!(ret=je_mallctl(argv[0]->ptr, NULL, 0, &val, sz))) {
317+
addReply(c, shared.ok);
318+
return;
319+
}
320+
}
314321
if (ret==EINVAL) {
315322
/* size might be wrong, try a smaller one */
316323
sz /= 2;
@@ -333,17 +340,30 @@ void mallctl_int(client *c, robj **argv, int argc) {
333340
}
334341

335342
void mallctl_string(client *c, robj **argv, int argc) {
336-
int ret;
343+
int rret, wret;
337344
char *old;
338345
size_t sz = sizeof(old);
339346
/* for strings, it seems we need to first get the old value, before overriding it. */
340-
if ((ret=je_mallctl(argv[0]->ptr, &old, &sz, NULL, 0))) {
341-
addReplyErrorFormat(c,"%s", strerror(ret));
342-
return;
347+
if ((rret=je_mallctl(argv[0]->ptr, &old, &sz, NULL, 0))) {
348+
/* return error unless this option is write only. */
349+
if (!(rret == EPERM && argc > 1)) {
350+
addReplyErrorFormat(c,"%s", strerror(rret));
351+
return;
352+
}
353+
}
354+
if(argc > 1) {
355+
char *val = argv[1]->ptr;
356+
char **valref = &val;
357+
if ((!strcmp(val,"VOID")))
358+
valref = NULL, sz = 0;
359+
wret = je_mallctl(argv[0]->ptr, NULL, 0, valref, sz);
343360
}
344-
addReplyBulkCString(c, old);
345-
if(argc > 1)
346-
je_mallctl(argv[0]->ptr, NULL, 0, &argv[1]->ptr, sizeof(char*));
361+
if (!rret)
362+
addReplyBulkCString(c, old);
363+
else if (wret)
364+
addReplyErrorFormat(c,"%s", strerror(wret));
365+
else
366+
addReply(c, shared.ok);
347367
}
348368
#endif
349369

0 commit comments

Comments
 (0)