本文整理汇总了Python中syncdutils.select函数的典型用法代码示例。如果您正苦于以下问题:Python select函数的具体用法?Python select怎么用?Python select使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了select函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: startup
def startup(**kw):
"""set up logging, pidfile grabbing, daemonization"""
if getattr(gconf, 'pid_file', None) and kw.get('go_daemon') != 'postconn':
if not grabpidfile():
sys.stderr.write("pidfile is taken, exiting.\n")
sys.exit(2)
gconf.pid_file_owned = True
if kw.get('go_daemon') == 'should':
x, y = os.pipe()
gconf.cpid = os.fork()
if gconf.cpid:
os.close(x)
sys.exit()
os.close(y)
os.setsid()
dn = os.open(os.devnull, os.O_RDWR)
for f in (sys.stdin, sys.stdout, sys.stderr):
os.dup2(dn, f.fileno())
if getattr(gconf, 'pid_file', None):
if not grabpidfile(gconf.pid_file + '.tmp'):
raise GsyncdError("cannot grab temporary pidfile")
os.rename(gconf.pid_file + '.tmp', gconf.pid_file)
# wait for parent to terminate
# so we can start up with
# no messing from the dirty
# ol' bustard
select((x,), (), ())
os.close(x)
GLogger._gsyncd_loginit(**kw)
示例2: listen
def listen(self):
while True:
select((self.inf,), (), ())
rid, exc, res = recv(self.inf)
rjob = self.jtab.pop(rid)
if rjob.cbk:
rjob.cbk(rjob, [exc, res])
示例3: service_loop
def service_loop(self):
"""start a RePCe server serving self's server
stop servicing if a timeout is configured and got no
keep-alime in that inteval
"""
if boolify(gconf.use_rsync_xattrs) and not privileged():
raise GsyncdError(
"using rsync for extended attributes is not supported")
repce = RepceServer(
self.server, sys.stdin, sys.stdout, int(gconf.sync_jobs))
t = syncdutils.Thread(target=lambda: (repce.service_loop(),
syncdutils.finalize()))
t.start()
logging.info("slave listening")
if gconf.timeout and int(gconf.timeout) > 0:
while True:
lp = self.server.last_keep_alive
time.sleep(int(gconf.timeout))
if lp == self.server.last_keep_alive:
logging.info(
"connection inactive for %d seconds, stopping" %
int(gconf.timeout))
break
else:
select((), (), ())
示例4: startup
def startup(go_daemon=True):
"""set up logging, pidfile grabbing, daemonization"""
pid_file = gconf.get("pid-file")
if not grabpidfile():
sys.stderr.write("pidfile is taken, exiting.\n")
sys.exit(2)
rconf.pid_file_owned = True
if not go_daemon:
return
x, y = pipe()
cpid = os.fork()
if cpid:
os.close(x)
sys.exit()
os.close(y)
os.setsid()
dn = os.open(os.devnull, os.O_RDWR)
for f in (sys.stdin, sys.stdout, sys.stderr):
os.dup2(dn, f.fileno())
if not grabpidfile(pid_file + '.tmp'):
raise GsyncdError("cannot grab temporary pidfile")
os.rename(pid_file + '.tmp', pid_file)
# wait for parent to terminate
# so we can start up with
# no messing from the dirty
# ol' bustard
select((x,), (), ())
os.close(x)
示例5: checkpt_service
def checkpt_service(self, chan, chkpt, tgt):
"""checkpoint service loop
monitor and verify checkpoint status for @chkpt, and listen
for incoming requests for whom we serve a pretty-formatted
status report"""
if not chkpt:
# dummy loop for the case when there is no checkpt set
while True:
select([chan], [], [])
conn, _ = chan.accept()
conn.send(self.get_extra_info())
conn.close()
completed = self._checkpt_param(chkpt, 'completed', xtimish=False)
if completed:
completed = tuple(int(x) for x in completed.split('.'))
while True:
s,_,_ = select([chan], [], [], (not completed) and 5 or None)
# either request made and we re-check to not
# give back stale data, or we still hunting for completion
if self.native_xtime(tgt) and self.native_xtime(tgt) < self.volmark:
# indexing has been reset since setting the checkpoint
status = "is invalid"
else:
xtr = self.xtime('.', self.slave)
if isinstance(xtr, int):
raise GsyncdError("slave root directory is unaccessible (%s)",
os.strerror(xtr))
ncompleted = self.xtime_geq(xtr, tgt)
if completed and not ncompleted: # stale data
logging.warn("completion time %s for checkpoint %s became stale" % \
(self.humantime(*completed), chkpt))
completed = None
gconf.confdata.delete('checkpoint-completed')
if ncompleted and not completed: # just reaching completion
completed = "%.6f" % time.time()
self._set_checkpt_param(chkpt, 'completed', completed, xtimish=False)
completed = tuple(int(x) for x in completed.split('.'))
logging.info("checkpoint %s completed" % chkpt)
status = completed and \
"completed at " + self.humantime(completed[0]) or \
"not reached yet"
if s:
conn = None
try:
conn, _ = chan.accept()
try:
conn.send(" | checkpoint %s %s %s" % (chkpt, status,self.get_extra_info()))
except:
exc = sys.exc_info()[1]
if (isinstance(exc, OSError) or isinstance(exc, IOError)) and \
exc.errno == EPIPE:
logging.debug('checkpoint client disconnected')
else:
raise
finally:
if conn:
conn.close()
示例6: __init__
def __init__(self, obj, fd_tup):
(inf, ouf, rw, ww) = fd_tup.split(',')
repce = RepceServer(obj, int(inf), int(ouf), 1)
t = syncdutils.Thread(target=lambda: (repce.service_loop(),
syncdutils.finalize()))
t.start()
logging.info('Agent listining...')
select((), (), ())
示例7: connect_remote
def connect_remote(self, go_daemon=None):
"""connect to inner slave url through outer ssh url
Wrap the connecting utility in ssh.
Much care is put into daemonizing: in that case
ssh is started before daemonization, but
RePCe client is to be created after that (as ssh
interactive password auth would be defeated by
a daemonized ssh, while client should be present
only in the final process). In that case the action
is taken apart to two parts, this method is ivoked
once pre-daemon, once post-daemon. Use @go_daemon
to deiced what part to perform.
[NB. ATM gluster product does not makes use of interactive
authentication.]
"""
if go_daemon == "done":
return self.start_fd_client(*self.fd_pair)
syncdutils.setup_ssh_ctl(tempfile.mkdtemp(prefix="gsyncd-aux-ssh-"), self.remote_addr, self.inner_rsc.url)
deferred = go_daemon == "postconn"
ret = sup(
self,
gconf.ssh_command.split() + gconf.ssh_ctl_args + [self.remote_addr],
slave=self.inner_rsc.url,
deferred=deferred,
)
if deferred:
# send a message to peer so that we can wait for
# the answer from which we know connection is
# established and we can proceed with daemonization
# (doing that too early robs the ssh passwd prompt...)
# However, we'd better not start the RepceClient
# before daemonization (that's not preserved properly
# in daemon), we just do a an ad-hoc linear put/get.
i, o = ret
inf = os.fdopen(i)
repce.send(o, None, "__repce_version__")
select((inf,), (), ())
repce.recv(inf)
# hack hack hack: store a global reference to the file
# to save it from getting GC'd which implies closing it
gconf.permanent_handles.append(inf)
self.fd_pair = (i, o)
return "should"
示例8: tailer
def tailer():
while True:
errstore = cls.errstore.copy()
try:
poe, _, _ = select([po.stderr for po in errstore], [], [], 1)
except ValueError, selecterror:
continue
for po in errstore:
if po.stderr not in poe:
next
po.lock.acquire()
try:
la = errstore.get(po)
if la == None:
continue
try:
fd = po.stderr.fileno()
except ValueError: # file is already closed
continue
l = os.read(fd, 1024)
if not l:
continue
tots = len(l)
for lx in la:
tots += len(lx)
while tots > 1 << 20 and la:
tots -= len(la.pop(0))
la.append(l)
finally:
po.lock.release()
示例9: terminate_geterr
def terminate_geterr(self, fail_on_err = True):
"""kill child, finalize stderr harvesting (unregister
from errhandler, set up .elines), fail on error if
asked for
"""
self.lock.acquire()
try:
self.on_death_row = True
finally:
self.lock.release()
elines = self.errstore.pop(self)
if self.poll() == None:
self.terminate()
if self.poll() == None:
time.sleep(0.1)
self.kill()
self.wait()
while True:
if not select([self.stderr],[],[],0.1)[0]:
break
b = os.read(self.stderr.fileno(), 1024)
if b:
elines.append(b)
else:
break
self.stderr.close()
self.elines = elines
if fail_on_err and self.returncode != 0:
self.errfail()
示例10: startup
def startup(**kw):
"""set up logging, pidfile grabbing, daemonization"""
if getattr(gconf, 'pid_file', None) and kw.get('go_daemon') != 'postconn':
if not grabpidfile():
sys.stderr.write("pidfile is taken, exiting.\n")
sys.exit(2)
gconf.pid_file_owned = True
if kw.get('go_daemon') == 'should':
x, y = os.pipe()
gconf.cpid = os.fork()
if gconf.cpid:
os.close(x)
sys.exit()
os.close(y)
os.setsid()
dn = os.open(os.devnull, os.O_RDWR)
for f in (sys.stdin, sys.stdout, sys.stderr):
os.dup2(dn, f.fileno())
if getattr(gconf, 'pid_file', None):
if not grabpidfile(gconf.pid_file + '.tmp'):
raise GsyncdError("cannot grab temporary pidfile")
os.rename(gconf.pid_file + '.tmp', gconf.pid_file)
# wait for parent to terminate
# so we can start up with
# no messing from the dirty
# ol' bustard
select((x,), (), ())
os.close(x)
lkw = {}
if gconf.log_level:
lkw['level'] = gconf.log_level
if kw.get('log_file'):
if kw['log_file'] in ('-', '/dev/stderr'):
lkw['stream'] = sys.stderr
elif kw['log_file'] == '/dev/stdout':
lkw['stream'] = sys.stdout
else:
lkw['filename'] = kw['log_file']
GLogger.setup(label=kw.get('label'), **lkw)
lkw.update({'saved_label': kw.get('label')})
gconf.log_metadata = lkw
gconf.log_exit = True
示例11: service_loop
def service_loop(self):
"""start a RePCe server serving self's server
stop servicing if a timeout is configured and got no
keep-alime in that inteval
"""
repce = RepceServer(self.server, sys.stdin, sys.stdout, int(gconf.sync_jobs))
t = syncdutils.Thread(target=lambda: (repce.service_loop(), syncdutils.finalize()))
t.start()
logging.info("slave listening")
if gconf.timeout and int(gconf.timeout) > 0:
while True:
lp = self.server.last_keep_alive
time.sleep(int(gconf.timeout))
if lp == self.server.last_keep_alive:
logging.info("connection inactive for %d seconds, stopping" % int(gconf.timeout))
break
else:
select((), (), ())
示例12: tailer
def tailer():
while True:
for po in select([po.stderr for po in cls.errstore], [], []):
po.lock.acquire()
try:
la = cls.errstore.get(po)
if la == None:
continue
l = os.read(po.stderr.fileno(), 1024)
tots = len(l)
for lx in la:
tots += len(lx)
while tots > 1<<20 and la:
tots -= len(la.pop(0))
finally:
po.lock.release()
示例13: monitor
def monitor(self, w, argv, cpids):
"""the monitor loop
Basic logic is a blantantly simple blunt heuristics:
if spawned client survives 60 secs, it's considered OK.
This servers us pretty well as it's not vulneralbe to
any kind of irregular behavior of the child...
... well, except for one: if children is hung up on
waiting for some event, it can survive aeons, still
will be defunct. So we tweak the above logic to
expect the worker to send us a signal within 60 secs
(in the form of closing its end of a pipe). The worker
does this when it's done with the setup stage
ready to enter the service loop (note it's the setup
stage which is vulnerable to hangs -- the full
blown worker blows up on EPIPE if the net goes down,
due to the keep-alive thread)
"""
self.set_state(self.ST_INIT, w)
ret = 0
def nwait(p, o=0):
p2, r = waitpid(p, o)
if not p2:
return
return r
def exit_signalled(s):
""" child teminated due to receipt of SIGUSR1 """
return (os.WIFSIGNALED(s) and (os.WTERMSIG(s) == signal.SIGUSR1))
def exit_status(s):
if os.WIFEXITED(s):
return os.WEXITSTATUS(s)
return 1
conn_timeout = int(gconf.connection_timeout)
while ret in (0, 1):
logging.info('-' * conn_timeout)
logging.info('starting gsyncd worker')
pr, pw = os.pipe()
cpid = os.fork()
if cpid == 0:
os.close(pr)
os.execv(sys.executable, argv + ['--feedback-fd', str(pw),
'--local-path', w[0],
'--local-id',
'.' + escape(w[0]),
'--resource-remote', w[1]])
self.lock.acquire()
cpids.add(cpid)
self.lock.release()
os.close(pw)
t0 = time.time()
so = select((pr,), (), (), conn_timeout)[0]
os.close(pr)
if so:
ret = nwait(cpid, os.WNOHANG)
if ret is not None:
logging.info("worker(%s) died before establishing "
"connection" % w[0])
else:
logging.debug("worker(%s) connected" % w[0])
while time.time() < t0 + conn_timeout:
ret = nwait(cpid, os.WNOHANG)
if ret is not None:
logging.info("worker(%s) died in startup "
"phase" % w[0])
break
time.sleep(1)
else:
logging.info("worker(%s) not confirmed in %d sec, "
"aborting it" % (w[0], conn_timeout))
os.kill(cpid, signal.SIGKILL)
ret = nwait(cpid)
if ret is None:
self.set_state(self.ST_STABLE, w)
ret = nwait(cpid)
if exit_signalled(ret):
ret = 0
else:
ret = exit_status(ret)
if ret in (0, 1):
self.set_state(self.ST_FAULTY, w)
time.sleep(10)
self.set_state(self.ST_INCON, w)
return ret
示例14: monitor
#.........这里部分代码省略.........
apid = os.fork()
if apid == 0:
os.close(rw)
os.close(ww)
os.execv(sys.executable, argv + ['--local-path', w[0],
'--agent',
'--rpc-fd',
','.join([str(ra), str(wa),
str(rw), str(ww)])])
pr, pw = os.pipe()
cpid = os.fork()
if cpid == 0:
os.close(pr)
os.close(ra)
os.close(wa)
os.execv(sys.executable, argv + ['--feedback-fd', str(pw),
'--local-path', w[0],
'--local-id',
'.' + escape(w[0]),
'--rpc-fd',
','.join([str(rw), str(ww),
str(ra), str(wa)]),
'--subvol-num', str(w[2])] +
(['--is-hottier'] if w[3] else []) +
['--resource-remote', remote_host])
cpids.add(cpid)
agents.add(apid)
os.close(pw)
# close all RPC pipes in monitor
os.close(ra)
os.close(wa)
os.close(rw)
os.close(ww)
self.lock.release()
t0 = time.time()
so = select((pr,), (), (), conn_timeout)[0]
os.close(pr)
if so:
ret = nwait(cpid, os.WNOHANG)
ret_agent = nwait(apid, os.WNOHANG)
if ret_agent is not None:
# Agent is died Kill Worker
logging.info("Changelog Agent died, "
"Aborting Worker(%s)" % w[0])
errno_wrap(os.kill, [cpid, signal.SIGKILL], [ESRCH])
nwait(cpid)
nwait(apid)
if ret is not None:
logging.info("worker(%s) died before establishing "
"connection" % w[0])
nwait(apid) # wait for agent
else:
logging.debug("worker(%s) connected" % w[0])
while time.time() < t0 + conn_timeout:
ret = nwait(cpid, os.WNOHANG)
ret_agent = nwait(apid, os.WNOHANG)
if ret is not None:
logging.info("worker(%s) died in startup "
"phase" % w[0])
nwait(apid) # wait for agent
break
if ret_agent is not None:
# Agent is died Kill Worker
logging.info("Changelog Agent died, Aborting "
"Worker(%s)" % w[0])
errno_wrap(os.kill, [cpid, signal.SIGKILL], [ESRCH])
nwait(cpid)
nwait(apid)
break
time.sleep(1)
else:
logging.info("worker(%s) not confirmed in %d sec, "
"aborting it" % (w[0], conn_timeout))
errno_wrap(os.kill, [cpid, signal.SIGKILL], [ESRCH])
nwait(apid) # wait for agent
ret = nwait(cpid)
if ret is None:
self.status[w[0]].set_worker_status(self.ST_STABLE)
# If worker dies, agent terminates on EOF.
# So lets wait for agent first.
nwait(apid)
ret = nwait(cpid)
if exit_signalled(ret):
ret = 0
else:
ret = exit_status(ret)
if ret in (0, 1):
self.status[w[0]].set_worker_status(self.ST_FAULTY)
time.sleep(10)
self.status[w[0]].set_worker_status(self.ST_INCON)
return ret
示例15: monitor
def monitor(self):
"""the monitor loop
Basic logic is a blantantly simple blunt heuristics:
if spawned client survives 60 secs, it's considered OK.
This servers us pretty well as it's not vulneralbe to
any kind of irregular behavior of the child...
... well, except for one: if children is hung up on
waiting for some event, it can survive aeons, still
will be defunct. So we tweak the above logic to
expect the worker to send us a signal within 60 secs
(in the form of closing its end of a pipe). The worker
does this when it's done with the setup stage
ready to enter the service loop (note it's the setup
stage which is vulnerable to hangs -- the full
blown worker blows up on EPIPE if the net goes down,
due to the keep-alive thread)
"""
def sigcont_handler(*a):
"""
Re-init logging and send group kill signal
"""
md = gconf.log_metadata
logging.shutdown()
lcls = logging.getLoggerClass()
lcls.setup(label=md.get('saved_label'), **md)
pid = os.getpid()
os.kill(-pid, signal.SIGUSR1)
signal.signal(signal.SIGUSR1, lambda *a: ())
signal.signal(signal.SIGCONT, sigcont_handler)
argv = sys.argv[:]
for o in ('-N', '--no-daemon', '--monitor'):
while o in argv:
argv.remove(o)
argv.extend(('-N', '-p', ''))
argv.insert(0, os.path.basename(sys.executable))
self.set_state('starting...')
ret = 0
def nwait(p, o=0):
p2, r = waitpid(p, o)
if not p2:
return
return r
def exit_signalled(s):
""" child teminated due to receipt of SIGUSR1 """
return (os.WIFSIGNALED(s) and (os.WTERMSIG(s) == signal.SIGUSR1))
def exit_status(s):
if os.WIFEXITED(s):
return os.WEXITSTATUS(s)
return 1
conn_timeout = int(gconf.connection_timeout)
while ret in (0, 1):
logging.info('-' * conn_timeout)
logging.info('starting gsyncd worker')
pr, pw = os.pipe()
cpid = os.fork()
if cpid == 0:
os.close(pr)
os.execv(sys.executable, argv + ['--feedback-fd', str(pw)])
os.close(pw)
t0 = time.time()
so = select((pr,), (), (), conn_timeout)[0]
os.close(pr)
if so:
ret = nwait(cpid, os.WNOHANG)
if ret != None:
logging.debug("worker died before establishing connection")
else:
logging.debug("worker seems to be connected (?? racy check)")
while time.time() < t0 + conn_timeout:
ret = nwait(cpid, os.WNOHANG)
if ret != None:
logging.debug("worker died in startup phase")
break
time.sleep(1)
else:
logging.debug("worker not confirmed in %d sec, aborting it" % \
conn_timeout)
# relax one SIGTERM by setting a handler that sets back
# standard handler
set_term_handler(lambda *a: set_term_handler())
# give a chance to graceful exit
os.kill(-os.getpid(), signal.SIGTERM)
time.sleep(1)
os.kill(cpid, signal.SIGKILL)
ret = nwait(cpid)
if ret == None:
self.set_state('OK')
ret = nwait(cpid)
if exit_signalled(ret):
ret = 0
else:
ret = exit_status(ret)
if ret in (0,1):
self.set_state('faulty')
time.sleep(10)
self.set_state('inconsistent')
#.........这里部分代码省略.........