glusterfs
143 строки · 3.2 Кб
1#
2# Copyright (c) 2011-2014 Red Hat, Inc. <http://www.redhat.com>
3# This file is part of GlusterFS.
4
5# This file is licensed to you under your choice of the GNU Lesser
6# General Public License, version 3 or any later version (LGPLv3 or
7# later), or the GNU General Public License, version 2 (GPLv2), in all
8# cases as published by the Free Software Foundation.
9#
10
11import os
12from ctypes import CDLL, RTLD_GLOBAL, get_errno, byref, c_ulong
13from ctypes.util import find_library
14from syncdutils import ChangelogException, ChangelogHistoryNotAvailable
15from py2py3 import (gr_cl_history_changelog, gr_cl_done,
16gr_create_string_buffer, gr_cl_register,
17gr_cl_history_done, bytearray_to_str)
18
19
20libgfc = CDLL(
21find_library("gfchangelog"),
22mode=RTLD_GLOBAL,
23use_errno=True
24)
25
26
27def _raise_changelog_err():
28errn = get_errno()
29raise ChangelogException(errn, os.strerror(errn))
30
31
32def _init():
33if libgfc.gf_changelog_init(None) == -1:
34_raise_changelog_err()
35
36
37def register(brick, path, log_file, log_level, retries=0):
38_init()
39
40ret = gr_cl_register(libgfc, brick, path, log_file, log_level, retries)
41
42if ret == -1:
43_raise_changelog_err()
44
45
46def scan():
47ret = libgfc.gf_changelog_scan()
48if ret == -1:
49_raise_changelog_err()
50
51
52def startfresh():
53ret = libgfc.gf_changelog_start_fresh()
54if ret == -1:
55_raise_changelog_err()
56
57
58def getchanges():
59def clsort(cfile):
60return cfile.split('.')[-1]
61
62changes = []
63buf = gr_create_string_buffer(4096)
64call = libgfc.gf_changelog_next_change
65
66while True:
67ret = call(buf, 4096)
68if ret in (0, -1):
69break
70
71# py2 and py3 compatibility
72result = bytearray_to_str(buf.raw[:ret - 1])
73changes.append(result)
74
75if ret == -1:
76_raise_changelog_err()
77
78# cleanup tracker
79startfresh()
80
81return sorted(changes, key=clsort)
82
83
84def done(clfile):
85ret = gr_cl_done(libgfc, clfile)
86if ret == -1:
87_raise_changelog_err()
88
89
90def history_scan():
91ret = libgfc.gf_history_changelog_scan()
92if ret == -1:
93_raise_changelog_err()
94
95return ret
96
97
98def history_changelog(changelog_path, start, end, num_parallel):
99actual_end = c_ulong()
100ret = gr_cl_history_changelog(libgfc, changelog_path, start, end,
101num_parallel, byref(actual_end))
102if ret == -1:
103_raise_changelog_err()
104
105if ret == -2:
106raise ChangelogHistoryNotAvailable()
107
108return (ret, actual_end.value)
109
110
111def history_startfresh():
112ret = libgfc.gf_history_changelog_start_fresh()
113if ret == -1:
114_raise_changelog_err()
115
116
117def history_getchanges():
118def clsort(cfile):
119return cfile.split('.')[-1]
120
121changes = []
122buf = gr_create_string_buffer(4096)
123call = libgfc.gf_history_changelog_next_change
124
125while True:
126ret = call(buf, 4096)
127if ret in (0, -1):
128break
129
130# py2 and py3 compatibility
131result = bytearray_to_str(buf.raw[:ret - 1])
132changes.append(result)
133
134if ret == -1:
135_raise_changelog_err()
136
137return sorted(changes, key=clsort)
138
139
140def history_done(clfile):
141ret = gr_cl_history_done(libgfc, clfile)
142if ret == -1:
143_raise_changelog_err()
144