glusterfs

Форк
0
/
bug-808400-flock.c 
100 строк · 2.1 Кб
1
#include <sys/file.h>
2
#include <stdio.h>
3
#include <string.h>
4
#include <errno.h>
5
#include <sys/types.h>
6
#include <sys/stat.h>
7
#include <fcntl.h>
8
#include <sys/wait.h>
9

10
#ifndef linux
11
#define fstat64(fd, st) fstat(fd, st)
12
#endif
13

14
int
15
run_child(char *filename)
16
{
17
    int fd = -1, ret = -1;
18

19
    fd = open(filename, O_RDWR);
20
    if (fd < 0) {
21
        fprintf(stderr, "open failed (%s)\n", strerror(errno));
22
        goto out;
23
    }
24

25
    ret = flock(fd, LOCK_EX | LOCK_NB);
26
    if ((ret == 0) || (errno != EWOULDBLOCK)) {
27
        fprintf(stderr,
28
                "no locks present, though parent has held "
29
                "one\n");
30
        ret = -1;
31
        goto out;
32
    }
33

34
    ret = 0;
35
out:
36
    return ret;
37
}
38

39
int
40
main(int argc, char *argv[])
41
{
42
    int fd = -1, ret = -1, status = 0;
43
    char *filename = NULL, *cmd = NULL;
44
    struct stat stbuf = {
45
        0,
46
    };
47

48
    if (argc != 3) {
49
        fprintf(stderr,
50
                "Usage: %s <filename> "
51
                "<gluster-cmd-to-trigger-graph-switch>\n",
52
                argv[0]);
53
        goto out;
54
    }
55

56
    filename = argv[1];
57
    cmd = argv[2];
58

59
    fd = open(filename, O_RDWR | O_CREAT, 0);
60
    if (fd < 0) {
61
        fprintf(stderr, "open (%s) failed (%s)\n", filename, strerror(errno));
62
        goto out;
63
    }
64

65
    ret = flock(fd, LOCK_EX);
66
    if (ret < 0) {
67
        fprintf(stderr, "flock failed (%s)\n", strerror(errno));
68
        goto out;
69
    }
70

71
    system(cmd);
72

73
    /* wait till graph switch completes */
74
    ret = fstat64(fd, &stbuf);
75
    if (ret < 0) {
76
        fprintf(stderr, "fstat64 failure (%s)\n", strerror(errno));
77
        goto out;
78
    }
79

80
    sleep(10);
81

82
    /* By now old-graph would be disconnected and locks should be cleaned
83
     * up if they are not migrated. Check that by trying to acquire a lock
84
     * on a new fd opened by another process on same file
85
     */
86
    ret = fork();
87
    if (ret == 0) {
88
        ret = run_child(filename);
89
    } else {
90
        wait(&status);
91
        if (WIFEXITED(status)) {
92
            ret = WEXITSTATUS(status);
93
        } else {
94
            ret = 0;
95
        }
96
    }
97

98
out:
99
    return ret;
100
}
101

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.