From 6240d633b229e15d445868a8b1463fb8ee6ddbc6 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Wed, 23 Oct 2024 14:51:04 -0500 Subject: [PATCH] sanlock: new NODELAY flag for add_lockspace Forces the existing "no delay" path for acquiring a host_id delta lease. This avoids delays in add_lockspace that are used to detect machines using the same host_id. So, using this flag is unsafe if multiple hosts may end up using the same host_id. --- src/cmd.c | 3 ++- src/delta_lease.c | 8 ++++++-- src/delta_lease.h | 1 + src/direct.c | 1 + src/lockspace.c | 5 +++-- src/lockspace.h | 2 +- src/sanlock_admin.h | 1 + src/sanlock_internal.h | 1 + 8 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/cmd.c b/src/cmd.c index e91da9d3eb41..47656bbb7f75 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1306,6 +1306,7 @@ static void cmd_add_lockspace(struct cmd_args *ca, uint32_t cmd) struct space *sp; uint32_t io_timeout; int async = ca->header.cmd_flags & SANLK_ADD_ASYNC; + int nodelay = (ca->header.cmd_flags & SANLK_ADD_NODELAY) ? 1 : 0; int fd, rv, result; fd = client[ca->ci_in].fd; @@ -1329,7 +1330,7 @@ static void cmd_add_lockspace(struct cmd_args *ca, uint32_t cmd) if (!io_timeout) io_timeout = com.io_timeout; - rv = add_lockspace_start(&lockspace, io_timeout, &sp); + rv = add_lockspace_start(&lockspace, io_timeout, nodelay, &sp); if (rv < 0) { result = rv; goto reply; diff --git a/src/delta_lease.c b/src/delta_lease.c index fb4a6402858d..144c0ea0ee11 100644 --- a/src/delta_lease.c +++ b/src/delta_lease.c @@ -332,6 +332,7 @@ int delta_lease_acquire(struct task *task, char *space_name, char *our_host_name, uint64_t host_id, + int nodelay, struct leader_record *leader_ret) { struct leader_record leader; @@ -394,13 +395,16 @@ int delta_lease_acquire(struct task *task, no_delay = 1; if (is_same && our_host_name_matches_product_uuid) no_delay = 1; + if (nodelay) + no_delay = 1; - log_space(sp, "delta_acquire %s owner, %s free, %s our_product_uuid, %s delay, other_io_timeout %d", + log_space(sp, "delta_acquire %s owner, %s free, %s our_product_uuid, %s delay, other_io_timeout %d, flag_nodelay %d", is_same ? "same" : "new", is_free ? "is" : "not", our_host_name_matches_product_uuid ? "is" : "not", no_delay ? "no" : "short", - other_io_timeout); + other_io_timeout, + nodelay); goto write_new; } diff --git a/src/delta_lease.h b/src/delta_lease.h index ec1c3468bf72..22c6faa16995 100644 --- a/src/delta_lease.h +++ b/src/delta_lease.h @@ -24,6 +24,7 @@ int delta_lease_acquire(struct task *task, char *space_name, char *our_host_name, uint64_t host_id, + int nodelay, struct leader_record *leader_ret); int delta_lease_renew(struct task *task, diff --git a/src/direct.c b/src/direct.c index 3bc7659e905c..1f4064795c4a 100644 --- a/src/direct.c +++ b/src/direct.c @@ -364,6 +364,7 @@ static int do_delta_action(int action, ls->name, our_host_name, ls->host_id, + 0, &leader); break; case ACT_RENEW_ID: diff --git a/src/lockspace.c b/src/lockspace.c index a2bee3f478fd..1cea79d41618 100644 --- a/src/lockspace.c +++ b/src/lockspace.c @@ -973,7 +973,7 @@ static void *lockspace_thread(void *arg_in) delta_result = delta_lease_acquire(&task, sp, &sp->host_id_disk, sp->space_name, our_host_name_global, - sp->host_id, &leader); + sp->host_id, sp->nodelay, &leader); delta_length = monotime() - delta_begin; if (delta_result == SANLK_OK) @@ -1152,7 +1152,7 @@ static void free_sp(struct space *sp) free(sp); } -int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct space **sp_out) +int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, int nodelay, struct space **sp_out) { struct space *sp, *sp2; int listnum = 0; @@ -1178,6 +1178,7 @@ int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct sp->host_id_disk.fd = -1; sp->host_id = ls->host_id; sp->io_timeout = io_timeout; + sp->nodelay = nodelay; sp->set_bitmap_seconds = calc_set_bitmap_seconds(io_timeout); pthread_mutex_init(&sp->mutex, NULL); diff --git a/src/lockspace.h b/src/lockspace.h index 0c3cba324e31..790a5cc68499 100644 --- a/src/lockspace.h +++ b/src/lockspace.h @@ -42,7 +42,7 @@ int check_our_lease(struct space *sp, int *check_all, char *check_buf); void check_other_leases(struct space *sp, char *buf); /* locks spaces_mutex */ -int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct space **sp_out); +int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, int nodelay, struct space **sp_out); /* locks sp, locks spaces_mutex */ int add_lockspace_wait(struct space *sp); diff --git a/src/sanlock_admin.h b/src/sanlock_admin.h index 685cce11d6f3..10bfc49b312b 100644 --- a/src/sanlock_admin.h +++ b/src/sanlock_admin.h @@ -12,6 +12,7 @@ /* add flags */ #define SANLK_ADD_ASYNC 0x00000001 +#define SANLK_ADD_NODELAY 0x00000002 /* can be unsafe */ /* rem flags */ #define SANLK_REM_ASYNC 0x00000001 diff --git a/src/sanlock_internal.h b/src/sanlock_internal.h index ebb0a9c319c1..e57127b17233 100644 --- a/src/sanlock_internal.h +++ b/src/sanlock_internal.h @@ -217,6 +217,7 @@ struct space { uint32_t renewal_read_extend_sec; /* defaults to io_timeout */ uint32_t rindex_op; unsigned int set_max_sectors_kb; + int nodelay; int sector_size; int align_size; int max_hosts; -- 2.46.2