def fix_migrating(host, port): nodes = dict() mig_srcs = [] mig_dsts = [] t = Talker(host, port) try: m = t.talk_raw(CMD_CLUSTER_NODES) logging.debug('Ask `cluster nodes` Rsp %s', m) for node_info in m.split('\n'): if not _valid_node_info(node_info): continue node = ClusterNode(*node_info.split(' ')) node.host = node.host or host nodes[node.node_id] = node mig_dsts.extend([(node, { 'slot': g[0], 'id': g[1] }) for g in PAT_MIGRATING_IN.findall(node_info)]) mig_srcs.extend([(node, { 'slot': g[0], 'id': g[1] }) for g in PAT_MIGRATING_OUT.findall(node_info)]) for n, args in mig_dsts: node_id = args['id'] if node_id not in nodes: logging.error( 'Fail to fix %s:%d <- (referenced from %s:%d)' ' - node %s is missing', n.host, n.port, host, port, node_id) continue _migr_one_slot(nodes[node_id], n, int(args['slot']), nodes.itervalues()) for n, args in mig_srcs: node_id = args['id'] if node_id not in nodes: logging.error( 'Fail to fix %s:%d -> (referenced from %s:%d)' ' - node %s is missing', n.host, n.port, host, port, node_id) continue _migr_one_slot(n, nodes[node_id], int(args['slot']), nodes.itervalues()) finally: t.close() for n in nodes.itervalues(): n.close()
def fix_migrating(host, port): nodes = dict() mig_srcs = [] mig_dsts = [] t = Talker(host, port) try: m = t.talk_raw(CMD_CLUSTER_NODES) logging.debug("Ask `cluster nodes` Rsp %s", m) for node_info in m.split("\n"): if not _valid_node_info(node_info): continue node = ClusterNode(*node_info.split(" ")) node.host = node.host or host nodes[node.node_id] = node mig_dsts.extend([(node, {"slot": g[0], "id": g[1]}) for g in PAT_MIGRATING_IN.findall(node_info)]) mig_srcs.extend([(node, {"slot": g[0], "id": g[1]}) for g in PAT_MIGRATING_OUT.findall(node_info)]) for n, args in mig_dsts: node_id = args["id"] if node_id not in nodes: logging.error( "Fail to fix %s:%d <- (referenced from %s:%d)" " - node %s is missing", n.host, n.port, host, port, node_id, ) continue _migr_one_slot(nodes[node_id], n, int(args["slot"]), nodes.itervalues()) for n, args in mig_srcs: node_id = args["id"] if node_id not in nodes: logging.error( "Fail to fix %s:%d -> (referenced from %s:%d)" " - node %s is missing", n.host, n.port, host, port, node_id, ) continue _migr_one_slot(n, nodes[node_id], int(args["slot"]), nodes.itervalues()) finally: t.close() for n in nodes.itervalues(): n.close()
def shutdown_cluster(host, port): t = Talker(host, port) try: _ensure_cluster_status_set(t) myself = None m = t.talk_raw(CMD_CLUSTER_NODES) logging.debug('Ask `cluster nodes` Rsp %s', m) nodes_info = filter(None, m.split('\n')) if len(nodes_info) > 1: raise RedisStatusError('More than 1 nodes in cluster.') try: m = t.talk('cluster', 'reset') except hiredis.ReplyError, e: if 'containing keys' in e.message: raise RedisStatusError('Cluster containing keys') raise logging.debug('Ask `cluster delslots` Rsp %s', m)
def fix_migrating(host, port): nodes = dict() mig_srcs = [] mig_dsts = [] t = Talker(host, port) try: m = t.talk_raw(CMD_CLUSTER_NODES) logging.debug('Ask `cluster nodes` Rsp %s', m) for node_info in m.split('\n'): if not _valid_node_info(node_info): continue node = ClusterNode(*node_info.split(' ')) node.host = node.host or host nodes[node.node_id] = node search = PAT_MIGRATING_IN.search(node_info) if search is not None: mig_dsts.append((node, search.groupdict())) search = PAT_MIGRATING_OUT.search(node_info) if search is not None: mig_srcs.append((node, search.groupdict())) for n, args in mig_dsts: node_id = args['id'] if node_id not in nodes: logging.error('Fail to fix %s:%d <- (referenced from %s:%d)' ' - node %s is missing', n.host, n.port, host, port, node_id) continue _migr_one_slot(nodes[node_id], n, int(args['slot']), nodes.itervalues()) for n, args in mig_srcs: node_id = args['id'] if node_id not in nodes: logging.error('Fail to fix %s:%d -> (referenced from %s:%d)' ' - node %s is missing', n.host, n.port, host, port, node_id) continue _migr_one_slot(n, nodes[node_id], int(args['slot']), nodes.itervalues()) finally: t.close() for n in nodes.itervalues(): n.close()
def join_cluster(cluster_host, cluster_port, newin_host, newin_port, balancer=None, balance_plan=base_balance_plan): nodes = [] t = Talker(newin_host, newin_port) try: _join_to_cluster(cluster_host, cluster_port, t) logging.info('Instance at %s:%d has joined %s:%d; now balancing slots', newin_host, newin_port, cluster_host, cluster_port) m = t.talk_raw(CMD_CLUSTER_INFO) logging.debug('Ask `cluster info` Rsp %s', m) cluster_state = PAT_CLUSTER_STATE.findall(m) if cluster_state[0] != 'ok': raise hiredis.ProtocolError( 'Node %s:%d is already in a cluster' % (t.host, t.port)) slots = int(PAT_CLUSTER_SLOT_ASSIGNED.findall(m)[0]) nodes = _list_nodes(t, default_host=newin_host)[0] for source, target, count in balance_plan(nodes, balancer): _migr_slots(source, target, count, nodes) finally: t.close() for n in nodes: n.close()