1
#include <glusterfs/api/glfs.h>
2
#include <glusterfs/api/glfs-handles.h>
17
glfs_t *client1 = NULL, *client2 = NULL;
20
char lid1[GLFS_LEASE_ID_SIZE] = "lid1-clnt1",
21
lid2[GLFS_LEASE_ID_SIZE] = "lid2-clnt2";
22
char lid3[GLFS_LEASE_ID_SIZE] = "lid3-clnt2", lid4[GLFS_LEASE_ID_SIZE] = {
25
char *volname = NULL, *glfs_log_file = NULL;
30
#define TEST_FILE "/test/lease"
36
recall_cbk(struct glfs_lease lease, void *data);
39
set_read_lease(glfs_fd_t *fd, char ld[])
41
struct glfs_lease lease = {
46
memset(&lease, 0, sizeof(lease));
47
lease.cmd = GLFS_SET_LEASE;
48
lease.lease_type = GLFS_RD_LEASE;
49
memcpy(&lease.lease_id, ld, GLFS_LEASE_ID_SIZE);
50
ret = glfs_lease(fd, &lease, &recall_cbk, fd);
52
fprintf(log_file, "\n RD_LEASE failed with ret: %d (%s)", ret,
56
fprintf(log_file, "\n Took RD_LEASE");
61
set_write_lease(glfs_fd_t *fd, char ld[])
63
struct glfs_lease lease = {
68
memset(&lease, 0, sizeof(lease));
69
lease.cmd = GLFS_SET_LEASE;
70
lease.lease_type = GLFS_RW_LEASE;
71
memcpy(&lease.lease_id, ld, GLFS_LEASE_ID_SIZE);
72
ret = glfs_lease(fd, &lease, &recall_cbk, NULL);
74
fprintf(log_file, "\n RW_LEASE failed with ret: %d (%s)", ret,
78
fprintf(log_file, "\n Took RW_LEASE");
83
get_lease(glfs_fd_t *fd, char ld[])
85
struct glfs_lease lease = {
90
memset(&lease, 0, sizeof(lease));
91
lease.cmd = GLFS_GET_LEASE;
92
lease.lease_type = -1;
93
memcpy(&lease.lease_id, ld, GLFS_LEASE_ID_SIZE);
94
ret = glfs_lease(fd, &lease, &recall_cbk, NULL);
96
fprintf(log_file, "\n GET_LEASE failed with ret: %d (%s)", ret,
100
if (lease.lease_type == GLFS_RD_LEASE)
101
fprintf(log_file, "\n Esisting Lease: RD_LEASE");
102
else if (lease.lease_type == GLFS_RW_LEASE)
103
fprintf(log_file, "\n Esisting Lease: RW_LEASE");
104
else if (lease.lease_type == 3)
105
fprintf(log_file, "\n Esisting Lease: RD_LEASE|RW_LEASE");
106
else if (lease.lease_type == 0)
107
fprintf(log_file, "\n Esisting Lease: NONE");
109
fprintf(log_file, "\n Existing lease type:%d", lease.lease_type);
110
return lease.lease_type;
114
unlk_write_lease(glfs_fd_t *fd, char ld[])
116
struct glfs_lease lease = {
121
memset(&lease, 0, sizeof(lease));
122
lease.cmd = GLFS_UNLK_LEASE;
123
lease.lease_type = GLFS_RW_LEASE;
124
memcpy(&lease.lease_id, ld, GLFS_LEASE_ID_SIZE);
125
ret = glfs_lease(fd, &lease, &recall_cbk, NULL);
127
fprintf(log_file, "\n Unlock RW_LESAE failed with ret: %d (%s)", ret,
131
fprintf(log_file, "\n Unlocked RW_LEASE");
136
unlk_read_lease(glfs_fd_t *fd, char ld[])
138
struct glfs_lease lease = {
143
memset(&lease, 0, sizeof(lease));
144
lease.cmd = GLFS_UNLK_LEASE;
145
lease.lease_type = GLFS_RD_LEASE;
146
memcpy(&lease.lease_id, ld, GLFS_LEASE_ID_SIZE);
148
ret = glfs_lease(fd, &lease, &recall_cbk, NULL);
150
fprintf(log_file, "\n Unlock RD_LEASE failed with ret: %d (%s)", ret,
154
fprintf(log_file, "\n Unlocked RD_LEASE");
159
up_async_lease_recall(struct glfs_upcall *up_arg, void *data)
161
struct glfs_upcall_lease *in_arg = NULL;
162
enum glfs_upcall_reason reason = 0;
163
struct glfs_object *object = NULL;
170
reason = glfs_upcall_get_reason(up_arg);
174
if (reason == GLFS_UPCALL_RECALL_LEASE) {
175
in_arg = glfs_upcall_get_event(up_arg);
177
object = glfs_upcall_lease_get_object(in_arg);
180
" upcall event type - %d,"
191
setup_new_client(char *volname, char *log_fileile)
195
int up_events = GLFS_EVENT_ANY;
197
fs = glfs_new(volname);
199
fprintf(log_file, "\nglfs_new: returned NULL (%s)\n", strerror(errno));
203
ret = glfs_set_volfile_server(fs, "tcp", "localhost", 24007);
205
fprintf(log_file, "\nglfs_set_volfile_server failed ret:%d (%s)\n", ret,
210
ret = glfs_set_logging(fs, log_fileile, 7);
212
fprintf(log_file, "\nglfs_set_logging failed with ret: %d (%s)\n", ret,
219
fprintf(log_file, "\nglfs_init failed with ret: %d (%s)\n", ret,
225
ret = glfs_upcall_register(fs, up_events, up_async_lease_recall, NULL);
228
if ((ret < 0) || !(ret & GLFS_EVENT_RECALL_LEASE)) {
230
"glfs_upcall_register return doesn't contain"
231
" upcall event - GLFS_EVENT_RECALL_LEASE\n");
242
#define OPEN(client, flags, fd, lease_id) \
245
ret_val = glfs_setfsleaseid(lease_id); \
248
"\nglfs_setfsleaseid failed with ret: %d (%s)\n", ret, \
252
fd = glfs_open(client, TEST_FILE, flags); \
254
fprintf(log_file, "\nglfs_open failed with ret: %d (%s)\n", ret, \
260
#define VERIFY_RESULT(test_case, ret, value) \
262
if (ret != value) { \
264
"\n Testcase %d failed, ret = %d, value=%d\n", \
265
test_case, ret, value); \
268
fprintf(log_file, "\n Testcase %d Succeeded\n", test_case); \
272
recall_cbk(struct glfs_lease lease, void *data)
275
char ld[GLFS_LEASE_ID_SIZE] = "";
277
fprintf(log_file, "\nRECALL received on lease_id:(%s)", lease.lease_id);
278
memcpy(ld, lease.lease_id, GLFS_LEASE_ID_SIZE);
279
ret = unlk_write_lease((glfs_fd_t *)data, ld);
280
VERIFY_RESULT(500, ret, SHUD_PASS);
286
testcase_recall_conflict_lease()
288
struct glfs_object *obj = NULL;
289
glfs_fd_t *fd1 = NULL;
291
struct glfs_lease lease = {
296
"\n Basic test case for conflicting lease causing recall");
298
memset(&lease, 0, sizeof(lease));
299
lease.cmd = GLFS_SET_LEASE;
300
lease.lease_type = GLFS_RD_LEASE;
301
memcpy(&lease.lease_id, lid2, GLFS_LEASE_ID_SIZE);
303
OPEN(client1, O_RDWR, fd1, lid1);
304
ret = set_write_lease(fd1, lid1);
305
VERIFY_RESULT(1, ret, SHUD_PASS);
310
obj = glfs_h_lookupat(client2, NULL, TEST_FILE, NULL, 0);
311
ret = glfs_h_lease(client2, obj, &lease);
312
VERIFY_RESULT(2, ret, SHUD_FAIL);
316
VERIFY_RESULT(6, !upcall_recv, SHUD_PASS);
318
ret = unlk_write_lease(fd1, lid1);
319
VERIFY_RESULT(5, ret, SHUD_PASS);
321
ret = glfs_h_close(obj);
322
VERIFY_RESULT(3, ret, SHUD_PASS);
323
ret = glfs_close(fd1);
324
VERIFY_RESULT(4, ret, SHUD_PASS);
332
main(int argc, char *argv[])
336
glfs_fd_t *fd = NULL;
337
glfs_fd_t *fd1 = NULL;
338
char *topdir = "topdir", *filename = "file1";
341
ssize_t xattr_size = -1;
345
"Expect following args %s <Vol> <glfs client log file> "
346
"<testcase log file>\n",
351
log_file = fopen(argv[3], "w");
356
glfs_log_file = argv[2];
359
client1 = setup_new_client(volname, glfs_log_file);
360
client2 = setup_new_client(volname, glfs_log_file);
362
ret = testcase_recall_conflict_lease();
363
VERIFY_RESULT(101, ret, SHUD_PASS);