From 572527f8cb6b38597c75c50766d44882a390bdaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Wed, 10 Apr 2013 11:26:10 +0200 Subject: [PATCH] plugin for fetching cache dump from any node after joining legion --- .../legion_cache_fetch/legion_cache_fetch.c | 62 +++++++++++++++++++ plugins/legion_cache_fetch/uwsgiplugin.py | 8 +++ 2 files changed, 70 insertions(+) create mode 100644 plugins/legion_cache_fetch/legion_cache_fetch.c create mode 100644 plugins/legion_cache_fetch/uwsgiplugin.py diff --git a/plugins/legion_cache_fetch/legion_cache_fetch.c b/plugins/legion_cache_fetch/legion_cache_fetch.c new file mode 100644 index 00000000..67431437 --- /dev/null +++ b/plugins/legion_cache_fetch/legion_cache_fetch.c @@ -0,0 +1,62 @@ +#include + + +static int legion_action_cache_fetch_from_legion(struct uwsgi_legion *ul, char *arg) { + uwsgi_log("[legion-cache-fetch] getting cache '%s' dump from legion '%s' nodes\n", arg, ul->legion); + + struct uwsgi_cache *uc = uwsgi_cache_by_name(arg); + if (!uc) { + uwsgi_log("[legion-cache-fetch] cannot sync, cache '%s' not found\n", arg); + return 1; + } + + struct uwsgi_string_list *dump_from_nodes = NULL; + + struct uwsgi_legion_node *legion_nodes = ul->nodes_head; + while (legion_nodes) { + char *dump_socket = NULL; + if (uwsgi_kvlist_parse(legion_nodes->scroll, legion_nodes->scroll_len, ',', '=', + "dump-socket", &dump_socket, + NULL)) { + uwsgi_log("[legion-cache-fetch] cannot sync from %.*s, cache socket address not found in legion scroll: %.*s\n", + legion_nodes->name_len, legion_nodes->name, legion_nodes->scroll_len, legion_nodes->scroll); + } + else { + if (dump_socket) { + uwsgi_string_new_list(&dump_from_nodes, dump_socket); + } + else { + uwsgi_log("[legion-cache-fetch] cannot sync from %.*s, cache socket address not found in legion scroll: %.*s\n", + legion_nodes->name_len, legion_nodes->name, legion_nodes->scroll_len, legion_nodes->scroll); + } + } + legion_nodes = legion_nodes->next; + } + + // update uc->sync_nodes list + struct uwsgi_string_list *usl = uc->sync_nodes; + struct uwsgi_string_list *next; + while (usl) { + next = usl->next; + free(usl); + usl = next; + } + uc->sync_nodes = dump_from_nodes; + + // call sync + uwsgi_cache_sync_from_nodes(uc); + + return 0; +} + + +static void legion_cache_register() { + uwsgi_legion_action_register("legion-cache-fetch", legion_action_cache_fetch_from_legion); +} + + +struct uwsgi_plugin legion_cache_fetch_plugin = { + .name = "legion_cache_fetch", + .on_load = legion_cache_register, +}; + diff --git a/plugins/legion_cache_fetch/uwsgiplugin.py b/plugins/legion_cache_fetch/uwsgiplugin.py new file mode 100644 index 00000000..27c53add --- /dev/null +++ b/plugins/legion_cache_fetch/uwsgiplugin.py @@ -0,0 +1,8 @@ + +NAME = 'legion_cache_fetch' +CFLAGS = [] +LDFLAGS = [] +LIBS = [] + +GCC_LIST = ['legion_cache_fetch'] +