Statistics
| Branch: | Tag: | Revision:

root / xseg / tools / archipelago / archipelago / common.py @ 6b11e79a

History | View | Annotate | Download (23.9 kB)

1 979bf615 Filippos Giannakos
#!/usr/bin/env python
2 979bf615 Filippos Giannakos
3 979bf615 Filippos Giannakos
# Copyright 2012 GRNET S.A. All rights reserved.
4 979bf615 Filippos Giannakos
#
5 979bf615 Filippos Giannakos
# Redistribution and use in source and binary forms, with or
6 979bf615 Filippos Giannakos
# without modification, are permitted provided that the following
7 979bf615 Filippos Giannakos
# conditions are met:
8 979bf615 Filippos Giannakos
#
9 979bf615 Filippos Giannakos
#   1. Redistributions of source code must retain the above
10 979bf615 Filippos Giannakos
#      copyright notice, this list of conditions and the following
11 979bf615 Filippos Giannakos
#      disclaimer.
12 979bf615 Filippos Giannakos
#   2. Redistributions in binary form must reproduce the above
13 979bf615 Filippos Giannakos
#      copyright notice, this list of conditions and the following
14 979bf615 Filippos Giannakos
#      disclaimer in the documentation and/or other materials
15 979bf615 Filippos Giannakos
#      provided with the distribution.
16 979bf615 Filippos Giannakos
#
17 979bf615 Filippos Giannakos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 979bf615 Filippos Giannakos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 979bf615 Filippos Giannakos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 979bf615 Filippos Giannakos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 979bf615 Filippos Giannakos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 979bf615 Filippos Giannakos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 979bf615 Filippos Giannakos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 979bf615 Filippos Giannakos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 979bf615 Filippos Giannakos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 979bf615 Filippos Giannakos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 979bf615 Filippos Giannakos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 979bf615 Filippos Giannakos
# POSSIBILITY OF SUCH DAMAGE.
29 979bf615 Filippos Giannakos
#
30 979bf615 Filippos Giannakos
# The views and conclusions contained in the software and
31 979bf615 Filippos Giannakos
# documentation are those of the authors and should not be
32 979bf615 Filippos Giannakos
# interpreted as representing official policies, either expressed
33 979bf615 Filippos Giannakos
# or implied, of GRNET S.A.
34 979bf615 Filippos Giannakos
#
35 979bf615 Filippos Giannakos
36 979bf615 Filippos Giannakos
37 979bf615 Filippos Giannakos
from xseg.xseg_api import *
38 979bf615 Filippos Giannakos
from xseg.xprotocol import *
39 979bf615 Filippos Giannakos
from ctypes import CFUNCTYPE, cast, c_void_p, addressof, string_at, memmove, \
40 1075ead7 Filippos Giannakos
    create_string_buffer, pointer, sizeof, POINTER, byref
41 1075ead7 Filippos Giannakos
42 979bf615 Filippos Giannakos
cb_null_ptrtype = CFUNCTYPE(None, uint32_t)
43 979bf615 Filippos Giannakos
44 1075ead7 Filippos Giannakos
import os
45 1075ead7 Filippos Giannakos
import sys
46 1075ead7 Filippos Giannakos
import time
47 1075ead7 Filippos Giannakos
import psutil
48 1075ead7 Filippos Giannakos
import errno
49 1075ead7 Filippos Giannakos
from subprocess import check_call
50 979bf615 Filippos Giannakos
from collections import namedtuple
51 979bf615 Filippos Giannakos
52 979bf615 Filippos Giannakos
#archipelago peer roles. Order matters!
53 979bf615 Filippos Giannakos
roles = ['blockerb', 'blockerm', 'mapperd', 'vlmcd']
54 979bf615 Filippos Giannakos
Peer = namedtuple('Peer', ['executable', 'opts', 'role'])
55 979bf615 Filippos Giannakos
56 979bf615 Filippos Giannakos
peers = dict()
57 979bf615 Filippos Giannakos
xsegbd_args = []
58 979bf615 Filippos Giannakos
modules = ['xseg', 'segdev', 'xseg_posix', 'xseg_pthread', 'xseg_segdev']
59 979bf615 Filippos Giannakos
xsegbd = 'xsegbd'
60 979bf615 Filippos Giannakos
61 1075ead7 Filippos Giannakos
DEFAULTS = '/etc/default/archipelago'
62 979bf615 Filippos Giannakos
63 979bf615 Filippos Giannakos
#system defaults
64 1075ead7 Filippos Giannakos
ARCHIP_PREFIX = 'archip_'
65 1075ead7 Filippos Giannakos
LOG_SUFFIX = '.log'
66 1075ead7 Filippos Giannakos
PID_SUFFIX = '.pid'
67 1075ead7 Filippos Giannakos
PIDFILE_PATH = "/var/run/archipelago"
68 1075ead7 Filippos Giannakos
VLMC_LOCK_FILE = 'vlmc.lock'
69 1075ead7 Filippos Giannakos
LOGS_PATH = "/var/log/archipelago"
70 1075ead7 Filippos Giannakos
LOCK_PATH = "/var/lock"
71 1075ead7 Filippos Giannakos
DEVICE_PREFIX = "/dev/xsegbd"
72 1075ead7 Filippos Giannakos
XSEGBD_SYSFS = "/sys/bus/xsegbd/"
73 1075ead7 Filippos Giannakos
74 1075ead7 Filippos Giannakos
CHARDEV_NAME = "/dev/segdev"
75 1075ead7 Filippos Giannakos
CHARDEV_MAJOR = 60
76 1075ead7 Filippos Giannakos
CHARDEV_MINOR = 0
77 1075ead7 Filippos Giannakos
78 1075ead7 Filippos Giannakos
REQS = 512
79 1075ead7 Filippos Giannakos
80 6b11e79a Filippos Giannakos
FILE_BLOCKER = 'archip-pfiled'
81 6b11e79a Filippos Giannakos
RADOS_BLOCKER = 'archip-sosd'
82 6b11e79a Filippos Giannakos
MAPPER = 'archip-mapperd'
83 6b11e79a Filippos Giannakos
VLMC = 'archip-vlmcd'
84 1075ead7 Filippos Giannakos
BLOCKER = ''
85 979bf615 Filippos Giannakos
86 979bf615 Filippos Giannakos
available_storage = {'files': FILE_BLOCKER, 'rados': RADOS_BLOCKER}
87 979bf615 Filippos Giannakos
88 979bf615 Filippos Giannakos
89 7bac0881 Filippos Giannakos
config = {
90 1075ead7 Filippos Giannakos
    'CEPH_CONF_FILE': '/etc/ceph/ceph.conf',
91 1075ead7 Filippos Giannakos
    'XSEGBD_START': 0,
92 1075ead7 Filippos Giannakos
    'XSEGBD_END': 499,
93 1075ead7 Filippos Giannakos
    'VPORT_START': 500,
94 1075ead7 Filippos Giannakos
    'VPORT_END': 999,
95 1075ead7 Filippos Giannakos
    'BPORT': 1000,
96 1075ead7 Filippos Giannakos
    'MPORT': 1001,
97 1075ead7 Filippos Giannakos
    'MBPORT': 1002,
98 1075ead7 Filippos Giannakos
    'VTOOL': 1003,
99 1075ead7 Filippos Giannakos
    #RESERVED 1023
100 1075ead7 Filippos Giannakos
    #default config
101 1075ead7 Filippos Giannakos
    'SPEC': "segdev:xsegbd:1024:5120:12",
102 1075ead7 Filippos Giannakos
    'NR_OPS_BLOCKERB': "",
103 1075ead7 Filippos Giannakos
    'NR_OPS_BLOCKERM': "",
104 1075ead7 Filippos Giannakos
    'NR_OPS_VLMC': "",
105 1075ead7 Filippos Giannakos
    'NR_OPS_MAPPER': "",
106 1075ead7 Filippos Giannakos
    #'VERBOSITY_BLOCKERB': "",
107 1075ead7 Filippos Giannakos
    #'VERBOSITY_BLOCKERM': "",
108 1075ead7 Filippos Giannakos
    #'VERBOSITY_MAPPER': "",
109 1075ead7 Filippos Giannakos
    #'VERBOSITY_VLMC': "",
110 1075ead7 Filippos Giannakos
    #mt-pfiled specific options,
111 1075ead7 Filippos Giannakos
    'FILED_IMAGES': "",
112 1075ead7 Filippos Giannakos
    'FILED_MAPS': "",
113 1075ead7 Filippos Giannakos
    'PITHOS': "",
114 1075ead7 Filippos Giannakos
    'PITHOSMAPS': "",
115 1075ead7 Filippos Giannakos
    #mt-sosd specific options,
116 1075ead7 Filippos Giannakos
    'RADOS_POOL_MAPS': "",
117 1075ead7 Filippos Giannakos
    'RADOS_POOL_BLOCKS': ""
118 7bac0881 Filippos Giannakos
}
119 979bf615 Filippos Giannakos
120 979bf615 Filippos Giannakos
FIRST_COLUMN_WIDTH = 23
121 979bf615 Filippos Giannakos
SECOND_COLUMN_WIDTH = 23
122 979bf615 Filippos Giannakos
123 1075ead7 Filippos Giannakos
124 979bf615 Filippos Giannakos
def green(s):
125 979bf615 Filippos Giannakos
    return '\x1b[32m' + str(s) + '\x1b[0m'
126 979bf615 Filippos Giannakos
127 1075ead7 Filippos Giannakos
128 979bf615 Filippos Giannakos
def red(s):
129 979bf615 Filippos Giannakos
    return '\x1b[31m' + str(s) + '\x1b[0m'
130 979bf615 Filippos Giannakos
131 1075ead7 Filippos Giannakos
132 979bf615 Filippos Giannakos
def yellow(s):
133 979bf615 Filippos Giannakos
    return '\x1b[33m' + str(s) + '\x1b[0m'
134 979bf615 Filippos Giannakos
135 1075ead7 Filippos Giannakos
136 979bf615 Filippos Giannakos
def pretty_print(cid, status):
137 979bf615 Filippos Giannakos
    sys.stdout.write(cid.ljust(FIRST_COLUMN_WIDTH))
138 979bf615 Filippos Giannakos
    sys.stdout.write(status.ljust(SECOND_COLUMN_WIDTH))
139 979bf615 Filippos Giannakos
    sys.stdout.write('\n')
140 979bf615 Filippos Giannakos
    return
141 979bf615 Filippos Giannakos
142 1075ead7 Filippos Giannakos
143 979bf615 Filippos Giannakos
class Error(Exception):
144 979bf615 Filippos Giannakos
    def __init__(self, msg):
145 979bf615 Filippos Giannakos
        self.msg = msg
146 979bf615 Filippos Giannakos
147 979bf615 Filippos Giannakos
    def __str__(self):
148 979bf615 Filippos Giannakos
        return self.msg
149 979bf615 Filippos Giannakos
150 1075ead7 Filippos Giannakos
151 979bf615 Filippos Giannakos
def check_conf():
152 979bf615 Filippos Giannakos
    def isExec(file_path):
153 979bf615 Filippos Giannakos
        return os.path.isfile(file_path) and os.access(file_path, os.X_OK)
154 979bf615 Filippos Giannakos
155 979bf615 Filippos Giannakos
    def validExec(program):
156 979bf615 Filippos Giannakos
        for path in os.environ["PATH"].split(os.pathsep):
157 979bf615 Filippos Giannakos
            exe_file = os.path.join(path, program)
158 979bf615 Filippos Giannakos
            if isExec(exe_file):
159 979bf615 Filippos Giannakos
                return True
160 979bf615 Filippos Giannakos
        return False
161 979bf615 Filippos Giannakos
162 979bf615 Filippos Giannakos
    def validPort(port, limit, name):
163 979bf615 Filippos Giannakos
        try:
164 979bf615 Filippos Giannakos
            if int(port) >= limit:
165 979bf615 Filippos Giannakos
                print red(str(port) + " >= " + limit)
166 979bf615 Filippos Giannakos
                return False
167 979bf615 Filippos Giannakos
        except:
168 979bf615 Filippos Giannakos
            print red("Invalid port "+name+" : " + str(port))
169 979bf615 Filippos Giannakos
            return False
170 979bf615 Filippos Giannakos
171 979bf615 Filippos Giannakos
        return True
172 979bf615 Filippos Giannakos
173 979bf615 Filippos Giannakos
    if not LOGS_PATH:
174 979bf615 Filippos Giannakos
        print red("LOGS_PATH is not set")
175 979bf615 Filippos Giannakos
        return False
176 979bf615 Filippos Giannakos
    if not PIDFILE_PATH:
177 979bf615 Filippos Giannakos
        print red("PIDFILE_PATH is not set")
178 979bf615 Filippos Giannakos
        return False
179 979bf615 Filippos Giannakos
180 979bf615 Filippos Giannakos
    try:
181 979bf615 Filippos Giannakos
        if not os.path.isdir(str(LOGS_PATH)):
182 979bf615 Filippos Giannakos
            print red("LOGS_PATH "+str(LOGS_PATH)+" does not exist")
183 979bf615 Filippos Giannakos
            return False
184 979bf615 Filippos Giannakos
    except:
185 979bf615 Filippos Giannakos
        print red("LOGS_PATH doesn't exist or is not a directory")
186 979bf615 Filippos Giannakos
        return False
187 979bf615 Filippos Giannakos
188 979bf615 Filippos Giannakos
    try:
189 979bf615 Filippos Giannakos
        os.makedirs(str(PIDFILE_PATH))
190 979bf615 Filippos Giannakos
    except OSError as e:
191 979bf615 Filippos Giannakos
        if e.errno == errno.EEXIST:
192 979bf615 Filippos Giannakos
            if os.path.isdir(str(PIDFILE_PATH)):
193 979bf615 Filippos Giannakos
                pass
194 979bf615 Filippos Giannakos
            else:
195 979bf615 Filippos Giannakos
                print red(str(PIDFILE_PATH) + " is not a directory")
196 979bf615 Filippos Giannakos
                return False
197 979bf615 Filippos Giannakos
        else:
198 979bf615 Filippos Giannakos
            print red("Cannot create " + str(PIDFILE_PATH))
199 979bf615 Filippos Giannakos
            return False
200 979bf615 Filippos Giannakos
    except:
201 979bf615 Filippos Giannakos
        print red("PIDFILE_PATH is not set")
202 979bf615 Filippos Giannakos
        return False
203 979bf615 Filippos Giannakos
204 7bac0881 Filippos Giannakos
    splitted_spec = str(config['SPEC']).split(':')
205 979bf615 Filippos Giannakos
    if len(splitted_spec) < 5:
206 979bf615 Filippos Giannakos
        print red("Invalid spec")
207 979bf615 Filippos Giannakos
        return False
208 979bf615 Filippos Giannakos
209 1075ead7 Filippos Giannakos
    xseg_type = splitted_spec[0]
210 1075ead7 Filippos Giannakos
    xseg_name = splitted_spec[1]
211 1075ead7 Filippos Giannakos
    xseg_ports = int(splitted_spec[2])
212 1075ead7 Filippos Giannakos
    xseg_heapsize = int(splitted_spec[3])
213 1075ead7 Filippos Giannakos
    xseg_align = int(splitted_spec[4])
214 979bf615 Filippos Giannakos
215 979bf615 Filippos Giannakos
    if xseg_type != "segdev":
216 979bf615 Filippos Giannakos
        print red("Segment type not segdev")
217 979bf615 Filippos Giannakos
        return False
218 979bf615 Filippos Giannakos
    if xseg_name != "xsegbd":
219 979bf615 Filippos Giannakos
        print red("Segment name not equal xsegbd")
220 979bf615 Filippos Giannakos
        return False
221 979bf615 Filippos Giannakos
    if xseg_align != 12:
222 979bf615 Filippos Giannakos
        print red("Wrong alignemt")
223 979bf615 Filippos Giannakos
        return False
224 979bf615 Filippos Giannakos
225 7bac0881 Filippos Giannakos
    for v in [config['VERBOSITY_BLOCKERB'],
226 7bac0881 Filippos Giannakos
              config['VERBOSITY_BLOCKERM'],
227 7bac0881 Filippos Giannakos
              config['VERBOSITY_MAPPER'],
228 7bac0881 Filippos Giannakos
              config['VERBOSITY_VLMC']
229 7bac0881 Filippos Giannakos
              ]:
230 1075ead7 Filippos Giannakos
        if v is None:
231 1075ead7 Filippos Giannakos
            print red("Verbosity missing")
232 1075ead7 Filippos Giannakos
        try:
233 1075ead7 Filippos Giannakos
            if (int(v) > 3 or int(v) < 0):
234 1075ead7 Filippos Giannakos
                print red("Invalid verbosity " + str(v))
235 1075ead7 Filippos Giannakos
                return False
236 1075ead7 Filippos Giannakos
        except:
237 1075ead7 Filippos Giannakos
            print red("Invalid verbosity " + str(v))
238 1075ead7 Filippos Giannakos
            return False
239 979bf615 Filippos Giannakos
240 7bac0881 Filippos Giannakos
    for n in [config['NR_OPS_BLOCKERB'],
241 7bac0881 Filippos Giannakos
              config['NR_OPS_BLOCKERM'],
242 7bac0881 Filippos Giannakos
              config['NR_OPS_VLMC'],
243 7bac0881 Filippos Giannakos
              config['NR_OPS_MAPPER']
244 1075ead7 Filippos Giannakos
              ]:
245 1075ead7 Filippos Giannakos
        if n is None:
246 1075ead7 Filippos Giannakos
            print red("Nr ops missing")
247 1075ead7 Filippos Giannakos
        try:
248 1075ead7 Filippos Giannakos
            if (int(n) <= 0):
249 1075ead7 Filippos Giannakos
                print red("Invalid nr_ops " + str(n))
250 1075ead7 Filippos Giannakos
                return False
251 1075ead7 Filippos Giannakos
        except:
252 1075ead7 Filippos Giannakos
            print red("Invalid nr_ops " + str(n))
253 1075ead7 Filippos Giannakos
            return False
254 979bf615 Filippos Giannakos
255 7bac0881 Filippos Giannakos
    if not validPort(config['VTOOL'], xseg_ports, "VTOOL"):
256 979bf615 Filippos Giannakos
        return False
257 7bac0881 Filippos Giannakos
    if not validPort(config['MPORT'], xseg_ports, "MPORT"):
258 979bf615 Filippos Giannakos
        return False
259 7bac0881 Filippos Giannakos
    if not validPort(config['BPORT'], xseg_ports, "BPORT"):
260 979bf615 Filippos Giannakos
        return False
261 7bac0881 Filippos Giannakos
    if not validPort(config['MBPORT'], xseg_ports, "MBPORT"):
262 979bf615 Filippos Giannakos
        return False
263 7bac0881 Filippos Giannakos
    if not validPort(config['VPORT_START'], xseg_ports, "VPORT_START"):
264 979bf615 Filippos Giannakos
        return False
265 7bac0881 Filippos Giannakos
    if not validPort(config['VPORT_END'], xseg_ports, "VPORT_END"):
266 979bf615 Filippos Giannakos
        return False
267 7bac0881 Filippos Giannakos
    if not validPort(config['XSEGBD_START'], xseg_ports, "XSEGBD_START"):
268 979bf615 Filippos Giannakos
        return False
269 7bac0881 Filippos Giannakos
    if not validPort(config['XSEGBD_END'], xseg_ports, "XSEGBD_END"):
270 979bf615 Filippos Giannakos
        return False
271 979bf615 Filippos Giannakos
272 7bac0881 Filippos Giannakos
    if not config['XSEGBD_START'] < config['XSEGBD_END']:
273 979bf615 Filippos Giannakos
        print red("XSEGBD_START should be less than XSEGBD_END")
274 979bf615 Filippos Giannakos
        return False
275 7bac0881 Filippos Giannakos
    if not config['VPORT_START'] < config['VPORT_END']:
276 979bf615 Filippos Giannakos
        print red("VPORT_START should be less than VPORT_END")
277 979bf615 Filippos Giannakos
        return False
278 979bf615 Filippos Giannakos
#TODO check than no other port is set in the above ranges
279 979bf615 Filippos Giannakos
280 979bf615 Filippos Giannakos
    global BLOCKER
281 979bf615 Filippos Giannakos
    try:
282 7bac0881 Filippos Giannakos
        BLOCKER = available_storage[str(config['STORAGE'])]
283 979bf615 Filippos Giannakos
    except:
284 7bac0881 Filippos Giannakos
        print red("Invalid storage " + str(config['STORAGE']))
285 979bf615 Filippos Giannakos
        print "Available storage: \"" + ', "'.join(available_storage) + "\""
286 979bf615 Filippos Giannakos
        return False
287 979bf615 Filippos Giannakos
288 1075ead7 Filippos Giannakos
    if config['STORAGE'] == "files":
289 1075ead7 Filippos Giannakos
        if config['FILED_IMAGES'] and not \
290 1075ead7 Filippos Giannakos
                os.path.isdir(str(config['FILED_IMAGES'])):
291 1075ead7 Filippos Giannakos
            print red("FILED_IMAGES invalid")
292 1075ead7 Filippos Giannakos
            return False
293 1075ead7 Filippos Giannakos
        if config['FILED_MAPS'] and not \
294 1075ead7 Filippos Giannakos
                os.path.isdir(str(config['FILED_MAPS'])):
295 1075ead7 Filippos Giannakos
            print red("FILED_PATH invalid")
296 1075ead7 Filippos Giannakos
            return False
297 7bac0881 Filippos Giannakos
        if config['PITHOS'] and not os.path.isdir(str(config['PITHOS'])):
298 1075ead7 Filippos Giannakos
            print red("PITHOS invalid ")
299 1075ead7 Filippos Giannakos
            return False
300 1075ead7 Filippos Giannakos
        if config['PITHOSMAPS'] and not \
301 1075ead7 Filippos Giannakos
                os.path.isdir(str(config['PITHOSMAPS'])):
302 1075ead7 Filippos Giannakos
            print red("PITHOSMAPS invalid")
303 1075ead7 Filippos Giannakos
            return False
304 1075ead7 Filippos Giannakos
    elif config['STORAGE'] == "RADOS":
305 979bf615 Filippos Giannakos
        #TODO use rados.py to check for pool existance
306 979bf615 Filippos Giannakos
        pass
307 979bf615 Filippos Giannakos
308 979bf615 Filippos Giannakos
    for p in [BLOCKER, MAPPER, VLMC]:
309 979bf615 Filippos Giannakos
        if not validExec(p):
310 979bf615 Filippos Giannakos
            print red(p + "is not a valid executable")
311 979bf615 Filippos Giannakos
            return False
312 979bf615 Filippos Giannakos
313 979bf615 Filippos Giannakos
    return True
314 979bf615 Filippos Giannakos
315 1075ead7 Filippos Giannakos
316 979bf615 Filippos Giannakos
def construct_peers():
317 979bf615 Filippos Giannakos
    #these must be in sync with roles
318 979bf615 Filippos Giannakos
    executables = dict()
319 979bf615 Filippos Giannakos
    config_opts = dict()
320 979bf615 Filippos Giannakos
    executables['blockerb'] = BLOCKER
321 979bf615 Filippos Giannakos
    executables['blockerm'] = BLOCKER
322 979bf615 Filippos Giannakos
    executables['mapperd'] = MAPPER
323 979bf615 Filippos Giannakos
    executables['vlmcd'] = VLMC
324 979bf615 Filippos Giannakos
325 979bf615 Filippos Giannakos
    if BLOCKER == "pfiled":
326 979bf615 Filippos Giannakos
        config_opts['blockerb'] = [
327 1075ead7 Filippos Giannakos
            "-p", str(config['BPORT']), "-g",
328 1075ead7 Filippos Giannakos
            str(config['SPEC']).encode(), "-n",
329 1075ead7 Filippos Giannakos
            str(config['NR_OPS_BLOCKERB']),
330 1075ead7 Filippos Giannakos
            str(config['PITHOS']), str(config['FILED_IMAGES']), "-d",
331 1075ead7 Filippos Giannakos
            "-f", os.path.join(PIDFILE_PATH, "blockerb" + PID_SUFFIX)
332 1075ead7 Filippos Giannakos
        ]
333 979bf615 Filippos Giannakos
        config_opts['blockerm'] = [
334 1075ead7 Filippos Giannakos
            "-p", str(config['MBPORT']), "-g",
335 1075ead7 Filippos Giannakos
            str(config['SPEC']).encode(), "-n",
336 1075ead7 Filippos Giannakos
            str(config['NR_OPS_BLOCKERM']),
337 1075ead7 Filippos Giannakos
            str(config['PITHOSMAPS']), str(config['FILED_MAPS']), "-d",
338 1075ead7 Filippos Giannakos
            "-f", os.path.join(PIDFILE_PATH, "blockerm" + PID_SUFFIX)
339 1075ead7 Filippos Giannakos
        ]
340 6b11e79a Filippos Giannakos
    elif BLOCKER == "archip-sosd":
341 979bf615 Filippos Giannakos
        config_opts['blockerb'] = [
342 1075ead7 Filippos Giannakos
            "-p", str(config['BPORT']), "-g",
343 1075ead7 Filippos Giannakos
            str(config['SPEC']).encode(), "-n",
344 1075ead7 Filippos Giannakos
            str(config['NR_OPS_BLOCKERB']),
345 1075ead7 Filippos Giannakos
            "--pool", str(config['RADOS_POOL_BLOCKS']), "-v",
346 1075ead7 Filippos Giannakos
            str(config['VERBOSITY_BLOCKERB']),
347 1075ead7 Filippos Giannakos
            "-d",
348 1075ead7 Filippos Giannakos
            "--pidfile", os.path.join(PIDFILE_PATH, "blockerb" + PID_SUFFIX),
349 1075ead7 Filippos Giannakos
            "-l", os.path.join(str(LOGS_PATH), "blockerb" + LOG_SUFFIX),
350 1075ead7 Filippos Giannakos
            "-t", "3"
351 1075ead7 Filippos Giannakos
        ]
352 979bf615 Filippos Giannakos
        config_opts['blockerm'] = [
353 1075ead7 Filippos Giannakos
            "-p", str(config['MBPORT']), "-g",
354 1075ead7 Filippos Giannakos
            str(config['SPEC']).encode(), "-n",
355 1075ead7 Filippos Giannakos
            str(config['NR_OPS_BLOCKERM']),
356 1075ead7 Filippos Giannakos
            "--pool", str(config['RADOS_POOL_MAPS']), "-v",
357 1075ead7 Filippos Giannakos
            str(config['VERBOSITY_BLOCKERM']),
358 1075ead7 Filippos Giannakos
            "-d",
359 1075ead7 Filippos Giannakos
            "--pidfile", os.path.join(PIDFILE_PATH, "blockerm" + PID_SUFFIX),
360 1075ead7 Filippos Giannakos
            "-l", os.path.join(str(LOGS_PATH), "blockerm" + LOG_SUFFIX),
361 1075ead7 Filippos Giannakos
            "-t", "3"
362 1075ead7 Filippos Giannakos
        ]
363 6b11e79a Filippos Giannakos
    elif BLOCKER == "archip-pfiled":
364 979bf615 Filippos Giannakos
        config_opts['blockerb'] = [
365 1075ead7 Filippos Giannakos
            "-p", str(config['BPORT']), "-g",
366 1075ead7 Filippos Giannakos
            str(config['SPEC']).encode(), "-n",
367 1075ead7 Filippos Giannakos
            str(config['NR_OPS_BLOCKERB']),
368 1075ead7 Filippos Giannakos
            "--pithos", str(config['PITHOS']), "--archip",
369 1075ead7 Filippos Giannakos
            str(config['FILED_IMAGES']),
370 1075ead7 Filippos Giannakos
            "-v", str(config['VERBOSITY_BLOCKERB']),
371 1075ead7 Filippos Giannakos
            "-d",
372 1075ead7 Filippos Giannakos
            "--pidfile", os.path.join(PIDFILE_PATH, "blockerb" + PID_SUFFIX),
373 1075ead7 Filippos Giannakos
            "-l", os.path.join(str(LOGS_PATH), "blockerb" + LOG_SUFFIX),
374 1075ead7 Filippos Giannakos
            "-t", str(config['NR_OPS_BLOCKERB']), "--prefix", ARCHIP_PREFIX
375 1075ead7 Filippos Giannakos
        ]
376 979bf615 Filippos Giannakos
        config_opts['blockerm'] = [
377 1075ead7 Filippos Giannakos
            "-p", str(config['MBPORT']), "-g",
378 1075ead7 Filippos Giannakos
            str(config['SPEC']).encode(), "-n",
379 1075ead7 Filippos Giannakos
            str(config['NR_OPS_BLOCKERM']),
380 1075ead7 Filippos Giannakos
            "--pithos", str(config['PITHOSMAPS']), "--archip",
381 1075ead7 Filippos Giannakos
            str(config['FILED_MAPS']),
382 1075ead7 Filippos Giannakos
            "-v", str(config['VERBOSITY_BLOCKERM']),
383 1075ead7 Filippos Giannakos
            "-d",
384 1075ead7 Filippos Giannakos
            "--pidfile", os.path.join(PIDFILE_PATH, "blockerm" + PID_SUFFIX),
385 1075ead7 Filippos Giannakos
            "-l", os.path.join(str(LOGS_PATH), "blockerm" + LOG_SUFFIX),
386 1075ead7 Filippos Giannakos
            "-t", str(config['NR_OPS_BLOCKERM']), "--prefix", ARCHIP_PREFIX
387 1075ead7 Filippos Giannakos
        ]
388 979bf615 Filippos Giannakos
    else:
389 979bf615 Filippos Giannakos
            sys.exit(-1)
390 979bf615 Filippos Giannakos
391 979bf615 Filippos Giannakos
    config_opts['mapperd'] = [
392 1075ead7 Filippos Giannakos
        "-t", "1", "-p",  str(config['MPORT']), "-mbp",
393 1075ead7 Filippos Giannakos
        str(config['MBPORT']),
394 1075ead7 Filippos Giannakos
        "-g", str(config['SPEC']).encode(), "-n",
395 1075ead7 Filippos Giannakos
        str(config['NR_OPS_MAPPER']), "-bp", str(config['BPORT']),
396 1075ead7 Filippos Giannakos
        "--pidfile", os.path.join(PIDFILE_PATH, "mapperd" + PID_SUFFIX),
397 1075ead7 Filippos Giannakos
        "-v", str(config['VERBOSITY_MAPPER']), "-d",
398 1075ead7 Filippos Giannakos
        "-l", os.path.join(str(LOGS_PATH), "mapperd" + LOG_SUFFIX)
399 1075ead7 Filippos Giannakos
    ]
400 979bf615 Filippos Giannakos
    config_opts['vlmcd'] = [
401 1075ead7 Filippos Giannakos
        "-t", "1", "-sp",  str(config['VPORT_START']), "-ep",
402 1075ead7 Filippos Giannakos
        str(config['VPORT_END']),
403 1075ead7 Filippos Giannakos
        "-g", str(config['SPEC']).encode(), "-n",
404 1075ead7 Filippos Giannakos
        str(config['NR_OPS_VLMC']), "-bp", str(config['BPORT']),
405 1075ead7 Filippos Giannakos
        "-mp", str(config['MPORT']), "-d", "-v",
406 1075ead7 Filippos Giannakos
        str(config['VERBOSITY_VLMC']),
407 1075ead7 Filippos Giannakos
        "--pidfile", os.path.join(PIDFILE_PATH, "vlmcd" + PID_SUFFIX),
408 1075ead7 Filippos Giannakos
        "-l", os.path.join(str(LOGS_PATH), "vlmcd" + LOG_SUFFIX)
409 1075ead7 Filippos Giannakos
    ]
410 979bf615 Filippos Giannakos
411 979bf615 Filippos Giannakos
    for r in roles:
412 1075ead7 Filippos Giannakos
        peers[r] = Peer(executable=executables[r], opts=config_opts[r],
413 1075ead7 Filippos Giannakos
                        role=r)
414 979bf615 Filippos Giannakos
415 979bf615 Filippos Giannakos
    return peers
416 979bf615 Filippos Giannakos
417 979bf615 Filippos Giannakos
418 979bf615 Filippos Giannakos
def exclusive(fn):
419 d05e921b Filippos Giannakos
    def exclusive_args(**kwargs):
420 979bf615 Filippos Giannakos
        if not os.path.exists(LOCK_PATH):
421 979bf615 Filippos Giannakos
            try:
422 979bf615 Filippos Giannakos
                os.mkdir(LOCK_PATH)
423 979bf615 Filippos Giannakos
            except OSError, (err, reason):
424 979bf615 Filippos Giannakos
                print >> sys.stderr, reason
425 979bf615 Filippos Giannakos
        if not os.path.isdir(LOCK_PATH):
426 979bf615 Filippos Giannakos
            sys.stderr.write("Locking error: ")
427 979bf615 Filippos Giannakos
            print >> sys.stderr, LOCK_PATH + " is not a directory"
428 1075ead7 Filippos Giannakos
            return -1
429 979bf615 Filippos Giannakos
        lock_file = os.path.join(LOCK_PATH, VLMC_LOCK_FILE)
430 979bf615 Filippos Giannakos
        while True:
431 979bf615 Filippos Giannakos
            try:
432 1075ead7 Filippos Giannakos
                fd = os.open(lock_file, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
433 1075ead7 Filippos Giannakos
                break
434 979bf615 Filippos Giannakos
            except OSError, (err, reason):
435 979bf615 Filippos Giannakos
                print >> sys.stderr, reason
436 979bf615 Filippos Giannakos
                if err == errno.EEXIST:
437 979bf615 Filippos Giannakos
                    time.sleep(0.2)
438 979bf615 Filippos Giannakos
                else:
439 979bf615 Filippos Giannakos
                    raise OSError(err, lock_file + ' ' + reason)
440 979bf615 Filippos Giannakos
        try:
441 d05e921b Filippos Giannakos
            r = fn(**kwargs)
442 979bf615 Filippos Giannakos
        finally:
443 979bf615 Filippos Giannakos
            os.close(fd)
444 979bf615 Filippos Giannakos
            os.unlink(lock_file)
445 979bf615 Filippos Giannakos
        return r
446 979bf615 Filippos Giannakos
447 979bf615 Filippos Giannakos
    return exclusive_args
448 979bf615 Filippos Giannakos
449 1075ead7 Filippos Giannakos
450 979bf615 Filippos Giannakos
def loadrc(rc):
451 979bf615 Filippos Giannakos
    try:
452 1075ead7 Filippos Giannakos
        if rc is None:
453 7bac0881 Filippos Giannakos
            execfile(os.path.expanduser(DEFAULTS), config)
454 979bf615 Filippos Giannakos
        else:
455 7bac0881 Filippos Giannakos
            execfile(rc, config)
456 979bf615 Filippos Giannakos
    except:
457 979bf615 Filippos Giannakos
        raise Error("Cannot read config file")
458 979bf615 Filippos Giannakos
459 979bf615 Filippos Giannakos
    if not check_conf():
460 979bf615 Filippos Giannakos
        raise Error("Invalid conf file")
461 979bf615 Filippos Giannakos
462 1075ead7 Filippos Giannakos
463 979bf615 Filippos Giannakos
def loaded_modules():
464 979bf615 Filippos Giannakos
    lines = open("/proc/modules").read().split("\n")
465 979bf615 Filippos Giannakos
    modules = [f.split(" ")[0] for f in lines]
466 979bf615 Filippos Giannakos
    return modules
467 979bf615 Filippos Giannakos
468 1075ead7 Filippos Giannakos
469 979bf615 Filippos Giannakos
def loaded_module(name):
470 979bf615 Filippos Giannakos
    return name in loaded_modules()
471 979bf615 Filippos Giannakos
472 1075ead7 Filippos Giannakos
473 979bf615 Filippos Giannakos
def load_module(name, args):
474 979bf615 Filippos Giannakos
    s = "Loading %s " % name
475 979bf615 Filippos Giannakos
    sys.stdout.write(s.ljust(FIRST_COLUMN_WIDTH))
476 979bf615 Filippos Giannakos
    modules = loaded_modules()
477 979bf615 Filippos Giannakos
    if name in modules:
478 979bf615 Filippos Giannakos
        sys.stdout.write(yellow("Already loaded".ljust(SECOND_COLUMN_WIDTH)))
479 979bf615 Filippos Giannakos
        sys.stdout.write("\n")
480 979bf615 Filippos Giannakos
        return
481 979bf615 Filippos Giannakos
    cmd = ["modprobe", "%s" % name]
482 979bf615 Filippos Giannakos
    if args:
483 979bf615 Filippos Giannakos
        for arg in args:
484 979bf615 Filippos Giannakos
            cmd.extend(["%s=%s" % (arg)])
485 979bf615 Filippos Giannakos
    try:
486 1075ead7 Filippos Giannakos
        check_call(cmd, shell=False)
487 979bf615 Filippos Giannakos
    except Exception:
488 979bf615 Filippos Giannakos
        sys.stdout.write(red("FAILED".ljust(SECOND_COLUMN_WIDTH)))
489 979bf615 Filippos Giannakos
        sys.stdout.write("\n")
490 1075ead7 Filippos Giannakos
        raise Error("Cannot load module %s. Check system logs" % name)
491 979bf615 Filippos Giannakos
    sys.stdout.write(green("OK".ljust(SECOND_COLUMN_WIDTH)))
492 979bf615 Filippos Giannakos
    sys.stdout.write("\n")
493 979bf615 Filippos Giannakos
494 1075ead7 Filippos Giannakos
495 979bf615 Filippos Giannakos
def unload_module(name):
496 979bf615 Filippos Giannakos
    s = "Unloading %s " % name
497 979bf615 Filippos Giannakos
    sys.stdout.write(s.ljust(FIRST_COLUMN_WIDTH))
498 979bf615 Filippos Giannakos
    modules = loaded_modules()
499 979bf615 Filippos Giannakos
    if name not in modules:
500 979bf615 Filippos Giannakos
        sys.stdout.write(yellow("Not loaded".ljust(SECOND_COLUMN_WIDTH)))
501 979bf615 Filippos Giannakos
        sys.stdout.write("\n")
502 979bf615 Filippos Giannakos
        return
503 979bf615 Filippos Giannakos
    cmd = ["modprobe -r %s" % name]
504 979bf615 Filippos Giannakos
    try:
505 1075ead7 Filippos Giannakos
        check_call(cmd, shell=True)
506 979bf615 Filippos Giannakos
    except Exception:
507 979bf615 Filippos Giannakos
        sys.stdout.write(red("FAILED".ljust(SECOND_COLUMN_WIDTH)))
508 979bf615 Filippos Giannakos
        sys.stdout.write("\n")
509 1075ead7 Filippos Giannakos
        raise Error("Cannot unload module %s. Check system logs" % name)
510 979bf615 Filippos Giannakos
    sys.stdout.write(green("OK".ljust(SECOND_COLUMN_WIDTH)))
511 979bf615 Filippos Giannakos
    sys.stdout.write("\n")
512 979bf615 Filippos Giannakos
513 979bf615 Filippos Giannakos
xseg_initialized = False
514 979bf615 Filippos Giannakos
515 1075ead7 Filippos Giannakos
516 979bf615 Filippos Giannakos
def initialize_xseg():
517 979bf615 Filippos Giannakos
    global xseg_initialized
518 b45a87cb Filippos Giannakos
    if not xseg_initialized:
519 b45a87cb Filippos Giannakos
        xseg_initialize()
520 b45a87cb Filippos Giannakos
        xseg_initialized = True
521 979bf615 Filippos Giannakos
522 1075ead7 Filippos Giannakos
523 979bf615 Filippos Giannakos
def create_segment():
524 979bf615 Filippos Giannakos
    #fixme blocking....
525 979bf615 Filippos Giannakos
    initialize_xseg()
526 979bf615 Filippos Giannakos
    xconf = xseg_config()
527 7bac0881 Filippos Giannakos
    xseg_parse_spec(str(config['SPEC']), xconf)
528 979bf615 Filippos Giannakos
    r = xseg_create(xconf)
529 979bf615 Filippos Giannakos
    if r < 0:
530 979bf615 Filippos Giannakos
        raise Error("Cannot create segment")
531 979bf615 Filippos Giannakos
532 1075ead7 Filippos Giannakos
533 979bf615 Filippos Giannakos
def destroy_segment():
534 979bf615 Filippos Giannakos
    #fixme blocking....
535 979bf615 Filippos Giannakos
    try:
536 979bf615 Filippos Giannakos
        initialize_xseg()
537 979bf615 Filippos Giannakos
        xconf = xseg_config()
538 7bac0881 Filippos Giannakos
        xseg_parse_spec(str(config['SPEC']), xconf)
539 1075ead7 Filippos Giannakos
        xseg = xseg_join(xconf.type, xconf.name, "posix",
540 1075ead7 Filippos Giannakos
                         cast(0, cb_null_ptrtype))
541 979bf615 Filippos Giannakos
        if not xseg:
542 979bf615 Filippos Giannakos
            raise Error("Cannot join segment")
543 979bf615 Filippos Giannakos
        xseg_leave(xseg)
544 979bf615 Filippos Giannakos
        xseg_destroy(xseg)
545 1075ead7 Filippos Giannakos
    except Exception:
546 979bf615 Filippos Giannakos
        raise Error("Cannot destroy segment")
547 979bf615 Filippos Giannakos
548 1075ead7 Filippos Giannakos
549 1075ead7 Filippos Giannakos
def check_running(name, pid=None):
550 979bf615 Filippos Giannakos
    for p in psutil.process_iter():
551 b62308c0 Filippos Giannakos
        if p.name[0:len(name)] == name:
552 979bf615 Filippos Giannakos
            if pid:
553 979bf615 Filippos Giannakos
                if pid == p.pid:
554 979bf615 Filippos Giannakos
                    return pid
555 979bf615 Filippos Giannakos
            else:
556 979bf615 Filippos Giannakos
                return pid
557 979bf615 Filippos Giannakos
    return None
558 979bf615 Filippos Giannakos
559 1075ead7 Filippos Giannakos
560 979bf615 Filippos Giannakos
def check_pidfile(name):
561 979bf615 Filippos Giannakos
    pidfile = os.path.join(PIDFILE_PATH, name + PID_SUFFIX)
562 979bf615 Filippos Giannakos
    pf = None
563 979bf615 Filippos Giannakos
    try:
564 979bf615 Filippos Giannakos
        pf = open(pidfile, "r")
565 979bf615 Filippos Giannakos
        pid = int(pf.read())
566 979bf615 Filippos Giannakos
        pf.close()
567 979bf615 Filippos Giannakos
    except:
568 979bf615 Filippos Giannakos
        if pf:
569 979bf615 Filippos Giannakos
            pf.close()
570 1075ead7 Filippos Giannakos
        return -1
571 979bf615 Filippos Giannakos
572 979bf615 Filippos Giannakos
    return pid
573 979bf615 Filippos Giannakos
574 979bf615 Filippos Giannakos
575 979bf615 Filippos Giannakos
class Xseg_ctx(object):
576 979bf615 Filippos Giannakos
    ctx = None
577 979bf615 Filippos Giannakos
    port = None
578 979bf615 Filippos Giannakos
    portno = None
579 979bf615 Filippos Giannakos
580 979bf615 Filippos Giannakos
    def __init__(self, spec, portno):
581 979bf615 Filippos Giannakos
        initialize_xseg()
582 979bf615 Filippos Giannakos
        xconf = xseg_config()
583 b45a87cb Filippos Giannakos
        xseg_parse_spec(create_string_buffer(spec), xconf)
584 1075ead7 Filippos Giannakos
        ctx = xseg_join(xconf.type, xconf.name, "posix",
585 1075ead7 Filippos Giannakos
                        cast(0, cb_null_ptrtype))
586 979bf615 Filippos Giannakos
        if not ctx:
587 979bf615 Filippos Giannakos
            raise Error("Cannot join segment")
588 979bf615 Filippos Giannakos
        port = xseg_bind_port(ctx, portno, c_void_p(0))
589 979bf615 Filippos Giannakos
        if not port:
590 979bf615 Filippos Giannakos
            raise Error("Cannot bind to port")
591 979bf615 Filippos Giannakos
        xseg_init_local_signal(ctx, portno)
592 979bf615 Filippos Giannakos
        self.ctx = ctx
593 979bf615 Filippos Giannakos
        self.port = port
594 979bf615 Filippos Giannakos
        self.portno = portno
595 979bf615 Filippos Giannakos
596 979bf615 Filippos Giannakos
    def __del__(self):
597 979bf615 Filippos Giannakos
        return
598 979bf615 Filippos Giannakos
599 979bf615 Filippos Giannakos
    def __enter__(self):
600 979bf615 Filippos Giannakos
        if not self.ctx:
601 979bf615 Filippos Giannakos
            raise Error("No segment")
602 979bf615 Filippos Giannakos
        return self
603 979bf615 Filippos Giannakos
604 979bf615 Filippos Giannakos
    def __exit__(self, type_, value, traceback):
605 979bf615 Filippos Giannakos
        self.shutdown()
606 979bf615 Filippos Giannakos
        return False
607 979bf615 Filippos Giannakos
608 979bf615 Filippos Giannakos
    def shutdown(self):
609 979bf615 Filippos Giannakos
        if self.ctx:
610 979bf615 Filippos Giannakos
            xseg_quit_local_signal(self.ctx, self.portno)
611 979bf615 Filippos Giannakos
            xseg_leave(self.ctx)
612 979bf615 Filippos Giannakos
        self.ctx = None
613 979bf615 Filippos Giannakos
614 1075ead7 Filippos Giannakos
615 979bf615 Filippos Giannakos
class Request(object):
616 979bf615 Filippos Giannakos
    xseg_ctx = None
617 979bf615 Filippos Giannakos
    req = None
618 979bf615 Filippos Giannakos
619 979bf615 Filippos Giannakos
    def __init__(self, xseg_ctx, dst_portno, targetlen, datalen):
620 979bf615 Filippos Giannakos
        ctx = xseg_ctx.ctx
621 979bf615 Filippos Giannakos
        if not ctx:
622 979bf615 Filippos Giannakos
            raise Error("No context")
623 979bf615 Filippos Giannakos
        req = xseg_get_request(ctx, xseg_ctx.portno, dst_portno, X_ALLOC)
624 979bf615 Filippos Giannakos
        if not req:
625 979bf615 Filippos Giannakos
            raise Error("Cannot get request")
626 979bf615 Filippos Giannakos
        r = xseg_prep_request(ctx, req, targetlen, datalen)
627 979bf615 Filippos Giannakos
        if r < 0:
628 979bf615 Filippos Giannakos
            xseg_put_request(ctx, req, xseg_ctx.portno)
629 979bf615 Filippos Giannakos
            raise Error("Cannot prepare request")
630 979bf615 Filippos Giannakos
#        print hex(addressof(req.contents))
631 979bf615 Filippos Giannakos
        self.req = req
632 979bf615 Filippos Giannakos
        self.xseg_ctx = xseg_ctx
633 979bf615 Filippos Giannakos
        return
634 979bf615 Filippos Giannakos
635 979bf615 Filippos Giannakos
    def __del__(self):
636 979bf615 Filippos Giannakos
        if self.req:
637 979bf615 Filippos Giannakos
            if xq_count(byref(self.req.contents.path)) == 0:
638 1075ead7 Filippos Giannakos
                xseg_put_request(self.xseg_ctx.ctx, self.req,
639 1075ead7 Filippos Giannakos
                                 self.xseg_ctx.portno)
640 979bf615 Filippos Giannakos
        self.req = None
641 979bf615 Filippos Giannakos
        return False
642 979bf615 Filippos Giannakos
643 979bf615 Filippos Giannakos
    def __enter__(self):
644 979bf615 Filippos Giannakos
        if not self.req:
645 979bf615 Filippos Giannakos
            raise Error("xseg request not set")
646 979bf615 Filippos Giannakos
        return self
647 979bf615 Filippos Giannakos
648 979bf615 Filippos Giannakos
    def __exit__(self, type_, value, traceback):
649 979bf615 Filippos Giannakos
        if self.req:
650 979bf615 Filippos Giannakos
            if xq_count(byref(self.req.contents.path)) == 0:
651 1075ead7 Filippos Giannakos
                xseg_put_request(self.xseg_ctx.ctx, self.req,
652 1075ead7 Filippos Giannakos
                                 self.xseg_ctx.portno)
653 979bf615 Filippos Giannakos
        self.req = None
654 979bf615 Filippos Giannakos
        return False
655 979bf615 Filippos Giannakos
656 979bf615 Filippos Giannakos
    def set_op(self, op):
657 979bf615 Filippos Giannakos
        self.req.contents.op = op
658 979bf615 Filippos Giannakos
659 979bf615 Filippos Giannakos
    def get_op(self):
660 979bf615 Filippos Giannakos
        return self.req.contents.op
661 979bf615 Filippos Giannakos
662 979bf615 Filippos Giannakos
    def set_offset(self, offset):
663 979bf615 Filippos Giannakos
        self.req.contents.offset = offset
664 979bf615 Filippos Giannakos
665 979bf615 Filippos Giannakos
    def get_offset(self):
666 979bf615 Filippos Giannakos
        return self.req.contents.offset
667 979bf615 Filippos Giannakos
668 979bf615 Filippos Giannakos
    def get_size(self):
669 979bf615 Filippos Giannakos
        return self.req.contents.size
670 979bf615 Filippos Giannakos
671 979bf615 Filippos Giannakos
    def set_size(self, size):
672 979bf615 Filippos Giannakos
        self.req.contents.size = size
673 979bf615 Filippos Giannakos
674 979bf615 Filippos Giannakos
    def set_flags(self, flags):
675 979bf615 Filippos Giannakos
        self.req.contents.flags = flags
676 979bf615 Filippos Giannakos
677 979bf615 Filippos Giannakos
    def get_flags(self):
678 979bf615 Filippos Giannakos
        return self.req.contents.flags
679 979bf615 Filippos Giannakos
680 979bf615 Filippos Giannakos
    def set_target(self, target):
681 979bf615 Filippos Giannakos
        """Sets the target of the request, respecting request's targetlen"""
682 979bf615 Filippos Giannakos
        if len(target) != self.req.contents.targetlen:
683 979bf615 Filippos Giannakos
            return False
684 979bf615 Filippos Giannakos
        c_target = xseg_get_target_nonstatic(self.xseg_ctx.ctx, self.req)
685 979bf615 Filippos Giannakos
        p_target = create_string_buffer(target)
686 979bf615 Filippos Giannakos
#        print hex(addressof(c_target.contents))
687 979bf615 Filippos Giannakos
        memmove(c_target, p_target, len(target))
688 979bf615 Filippos Giannakos
        return True
689 979bf615 Filippos Giannakos
690 979bf615 Filippos Giannakos
    def get_target(self):
691 979bf615 Filippos Giannakos
        """Return a string to the target of the request"""
692 979bf615 Filippos Giannakos
        c_target = xseg_get_target_nonstatic(self.xseg_ctx.ctx, self.req)
693 979bf615 Filippos Giannakos
#        print "target_addr " + str(addressof(c_target.contents))
694 979bf615 Filippos Giannakos
        return string_at(c_target, self.req.contents.targetlen)
695 979bf615 Filippos Giannakos
696 979bf615 Filippos Giannakos
    def set_data(self, data):
697 1075ead7 Filippos Giannakos
        """Sets requests data. Data should be a xseg protocol structure"""
698 979bf615 Filippos Giannakos
        if sizeof(data) != self.req.contents.datalen:
699 979bf615 Filippos Giannakos
            return False
700 979bf615 Filippos Giannakos
        c_data = xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req)
701 979bf615 Filippos Giannakos
        p_data = pointer(data)
702 979bf615 Filippos Giannakos
        memmove(c_data, p_data, self.req.contents.datalen)
703 979bf615 Filippos Giannakos
704 979bf615 Filippos Giannakos
        return True
705 979bf615 Filippos Giannakos
706 979bf615 Filippos Giannakos
    def get_data(self, _type):
707 979bf615 Filippos Giannakos
        """return a pointer to the data buffer of the request, casted to the
708 979bf615 Filippos Giannakos
        selected type"""
709 1075ead7 Filippos Giannakos
#        print "data addr " + str(addressof(xseg_get_data_nonstatic(\
710 1075ead7 Filippos Giannakos
#            self.xseg_ctx.ctx, self.req).contents))
711 1075ead7 Filippos Giannakos
#        ret = cast(xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req),
712 1075ead7 Filippos Giannakos
#                   _type)
713 979bf615 Filippos Giannakos
#        print addressof(ret.contents)
714 979bf615 Filippos Giannakos
#        return ret
715 979bf615 Filippos Giannakos
        if _type:
716 1075ead7 Filippos Giannakos
            return cast(xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req),
717 1075ead7 Filippos Giannakos
                        POINTER(_type))
718 979bf615 Filippos Giannakos
        else:
719 1075ead7 Filippos Giannakos
            return cast(xseg_get_data_nonstatic(self.xseg_ctx.ctx, self.req),
720 1075ead7 Filippos Giannakos
                        c_void_p)
721 979bf615 Filippos Giannakos
722 979bf615 Filippos Giannakos
    def submit(self):
723 979bf615 Filippos Giannakos
        """Submit the associated xseg_request"""
724 1075ead7 Filippos Giannakos
        p = xseg_submit(self.xseg_ctx.ctx, self.req, self.xseg_ctx.portno,
725 1075ead7 Filippos Giannakos
                        X_ALLOC)
726 979bf615 Filippos Giannakos
        if p == NoPort:
727 979bf615 Filippos Giannakos
            raise Exception
728 979bf615 Filippos Giannakos
        xseg_signal(self.xseg_ctx.ctx, p)
729 979bf615 Filippos Giannakos
730 979bf615 Filippos Giannakos
    def wait(self):
731 979bf615 Filippos Giannakos
        """Wait until the associated xseg_request is responded, discarding any
732 979bf615 Filippos Giannakos
        other requests that may be received in the meantime"""
733 979bf615 Filippos Giannakos
        while True:
734 979bf615 Filippos Giannakos
            received = xseg_receive(self.xseg_ctx.ctx, self.xseg_ctx.portno, 0)
735 979bf615 Filippos Giannakos
            if received:
736 979bf615 Filippos Giannakos
#                print addressof(cast(self.req, c_void_p))
737 979bf615 Filippos Giannakos
#                print addressof(cast(received, c_void_p))
738 979bf615 Filippos Giannakos
#                print addressof(self.req.contents)
739 979bf615 Filippos Giannakos
#                print addressof(received.contents)
740 1075ead7 Filippos Giannakos
                if addressof(received.contents) == \
741 1075ead7 Filippos Giannakos
                        addressof(self.req.contents):
742 1075ead7 Filippos Giannakos
#                if addressof(cast(received, c_void_p)) == \
743 1075ead7 Filippos Giannakos
#                        addressof(cast(self.req, c_void_p)):
744 979bf615 Filippos Giannakos
                    break
745 979bf615 Filippos Giannakos
                else:
746 1075ead7 Filippos Giannakos
                    p = xseg_respond(self.xseg_ctx.ctx, received,
747 1075ead7 Filippos Giannakos
                                     self.xseg_ctx.portno, X_ALLOC)
748 979bf615 Filippos Giannakos
                    if p == NoPort:
749 979bf615 Filippos Giannakos
                        xseg_put_request(self.xseg_ctx.ctx, received,
750 1075ead7 Filippos Giannakos
                                         self.xseg_ctx.portno)
751 979bf615 Filippos Giannakos
                    else:
752 979bf615 Filippos Giannakos
                        xseg_signal(self.xseg_ctx.ctx, p)
753 979bf615 Filippos Giannakos
            else:
754 979bf615 Filippos Giannakos
                xseg_prepare_wait(self.xseg_ctx.ctx, self.xseg_ctx.portno)
755 979bf615 Filippos Giannakos
                xseg_wait_signal(self.xseg_ctx.ctx, 10000000)
756 979bf615 Filippos Giannakos
                xseg_cancel_wait(self.xseg_ctx.ctx, self.xseg_ctx.portno)
757 979bf615 Filippos Giannakos
        return True
758 979bf615 Filippos Giannakos
759 979bf615 Filippos Giannakos
    def success(self):
760 979bf615 Filippos Giannakos
        return bool((self.req.contents.state & XS_SERVED) and not
761 1075ead7 Filippos Giannakos
                   (self.req.contents.state & XS_FAILED))