X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/7bfa1e069777af48312d509a88e5faff02f930ff..1171524232347e4c8fbd47409577c5e988ebc6d6:/svc/conntrack.in diff --git a/svc/conntrack.in b/svc/conntrack.in index 367d26d4..a7431321 100644 --- a/svc/conntrack.in +++ b/svc/conntrack.in @@ -214,6 +214,7 @@ def localaddr(peer): _kick = T.Queue() def kickpeers(): + lastip = {} while True: upness, reason = _kick.get() @@ -233,35 +234,60 @@ def kickpeers(): addr = localaddr(CF.testaddr) if addr is None: upness = False + else: + addr = None ## Now decide what to do. changes = [] for g, pp in CF.groups: ## Find out which peer in the group ought to be active. - want = None # unequal to any string - if upness: - for t, p, a, m in pp: - if p is None: - aq = addr + ip = None + map = {} + want = None + for t, p, a, m in pp: + if p is None or not upness: + ipq = addr + else: + ipq = localaddr(p) + if upness and ip is None and \ + ipq is not None and (ipq & m) == a: + map[t] = 'up' + if t == 'down' or t.startswith('down/'): + want = None else: - aq = localaddr(p) - if aq is not None and (aq & m) == a: want = t - break + ip = ipq + else: + map[t] = 'down' ## Shut down the wrong ones. found = False for p in peers: - if p == want: + what = map.get(p, 'leave') + if what == 'up': found = True - elif p.startswith(g) and p != want: - changes.append(lambda p=p: SM.kill(p)) + elif what == 'down': + def _(p = p): + try: + SM.kill(p) + except T.TripeError, exc: + if exc.args[0] == 'unknown-peer': + ## Inherently racy; don't worry about this. + pass + else: + raise + changes.append(_) ## Start the right one if necessary. - if want is not None and not found: - changes.append(lambda: T._simple(SM.svcsubmit('connect', 'active', - want))) + if want is not None and (not found or ip != lastip.get(g, None)): + def _(want = want): + try: + SM.svcsubmit('connect', 'active', want) + except T.TripeError, exc: + SM.warn('conntrack', 'connect-failed', want, *exc.args) + changes.append(_) + lastip[g] = ip ## Commit the changes. if changes: @@ -403,7 +429,7 @@ class DBusMonitor (object): if me._bus is not None: mon.attach(me._bus) - def _reconnect(me): + def _reconnect(me, hunoz = None): """ Start connecting to the bus.