From 1a1d50a0e11c7f0f03cbca8dea068c3c0d49937d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=91=AB=E9=91=AB?= <1310342532@qq.com> Date: Sat, 11 Jan 2025 15:54:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ecm=5Fcheck=5Fdlock=5Fremain?= =?UTF-8?q?=E5=92=8Ccm=5Fdl=5Fcheck=5Flock=5Fremain=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cm_utils/cm_disklock.c | 25 +++++++++++++++++++++++++ src/cm_utils/cm_disklock.h | 9 +++++++++ src/cm_utils/cm_dlock.c | 23 +++++++++++++++++++++++ src/cm_utils/cm_dlock.h | 2 +- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/cm_utils/cm_disklock.c b/src/cm_utils/cm_disklock.c index 1aad82f..309393e 100644 --- a/src/cm_utils/cm_disklock.c +++ b/src/cm_utils/cm_disklock.c @@ -524,6 +524,31 @@ unsigned int cm_dl_alloc_lease( return lock_id; } +int cm_dl_check_lock_remain(unsigned int lock_id, unsigned long long inst_id, unsigned int *is_remain) +{ + *is_remain = CM_FALSE; + if (lock_id >= CM_MAX_DISKLOCK_COUNT) { + LOG_RUN_ERR("DL:invalid lock_id:%u.", lock_id); + return CM_DL_ERR_INVALID_LOCK_ID; + } + cm_dl_t *lock_info = &g_dl_ctx.lock_info[lock_id]; + dl_stat_t *lock_stat = &lock_info->lock_stat[inst_id + 1]; + if (lock_info->fd <= 0) { + LOG_RUN_ERR("DL:invalid lock not ready, lock_id:%u.", lock_id); + return CM_DL_ERR_INVALID_LOCK_ID; + } + ssize_t size = pread( + lock_info->fd, lock_stat, CM_BLOCK_SIZE, (off_t)(lock_info->offset + CM_BLOCK_SIZE * (lock_info->inst_id + 1))); + if(size != CM_BLOCK_SIZE) { + LOG_RUN_ERR("DL:read path failed:%d,%s.", errno, strerror(errno)); + return CM_DL_ERR_IO; + } + if (lock_stat->locked != LS_NO_LOCK) { + *is_remain = CM_TRUE; + } + return CM_SUCCESS; +} + #ifdef __cplusplus } #endif diff --git a/src/cm_utils/cm_disklock.h b/src/cm_utils/cm_disklock.h index 3612f9e..b01c5e4 100644 --- a/src/cm_utils/cm_disklock.h +++ b/src/cm_utils/cm_disklock.h @@ -117,6 +117,15 @@ int cm_dl_getowner(unsigned int lock_id, unsigned long long *inst_id); * @return != 0 fail */ int cm_dl_getlocktime(unsigned int lock_id, unsigned long long *locktime); +/** + * Check whether the lock remains. + * @param [in] lock_id: lock_id + * @param [in] inst_id: inst_id + * @param [out] is_remain: lock remain result. + * @return 0 success + * @return != 0 fail + */ +int cm_dl_check_lock_remain(unsigned int lock_id, unsigned long long inst_id, unsigned int *is_remain); #ifdef __cplusplus } diff --git a/src/cm_utils/cm_dlock.c b/src/cm_utils/cm_dlock.c index 4589606..4789ac4 100644 --- a/src/cm_utils/cm_dlock.c +++ b/src/cm_utils/cm_dlock.c @@ -613,3 +613,26 @@ status_t cm_get_dlock_info(dlock_t *lock, int32 fd) #endif return CM_SUCCESS; } +status_t cm_check_dlock_remain(dlock_t *lock, int32 fd, bool32 *is_remain) +{ + *is_remain = CM_FALSE; +#ifdef WIN32 +#else + status_t status = cm_get_dlock_info(lock, fd); + if (status != CM_SUCCESS) { + return CM_ERROR; + } + if (LOCKR_INST_ID(*lock) == 0) { + LOG_DEBUG_INF("there is no lock on disk."); + return CM_SUCCESS; + } + + if (LOCKR_INST_ID(*lock) != LOCKW_INST_ID(*lock)) { + LOG_DEBUG_INF( + "another inst_id(disk) %lld, curr inst_id(lock) %lld.", LOCKR_INST_ID(*lock), LOCKW_INST_ID(*lock)); + return CM_SUCCESS; + } + *is_remain = CM_TRUE; +#endif + return CM_SUCCESS; +} diff --git a/src/cm_utils/cm_dlock.h b/src/cm_utils/cm_dlock.h index bd1a732..6c172dd 100644 --- a/src/cm_utils/cm_dlock.h +++ b/src/cm_utils/cm_dlock.h @@ -121,7 +121,7 @@ status_t cm_disk_unlockf(dlock_t *lock, int32 fd, int64 old_inst_id); int32 cm_preempt_dlock(dlock_t *lock, const char *scsi_dev); status_t cm_erase_dlock(dlock_t *lock, int32 fd); status_t cm_get_dlock_info(dlock_t *lock, int32 fd); - +status_t cm_check_dlock_remain(dlock_t *lock, int32 fd, bool32 *is_remain); #ifdef __cplusplus } #endif -- Gitee