main: replace remote_dent_list with mars_global instances

This commit is contained in:
Thomas Schoebel-Theuer 2020-09-16 18:12:00 +02:00
parent 1e5be3d1b9
commit aa3f65a1aa

View File

@ -2014,14 +2014,13 @@ static
struct list_head peer_anchor = LIST_HEAD_INIT(peer_anchor); struct list_head peer_anchor = LIST_HEAD_INIT(peer_anchor);
struct mars_peerinfo { struct mars_peerinfo {
struct mars_global *global; struct mars_global *remote_global;
char *peer; char *peer;
char *peer_dir_list; char *peer_dir_list;
struct mars_socket socket; struct mars_socket socket;
struct task_struct *peer_thread; struct task_struct *peer_thread;
struct mutex peer_lock; struct mutex peer_lock;
struct list_head peer_head; struct list_head peer_head;
struct list_head remote_dent_list;
struct list_head push_anchor; struct list_head push_anchor;
struct lamport_time remote_start_stamp; struct lamport_time remote_start_stamp;
unsigned long last_remote_jiffies; unsigned long last_remote_jiffies;
@ -2397,9 +2396,12 @@ int run_bone(struct mars_peerinfo *peer, struct mars_dent *remote_dent)
goto done; goto done;
} }
if (remote_dent->new_link && !strncmp(remote_dent->d_path, "/mars/todo-global/delete-", 25)) { if (remote_dent->new_link &&
if (remote_dent->d_serial < peer->global->deleted_my_border) { !strncmp(remote_dent->d_path, "/mars/todo-global/delete-", 25)) {
MARS_DBG("ignoring deletion '%s' at border %d\n", remote_dent->d_path, peer->global->deleted_my_border); if (remote_dent->d_serial < mars_global->deleted_my_border) {
MARS_DBG("ignoring deletion '%s' at border %d\n",
remote_dent->d_path,
mars_global->deleted_my_border);
goto done; goto done;
} }
} }
@ -2462,11 +2464,15 @@ int run_bone(struct mars_peerinfo *peer, struct mars_dent *remote_dent)
run_systemd_trigger = true; run_systemd_trigger = true;
} }
} else if (S_ISREG(remote_dent->new_stat.mode) && _is_peer_logfile(remote_dent->d_name, my_id())) { } else if (S_ISREG(remote_dent->new_stat.mode) &&
_is_peer_logfile(remote_dent->d_name, my_id())) {
const char *parent_path = backskip_replace(remote_dent->d_path, '/', false, ""); const char *parent_path = backskip_replace(remote_dent->d_path, '/', false, "");
if (likely(parent_path)) { if (likely(parent_path)) {
struct mars_dent *parent = mars_find_dent(peer->global, parent_path); struct mars_dent *parent;
struct mars_rotate *rot; struct mars_rotate *rot;
parent = mars_find_dent(mars_global, parent_path);
if (unlikely(!parent)) { if (unlikely(!parent)) {
MARS_DBG("ignoring non-existing local resource '%s'\n", parent_path); MARS_DBG("ignoring non-existing local resource '%s'\n", parent_path);
// don't copy old / outdated logfiles // don't copy old / outdated logfiles
@ -2474,7 +2480,9 @@ int run_bone(struct mars_peerinfo *peer, struct mars_dent *remote_dent)
rot->relevant_serial > remote_dent->d_serial) { rot->relevant_serial > remote_dent->d_serial) {
MARS_DBG("ignoring outdated remote logfile '%s' (behind %d)\n", remote_dent->d_path, rot->relevant_serial); MARS_DBG("ignoring outdated remote logfile '%s' (behind %d)\n", remote_dent->d_path, rot->relevant_serial);
} else { } else {
struct mars_dent *local_dent = mars_find_dent(peer->global, remote_dent->d_path); struct mars_dent *local_dent;
local_dent = mars_find_dent(mars_global, remote_dent->d_path);
status = check_logfile(peer->peer, remote_dent, local_dent, parent, local_stat.size); status = check_logfile(peer->peer, remote_dent, local_dent, parent, local_stat.size);
} }
brick_string_free(parent_path); brick_string_free(parent_path);
@ -2495,7 +2503,7 @@ int run_bone(struct mars_peerinfo *peer, struct mars_dent *remote_dent)
static static
int run_bones(struct mars_peerinfo *peer) int run_bones(struct mars_peerinfo *peer)
{ {
LIST_HEAD(tmp_list); struct mars_global *tmp_global;
struct lamport_time remote_start_stamp; struct lamport_time remote_start_stamp;
struct list_head *tmp; struct list_head *tmp;
bool run_trigger = false; bool run_trigger = false;
@ -2504,18 +2512,25 @@ int run_bones(struct mars_peerinfo *peer)
mutex_lock(&peer->peer_lock); mutex_lock(&peer->peer_lock);
remote_start_stamp = peer->remote_start_stamp; remote_start_stamp = peer->remote_start_stamp;
list_replace_init(&peer->remote_dent_list, &tmp_list); tmp_global = peer->remote_global;
peer->remote_global = NULL;
mutex_unlock(&peer->peer_lock); mutex_unlock(&peer->peer_lock);
MARS_DBG("remote_dent_list list_empty = %d\n", list_empty(&tmp_list)); MARS_DBG("tmp_global %p '%s'\n",
tmp_global, peer->peer);
if (!tmp_global)
return 0;
if (peer->do_additional && !peer->doing_additional && if (peer->do_additional && !peer->doing_additional &&
!peer->do_communicate && !list_empty(&tmp_list)) { !peer->do_communicate) {
peer->doing_additional = true; peer->doing_additional = true;
mars_running_additional_peers++; mars_running_additional_peers++;
} }
for (tmp = tmp_list.next; tmp != &tmp_list; tmp = tmp->next) { for (tmp = tmp_global->dent_anchor.next;
tmp != &tmp_global->dent_anchor; tmp = tmp->next) {
struct mars_dent *remote_dent = container_of(tmp, struct mars_dent, dent_link); struct mars_dent *remote_dent = container_of(tmp, struct mars_dent, dent_link);
if (!remote_dent->d_path || !remote_dent->d_name) { if (!remote_dent->d_path || !remote_dent->d_name) {
MARS_DBG("NULL\n"); MARS_DBG("NULL\n");
continue; continue;
@ -2527,7 +2542,6 @@ int run_bones(struct mars_peerinfo *peer)
if (status & 2) if (status & 2)
run_systemd_trigger = true; run_systemd_trigger = true;
} }
//MARS_DBG("path = '%s' worker status = %d\n", remote_dent->d_path, status);
} }
if (remote_start_stamp.tv_sec) { if (remote_start_stamp.tv_sec) {
@ -2548,7 +2562,8 @@ int run_bones(struct mars_peerinfo *peer)
brick_string_free(dst); brick_string_free(dst);
} }
mars_free_dent_all(NULL, &tmp_list); mars_free_dent_all(tmp_global, &tmp_global->dent_anchor);
free_mars_global(tmp_global);
if (run_trigger) { if (run_trigger) {
mars_trigger(); mars_trigger();
@ -2605,30 +2620,31 @@ void report_peer_connection(struct mars_peerinfo *peer,
} }
static static
int peer_action_dent_list(struct mars_global *tmp_global, int peer_action_dent_list(struct mars_peerinfo *peer,
struct mars_peerinfo *peer,
const char *real_peer, const char *real_peer,
const char *paths, const char *paths,
struct key_value_pair *peer_pairs, struct key_value_pair *peer_pairs,
struct lamport_time *start_stamp) struct lamport_time *start_stamp)
{ {
struct mars_global *new_global = alloc_mars_global();
struct mars_global *old_global = NULL;
int status; int status;
MARS_DBG("fetching remote dentries from '%s' '%s'\n", MARS_DBG("fetching remote dentries from '%s' '%s'\n",
peer->peer, paths); peer->peer, paths);
status = mars_recv_dent_list(tmp_global, &peer->socket); status = mars_recv_dent_list(new_global, &peer->socket);
if (unlikely(status < 0)) if (unlikely(status < 0))
goto free; goto free;
if (likely(!list_empty(&tmp_global->dent_anchor))) { if (likely(!list_empty(&new_global->dent_anchor))) {
LIST_HEAD(old_list); LIST_HEAD(old_list);
struct mars_dent *peer_uuid; struct mars_dent *peer_uuid;
const char *my_uuid; const char *my_uuid;
MARS_DBG("got remote denties from %s\n", peer->peer); MARS_DBG("got remote dentries from %s\n", peer->peer);
peer_uuid = mars_find_dent(tmp_global, "/mars/uuid"); peer_uuid = mars_find_dent(new_global, "/mars/uuid");
if (unlikely(!peer_uuid || !peer_uuid->new_link)) { if (unlikely(!peer_uuid || !peer_uuid->new_link)) {
MARS_ERR("peer %s has no uuid\n", peer->peer); MARS_ERR("peer %s has no uuid\n", peer->peer);
make_peer_msg(peer, peer_pairs, make_peer_msg(peer, peer_pairs,
@ -2664,31 +2680,37 @@ int peer_action_dent_list(struct mars_global *tmp_global,
peer->peer, real_peer, peer->peer, real_peer,
paths); paths);
/* All right: replace the old global ptr with the new one */
mutex_lock(&peer->peer_lock); mutex_lock(&peer->peer_lock);
peer->remote_start_stamp = *start_stamp; peer->remote_start_stamp = *start_stamp;
list_replace_init(&peer->remote_dent_list, &old_list); old_global = peer->remote_global;
list_replace_init(&tmp_global->dent_anchor, &peer->remote_dent_list); peer->remote_global = new_global;
new_global = NULL;
mutex_unlock(&peer->peer_lock); mutex_unlock(&peer->peer_lock);
peer->last_remote_jiffies = jiffies; peer->last_remote_jiffies = jiffies;
mars_trigger(); mars_trigger();
mars_free_dent_all(tmp_global, &old_list); status = 0;
} }
free: free:
mars_free_dent_all(tmp_global, &tmp_global->dent_anchor); if (old_global) {
mars_free_dent_all(old_global, &old_global->dent_anchor);
free_mars_global(old_global);
}
if (new_global) {
mars_free_dent_all(new_global, &new_global->dent_anchor);
free_mars_global(new_global);
}
return status; return status;
} }
/* React on different types of peer responses /* React on different types of peer responses
*/ */
static static
int peer_actions(struct mars_global *tmp_global, int peer_actions(struct mars_peerinfo *peer,
struct mars_peerinfo *peer,
const char *real_peer, const char *real_peer,
const char *paths, const char *paths,
struct key_value_pair *peer_pairs) struct key_value_pair *peer_pairs)
@ -2699,8 +2721,9 @@ int peer_actions(struct mars_global *tmp_global,
/* Compatibility to old protocol: we cannot send/recv cmds */ /* Compatibility to old protocol: we cannot send/recv cmds */
if (!peer->socket.s_common_proto_level) if (!peer->socket.s_common_proto_level)
return peer_action_dent_list(tmp_global, return peer_action_dent_list(peer,
peer, real_peer, paths, real_peer,
paths,
peer_pairs, peer_pairs,
&inter_cmd.cmd_stamp); &inter_cmd.cmd_stamp);
@ -2715,7 +2738,6 @@ int peer_actions(struct mars_global *tmp_global,
case CMD_GETENTS: case CMD_GETENTS:
{ {
status = peer_action_dent_list( status = peer_action_dent_list(
tmp_global,
peer, peer,
real_peer, real_peer,
paths, paths,
@ -2745,7 +2767,6 @@ int peer_thread(void *data)
{ peer->peer }, { peer->peer },
{ NULL } { NULL }
}; };
struct mars_global *tmp_global;
int pause_time = 0; int pause_time = 0;
bool do_kill = false; bool do_kill = false;
bool repeated = false; bool repeated = false;
@ -2754,8 +2775,6 @@ int peer_thread(void *data)
if (!peer || !mars_net_is_alive) if (!peer || !mars_net_is_alive)
return -1; return -1;
tmp_global = alloc_mars_global();
real_host = mars_translate_hostname(peer->peer); real_host = mars_translate_hostname(peer->peer);
real_peer = path_make("%s:%d", real_peer = path_make("%s:%d",
real_host, real_host,
@ -2917,9 +2936,10 @@ int peer_thread(void *data)
goto free_and_restart; goto free_and_restart;
} }
status = peer_actions(tmp_global, status = peer_actions(peer,
peer, real_peer, real_peer,
cmd.cmd_str1, peer_pairs); cmd.cmd_str1,
peer_pairs);
if (unlikely(status < 0)) { if (unlikely(status < 0)) {
MARS_WRN("communication error on receive, status = %d\n", status); MARS_WRN("communication error on receive, status = %d\n", status);
if (do_kill) { if (do_kill) {
@ -2986,7 +3006,6 @@ int peer_thread(void *data)
done: done:
clear_vals(peer_pairs); clear_vals(peer_pairs);
brick_string_free(real_peer); brick_string_free(real_peer);
free_mars_global(tmp_global);
peer->has_terminated = true; peer->has_terminated = true;
return 0; return 0;
} }
@ -3099,14 +3118,13 @@ void activate_peer(struct mars_rotate *rot, const char *peer_name)
} }
} }
static int _kill_peer(struct mars_global *global, struct mars_peerinfo *peer) static int _kill_peer(struct mars_peerinfo *peer)
{ {
LIST_HEAD(tmp_list); struct mars_global *old_global;
LIST_HEAD(tmp_push_list); LIST_HEAD(tmp_push_list);
if (!peer) { if (!peer)
return 0; return 0;
}
down_write(&peer_lock); down_write(&peer_lock);
if (!list_empty(&peer->peer_head)) if (!list_empty(&peer->peer_head))
@ -3123,7 +3141,8 @@ static int _kill_peer(struct mars_global *global, struct mars_peerinfo *peer)
} }
mutex_lock(&peer->peer_lock); mutex_lock(&peer->peer_lock);
list_replace_init(&peer->remote_dent_list, &tmp_list); old_global = peer->remote_global;
peer->remote_global = NULL;
list_replace_init(&peer->push_anchor, &tmp_push_list); list_replace_init(&peer->push_anchor, &tmp_push_list);
mutex_unlock(&peer->peer_lock); mutex_unlock(&peer->peer_lock);
@ -3136,7 +3155,10 @@ static int _kill_peer(struct mars_global *global, struct mars_peerinfo *peer)
brick_string_free(push->dst); brick_string_free(push->dst);
brick_mem_free(push); brick_mem_free(push);
} }
mars_free_dent_all(NULL, &tmp_list); if (old_global) {
mars_free_dent_all(old_global, &old_global->dent_anchor);
free_mars_global(old_global);
}
if (peer->doing_additional) { if (peer->doing_additional) {
peer->doing_additional = false; peer->doing_additional = false;
peer->do_communicate = false; peer->do_communicate = false;
@ -3151,8 +3173,9 @@ static
void peer_destruct(void *_peer) void peer_destruct(void *_peer)
{ {
struct mars_peerinfo *peer = _peer; struct mars_peerinfo *peer = _peer;
if (likely(peer)) if (likely(peer))
_kill_peer(peer->global, peer); _kill_peer(peer);
} }
static static
@ -3170,7 +3193,7 @@ char * make_peer_dir_list(char *mypeer)
} }
static static
int _make_peer(struct mars_global *global, struct mars_dent *dent) int _make_peer(struct mars_dent *dent)
{ {
static int serial = 0; static int serial = 0;
struct mars_peerinfo *peer; struct mars_peerinfo *peer;
@ -3179,10 +3202,14 @@ int _make_peer(struct mars_global *global, struct mars_dent *dent)
const char *feature_str; const char *feature_str;
int status = 0; int status = 0;
if (!global || !dent || !dent->new_link || !dent->d_parent || !(parent_path = dent->d_parent->d_path)) { if (!dent ||
!dent->new_link ||
!dent->d_parent ||
!dent->d_parent->d_path) {
MARS_DBG("cannot work\n"); MARS_DBG("cannot work\n");
return 0; return 0;
} }
parent_path = dent->d_parent->d_path;
mypeer = dent->d_rest; mypeer = dent->d_rest;
if (!mypeer) { if (!mypeer) {
status = _parse_args(dent, dent->new_link, 1); status = _parse_args(dent, dent->new_link, 1);
@ -3201,7 +3228,6 @@ int _make_peer(struct mars_global *global, struct mars_dent *dent)
} }
dent->d_private_destruct = peer_destruct; dent->d_private_destruct = peer_destruct;
peer = dent->d_private; peer = dent->d_private;
peer->global = global;
peer->peer = brick_strdup(mypeer); peer->peer = brick_strdup(mypeer);
peer->maxdepth = 2; peer->maxdepth = 2;
@ -3213,7 +3239,6 @@ int _make_peer(struct mars_global *global, struct mars_dent *dent)
mutex_init(&peer->peer_lock); mutex_init(&peer->peer_lock);
INIT_LIST_HEAD(&peer->peer_head); INIT_LIST_HEAD(&peer->peer_head);
INIT_LIST_HEAD(&peer->remote_dent_list);
INIT_LIST_HEAD(&peer->push_anchor); INIT_LIST_HEAD(&peer->push_anchor);
/* always trigger on peer startup */ /* always trigger on peer startup */
@ -3315,7 +3340,7 @@ static int kill_scan(void *buf, struct mars_dent *dent)
return 0; return 0;
} }
dent->d_private = NULL; dent->d_private = NULL;
res = _kill_peer(global, peer); res = _kill_peer(peer);
brick_mem_free(peer); brick_mem_free(peer);
return res; return res;
} }
@ -3327,7 +3352,7 @@ static int make_scan(void *buf, struct mars_dent *dent)
if (!strcmp(dent->d_rest, my_id())) { if (!strcmp(dent->d_rest, my_id())) {
return 0; return 0;
} }
return _make_peer(buf, dent); return _make_peer(dent);
} }