diff options
author | Damian Hobson-Garcia <dhobsong@igel.co.jp> | 2021-02-19 03:52:55 +0000 |
---|---|---|
committer | Damian Hobson-Garcia <dhobsong@igel.co.jp> | 2021-04-06 15:58:47 +0900 |
commit | abb27e7774e3cd12bd3cfe3d4858bbe590e59be0 (patch) | |
tree | 2b676f85323f0297ffd187d3aef2c0b224e2ff99 /libdlmclient/dlmclient.c | |
parent | d196375b8b130e119285fb19984870edc6941a90 (diff) |
Add lease request and release protocol
Explicitly request / release leases instead of implicitly
by opening and closing the connection. This will allow the
lease manager to take different action when a client
shuts down gracefully vs when it crashes, holding a lease.
Bug-AGL: SPEC-3862
Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp>
Change-Id: Ibc68bee855ce18e56eb6f57e5ad1743248320013
Diffstat (limited to 'libdlmclient/dlmclient.c')
-rw-r--r-- | libdlmclient/dlmclient.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/libdlmclient/dlmclient.c b/libdlmclient/dlmclient.c index 32493d3..03c08a8 100644 --- a/libdlmclient/dlmclient.c +++ b/libdlmclient/dlmclient.c @@ -14,6 +14,8 @@ */ #include "dlmclient.h" + +#include "dlm-protocol.h" #include "log.h" #include "socket-path.h" @@ -46,7 +48,7 @@ static bool lease_connect(struct dlm_lease *lease, const char *name) if (!sockaddr_set_lease_server_path(&sa, name)) return false; - int dlm_server_sock = socket(AF_UNIX, SOCK_STREAM, 0); + int dlm_server_sock = socket(AF_UNIX, SOCK_SEQPACKET, 0); if (dlm_server_sock < 0) { DEBUG_LOG("Socket creation failed: %s\n", strerror(errno)); return false; @@ -65,6 +67,19 @@ static bool lease_connect(struct dlm_lease *lease, const char *name) return true; } +static bool lease_send_request(struct dlm_lease *lease, enum dlm_opcode opcode) +{ + struct dlm_client_request request = { + .opcode = opcode, + }; + + if (!send_dlm_client_request(lease->dlm_server_sock, &request)) { + DEBUG_LOG("Socket data send error: %s\n", strerror(errno)); + return false; + } + return true; +} + static bool lease_recv_fd(struct dlm_lease *lease) { char ctrl_buf[CMSG_SPACE(sizeof(int))] = {0}; @@ -131,6 +146,7 @@ static bool lease_recv_fd(struct dlm_lease *lease) struct dlm_lease *dlm_get_lease(const char *name) { + int saved_errno; struct dlm_lease *lease = calloc(1, sizeof(struct dlm_lease)); if (!lease) { DEBUG_LOG("can't allocate memory : %s\n", strerror(errno)); @@ -142,13 +158,19 @@ struct dlm_lease *dlm_get_lease(const char *name) return NULL; } - if (!lease_recv_fd(lease)) { - close(lease->dlm_server_sock); - free(lease); - return NULL; - } + if (!lease_send_request(lease, DLM_GET_LEASE)) + goto err; + + if (!lease_recv_fd(lease)) + goto err; return lease; + +err: + saved_errno = errno; + dlm_release_lease(lease); + errno = saved_errno; + return NULL; } void dlm_release_lease(struct dlm_lease *lease) @@ -156,6 +178,7 @@ void dlm_release_lease(struct dlm_lease *lease) if (!lease) return; + lease_send_request(lease, DLM_RELEASE_LEASE); close(lease->lease_fd); close(lease->dlm_server_sock); free(lease); |