From c26fb3bef2e2bd770d5cea3f1b32b895baf3048b Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Wed, 21 Oct 2020 22:29:34 +0200 Subject: [PATCH] infra: invalidate user caches --- kernel/mars_server.c | 2 ++ kernel/sy_old/mars_main.c | 20 +++++++++++++++++++- kernel/sy_old/strategy.h | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/kernel/mars_server.c b/kernel/mars_server.c index 49bccc61..bd67ce5b 100644 --- a/kernel/mars_server.c +++ b/kernel/mars_server.c @@ -607,6 +607,7 @@ int handler_thread(void *data) status = -EPERM; break; } + invalidate_user_cache(); status = ordered_symlink(cmd.cmd_str1, @@ -629,6 +630,7 @@ int handler_thread(void *data) status = mars_stat(cmd.cmd_str2, &probe, true); if (status < 0) { + invalidate_user_cache(); activate_peer(cmd.cmd_str1, NULL, NULL, true); } status = 0; diff --git a/kernel/sy_old/mars_main.c b/kernel/sy_old/mars_main.c index 8e5dccab..ce1631d6 100644 --- a/kernel/sy_old/mars_main.c +++ b/kernel/sy_old/mars_main.c @@ -223,6 +223,15 @@ void _crashme(int mode, bool do_sync) #endif +void invalidate_user_cache(void) +{ + const char *path; + + path = path_make("/mars/cache-%s/invalid", my_id()); + ordered_symlink("1", path, NULL); + brick_string_free(path); +} + #define GLOBAL_PATH_LIST \ "/mars" \ "|/mars/ips/" \ @@ -2629,6 +2638,14 @@ int run_bone(struct mars_peerinfo *peer, struct mars_dent *remote_dent) #endif } } else if (S_ISLNK(remote_dent->new_stat.mode) && remote_dent->new_link) { + /* is something in /mars/ips/ (or a guest membership) updated ? */ + if ((!stat_ok || + lamport_time_compare(&remote_dent->new_stat.mtime, + &local_stat.mtime) > 0) && + (!strncmp(remote_dent->d_name, "device-", 7) || + !strncmp(remote_path, MARS_IP_STR, strlen(MARS_IP_STR)))) + invalidate_user_cache(); + /* Important: not not create .deleted values * unless the object already exists. */ @@ -2638,7 +2655,8 @@ int run_bone(struct mars_peerinfo *peer, struct mars_dent *remote_dent) status = ordered_symlink(remote_dent->new_link, remote_path, &remote_dent->new_stat.mtime); - MARS_DBG("create symlink '%s' -> '%s' status = %d\n", remote_path, remote_dent->new_link, status); + MARS_DBG("create symlink '%s' -> '%s' status = %d\n", + remote_path, remote_dent->new_link, status); run_trigger = true; if (!status && (!strncmp(remote_dent->d_name, "primary", 7) || diff --git a/kernel/sy_old/strategy.h b/kernel/sy_old/strategy.h index 486375cd..ea809df0 100644 --- a/kernel/sy_old/strategy.h +++ b/kernel/sy_old/strategy.h @@ -72,6 +72,9 @@ extern int mars_keep_msg; extern int mars_fast_fullsync; +#define MARS_IP_STR "/mars/ips/ip-" +extern void invalidate_user_cache(void); + extern char *my_id(void); extern const char *my_uuid;