req, struct lock_io_check_state);
bool status;
struct stat sb;
+ int fd = -1;
int ret;
status = tevent_wakeup_recv(subreq);
fprintf(stderr, "%s: tevent_wakeup_recv() failed\n", progname);
}
- ret = stat(state->lock_file, &sb);
+ fd = open(state->lock_file, O_RDWR);
+ if (fd == -1) {
+ fprintf(stderr,
+ "%s: "
+ "lock lost - lock file \"%s\" open failed (ret=%d)\n",
+ progname,
+ state->lock_file,
+ errno);
+ goto done;
+ }
+
+ ret = fstat(fd, &sb);
if (ret != 0) {
fprintf(stderr,
"%s: "
progname,
state->lock_file,
errno);
- tevent_req_done(req);
- return;
+ goto done;
}
if (sb.st_ino != state->inode) {
"%s: lock lost - lock file \"%s\" inode changed\n",
progname,
state->lock_file);
- tevent_req_done(req);
- return;
+ goto done;
}
+ close(fd);
+
subreq = tevent_wakeup_send(
state,
state->ev,
return;
}
tevent_req_set_callback(subreq, lock_io_check_loop, req);
+
+ return;
+
+done:
+ if (fd != -1) {
+ close(fd);
+ }
+ tevent_req_done(req);
}
static bool lock_io_check_recv(struct tevent_req *req, int *perr)
test_case "Recheck on, lock file removed"
ok <<EOF
LOCK
-ctdb_mutex_fcntl_helper: lock lost - lock file "${lockfile}" check failed (ret=2)
+ctdb_mutex_fcntl_helper: lock lost - lock file "${lockfile}" open failed (ret=2)
LOST
EOF
unit_test cluster_mutex_test lock-file-removed "$helper 5" "$lockfile"