diff options
| author | Mitja Felicijan <mitja.felicijan@gmail.com> | 2026-01-21 22:52:54 +0100 |
|---|---|---|
| committer | Mitja Felicijan <mitja.felicijan@gmail.com> | 2026-01-21 22:52:54 +0100 |
| commit | dcacc00e3750300617ba6e16eb346713f91a783a (patch) | |
| tree | 38e2d4fb5ed9d119711d4295c6eda4b014af73fd /examples/redis-unstable/src/slowlog.c | |
| parent | 58dac10aeb8f5a041c46bddbeaf4c7966a99b998 (diff) | |
| download | crep-dcacc00e3750300617ba6e16eb346713f91a783a.tar.gz | |
Remove testing data
Diffstat (limited to 'examples/redis-unstable/src/slowlog.c')
| -rw-r--r-- | examples/redis-unstable/src/slowlog.c | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/examples/redis-unstable/src/slowlog.c b/examples/redis-unstable/src/slowlog.c deleted file mode 100644 index eaf88cc..0000000 --- a/examples/redis-unstable/src/slowlog.c +++ /dev/null @@ -1,186 +0,0 @@ -/* Slowlog implements a system that is able to remember the latest N - * queries that took more than M microseconds to execute. - * - * The execution time to reach to be logged in the slow log is set - * using the 'slowlog-log-slower-than' config directive, that is also - * readable and writable using the CONFIG SET/GET command. - * - * The slow queries log is actually not "logged" in the Redis log file - * but is accessible thanks to the SLOWLOG command. - * - * ---------------------------------------------------------------------------- - * - * Copyright (c) 2009-Present, Redis Ltd. - * All rights reserved. - * - * Licensed under your choice of (a) the Redis Source Available License 2.0 - * (RSALv2); or (b) the Server Side Public License v1 (SSPLv1); or (c) the - * GNU Affero General Public License v3 (AGPLv3). - */ - - -#include "server.h" -#include "slowlog.h" - -/* Create a new slowlog entry. - * Incrementing the ref count of all the objects retained is up to - * this function. */ -slowlogEntry *slowlogCreateEntry(client *c, robj **argv, int argc, long long duration) { - slowlogEntry *se = zmalloc(sizeof(*se)); - int j, slargc = argc; - - if (slargc > SLOWLOG_ENTRY_MAX_ARGC) slargc = SLOWLOG_ENTRY_MAX_ARGC; - se->argc = slargc; - se->argv = zmalloc(sizeof(robj*)*slargc); - for (j = 0; j < slargc; j++) { - /* Logging too many arguments is a useless memory waste, so we stop - * at SLOWLOG_ENTRY_MAX_ARGC, but use the last argument to specify - * how many remaining arguments there were in the original command. */ - if (slargc != argc && j == slargc-1) { - se->argv[j] = createObject(OBJ_STRING, - sdscatprintf(sdsempty(),"... (%d more arguments)", - argc-slargc+1)); - } else { - /* Trim too long strings as well... */ - if (argv[j]->type == OBJ_STRING && - sdsEncodedObject(argv[j]) && - sdslen(argv[j]->ptr) > SLOWLOG_ENTRY_MAX_STRING) - { - sds s = sdsnewlen(argv[j]->ptr, SLOWLOG_ENTRY_MAX_STRING); - - s = sdscatprintf(s,"... (%lu more bytes)", - (unsigned long) - sdslen(argv[j]->ptr) - SLOWLOG_ENTRY_MAX_STRING); - se->argv[j] = createObject(OBJ_STRING,s); - } else if (argv[j]->refcount == OBJ_SHARED_REFCOUNT) { - se->argv[j] = argv[j]; - } else { - /* Here we need to duplicate the string objects composing the - * argument vector of the command, because those may otherwise - * end shared with string objects stored into keys. Having - * shared objects between any part of Redis, and the data - * structure holding the data, is a problem: FLUSHALL ASYNC - * may release the shared string object and create a race. */ - se->argv[j] = dupStringObject(argv[j]); - } - } - } - se->time = time(NULL); - se->duration = duration; - se->id = server.slowlog_entry_id++; - se->peerid = sdsnew(getClientPeerId(c)); - se->cname = c->name ? sdsnew(c->name->ptr) : sdsempty(); - return se; -} - -/* Free a slow log entry. The argument is void so that the prototype of this - * function matches the one of the 'free' method of adlist.c. - * - * This function will take care to release all the retained object. */ -void slowlogFreeEntry(void *septr) { - slowlogEntry *se = septr; - int j; - - for (j = 0; j < se->argc; j++) - decrRefCount(se->argv[j]); - zfree(se->argv); - sdsfree(se->peerid); - sdsfree(se->cname); - zfree(se); -} - -/* Initialize the slow log. This function should be called a single time - * at server startup. */ -void slowlogInit(void) { - server.slowlog = listCreate(); - server.slowlog_entry_id = 0; - listSetFreeMethod(server.slowlog,slowlogFreeEntry); -} - -/* Push a new entry into the slow log. - * This function will make sure to trim the slow log accordingly to the - * configured max length. */ -void slowlogPushEntryIfNeeded(client *c, robj **argv, int argc, long long duration) { - if (server.slowlog_log_slower_than < 0 || server.slowlog_max_len == 0) return; /* Slowlog disabled */ - if (duration >= server.slowlog_log_slower_than) - listAddNodeHead(server.slowlog, - slowlogCreateEntry(c,argv,argc,duration)); - - /* Remove old entries if needed. */ - while (listLength(server.slowlog) > server.slowlog_max_len) - listDelNode(server.slowlog,listLast(server.slowlog)); -} - -/* Remove all the entries from the current slow log. */ -void slowlogReset(void) { - while (listLength(server.slowlog) > 0) - listDelNode(server.slowlog,listLast(server.slowlog)); -} - -/* The SLOWLOG command. Implements all the subcommands needed to handle the - * Redis slow log. */ -void slowlogCommand(client *c) { - if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { - const char *help[] = { -"GET [<count>]", -" Return top <count> entries from the slowlog (default: 10, -1 mean all).", -" Entries are made of:", -" id, timestamp, time in microseconds, arguments array, client IP and port,", -" client name", -"LEN", -" Return the length of the slowlog.", -"RESET", -" Reset the slowlog.", -NULL - }; - addReplyHelp(c, help); - } else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"reset")) { - slowlogReset(); - addReply(c,shared.ok); - } else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"len")) { - addReplyLongLong(c,listLength(server.slowlog)); - } else if ((c->argc == 2 || c->argc == 3) && - !strcasecmp(c->argv[1]->ptr,"get")) - { - long count = 10; - listIter li; - listNode *ln; - slowlogEntry *se; - - if (c->argc == 3) { - /* Consume count arg. */ - if (getRangeLongFromObjectOrReply(c, c->argv[2], -1, - LONG_MAX, &count, "count should be greater than or equal to -1") != C_OK) - return; - - if (count == -1) { - /* We treat -1 as a special value, which means to get all slow logs. - * Simply set count to the length of server.slowlog.*/ - count = listLength(server.slowlog); - } - } - - if (count > (long)listLength(server.slowlog)) { - count = listLength(server.slowlog); - } - addReplyArrayLen(c, count); - listRewind(server.slowlog, &li); - while (count--) { - int j; - - ln = listNext(&li); - se = ln->value; - addReplyArrayLen(c,6); - addReplyLongLong(c,se->id); - addReplyLongLong(c,se->time); - addReplyLongLong(c,se->duration); - addReplyArrayLen(c,se->argc); - for (j = 0; j < se->argc; j++) - addReplyBulk(c,se->argv[j]); - addReplyBulkCBuffer(c,se->peerid,sdslen(se->peerid)); - addReplyBulkCBuffer(c,se->cname,sdslen(se->cname)); - } - } else { - addReplySubcommandSyntaxError(c); - } -} |
