Command processing
Roy Lyseng
Roy.Lyseng at Sun.COM
Mon Mar 10 15:01:35 UTC 2008
Hi,
I have been looking at structuring the command processing in memcached
slightly.
I am thinking about creating an array with info about available commands:
static struct {
char *cmdword; /* Command word string */
int cmd; /* Command shorthand */
int mintokens; /* Minimum number of tokens (required) */
int maxtokens; /* Maximum number of tokens (zero means no limit) */
} cmds[] = {
{"get", CMD_GET, 3, 0},
{"delete", CMD_DELETE, 3, 5},
{"add", CMD_ADD, 6, 7},
{"set", CMD_SET, 6, 7},
{"replace", CMD_REPLACE, 6, 7},
{"prepend", CMD_PREPEND, 6, 7},
{"append", CMD_APPEND, 6, 7},
{"gets", CMD_GETS, 3, 0},
{"cas", CMD_CAS, 7, 8},
{"incr", CMD_INCR, 4, 5},
{"decr", CMD_DECR, 4, 5},
{"bget", CMD_BGET, 3, 0},
{"own", CMD_OWN, 3, 3},
{"disown", CMD_DISOWN, 3, 3},
{"bg", CMD_BG, 3, 3},
{"stats", CMD_STATS, 2, 0},
{"flush_all", CMD_FLUSH, 2, 4},
{"version", CMD_VERSION, 2, 2},
{"quit", CMD_QUIT, 2, 2},
{"slabs", CMD_SLABS, 5, 5}, /* Next token should be
"reassign" */
{"verbosity", CMD_VERBOSITY, 3, 4},
{NULL, -1, 0, 0} /* Terminate with a NULL
string pointer */
};
I have tried to sort the presumably most frequent commands first.
process_commands() will then do:
ntokens = tokenize_command(command, tokens, MAX_TOKENS);
for (i = 0; cmds[i].cmdword != NULL; i++) {
if (strcmp(tokens[COMMAND_TOKEN].value, cmds[i].cmdword) == 0) {
cmd = cmds[i].cmd;
break;
}
}
if (cmd < 0) {
out_string(c, "ERROR"); /* Token not matched */
return;
}
if (ntokens < cmds[i].mintokens ||
(cmds[i].maxtokens > 0 && ntokens > cmds[i].maxtokens)) {
out_string(c, "ERROR"); /* Invalid number of
tokens for this cmd */
return;
}
c->item_comm = cmd; /* Command being processed
on connection */
switch (cmd) {
case CMD_GET:
case CMD_BGET:
process_get_command(c, tokens, ntokens, false);
break;
...
Does this look interesting to you guys?
Before I go any further with this, is there any other information that
should be used to characterize commands?
Are there commands that are not in use (BGET?)
More?
Thanks,
Roy
More information about the memcached
mailing list