mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-06-16 02:15:48 +00:00
72 lines
1.9 KiB
C
72 lines
1.9 KiB
C
#include <uwsgi.h>
|
|
|
|
|
|
extern struct uwsgi_server uwsgi;
|
|
|
|
|
|
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;
|
|
|
|
uwsgi_rlock(ul->lock);
|
|
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->value);
|
|
free(usl);
|
|
usl = next;
|
|
}
|
|
uwsgi_rwunlock(ul->lock);
|
|
|
|
uwsgi_rlock(uc->lock);
|
|
uc->sync_nodes = dump_from_nodes;
|
|
uwsgi_rwunlock(uc->lock);
|
|
|
|
// 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,
|
|
};
|
|
|