Search in sources :

Example 1 with ZKUtilOp

use of org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp in project hbase by apache.

the class ReplicationQueuesZKImpl method moveQueueUsingMulti.

/**
   * It "atomically" copies one peer's wals queue from another dead region server and returns them
   * all sorted. The new peer id is equal to the old peer id appended with the dead server's znode.
   * @param znode pertaining to the region server to copy the queues from
   * @peerId peerId pertaining to the queue need to be copied
   */
private Pair<String, SortedSet<String>> moveQueueUsingMulti(String znode, String peerId) {
    try {
        // hbase/replication/rs/deadrs
        String deadRSZnodePath = ZKUtil.joinZNode(this.queuesZNode, znode);
        List<ZKUtilOp> listOfOps = new ArrayList<>();
        ReplicationQueueInfo replicationQueueInfo = new ReplicationQueueInfo(peerId);
        String newPeerId = peerId + "-" + znode;
        String newPeerZnode = ZKUtil.joinZNode(this.myQueuesZnode, newPeerId);
        // check the logs queue for the old peer cluster
        String oldClusterZnode = ZKUtil.joinZNode(deadRSZnodePath, peerId);
        List<String> wals = ZKUtil.listChildrenNoWatch(this.zookeeper, oldClusterZnode);
        if (!peerExists(replicationQueueInfo.getPeerId())) {
            LOG.warn("Peer " + replicationQueueInfo.getPeerId() + " didn't exist, will move its queue to avoid the failure of multi op");
            for (String wal : wals) {
                String oldWalZnode = ZKUtil.joinZNode(oldClusterZnode, wal);
                listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldWalZnode));
            }
            listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldClusterZnode));
            ZKUtil.multiOrSequential(this.zookeeper, listOfOps, false);
            return null;
        }
        SortedSet<String> logQueue = new TreeSet<>();
        if (wals == null || wals.isEmpty()) {
            listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldClusterZnode));
        } else {
            // create the new cluster znode
            ZKUtilOp op = ZKUtilOp.createAndFailSilent(newPeerZnode, HConstants.EMPTY_BYTE_ARRAY);
            listOfOps.add(op);
            // get the offset of the logs and set it to new znodes
            for (String wal : wals) {
                String oldWalZnode = ZKUtil.joinZNode(oldClusterZnode, wal);
                byte[] logOffset = ZKUtil.getData(this.zookeeper, oldWalZnode);
                LOG.debug("Creating " + wal + " with data " + Bytes.toString(logOffset));
                String newLogZnode = ZKUtil.joinZNode(newPeerZnode, wal);
                listOfOps.add(ZKUtilOp.createAndFailSilent(newLogZnode, logOffset));
                listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldWalZnode));
                logQueue.add(wal);
            }
            // add delete op for peer
            listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldClusterZnode));
            if (LOG.isTraceEnabled())
                LOG.trace(" The multi list size is: " + listOfOps.size());
        }
        ZKUtil.multiOrSequential(this.zookeeper, listOfOps, false);
        LOG.info("Atomically moved " + znode + "/" + peerId + "'s WALs to my queue");
        return new Pair<>(newPeerId, logQueue);
    } catch (KeeperException e) {
        // Multi call failed; it looks like some other regionserver took away the logs.
        LOG.warn("Got exception in copyQueuesFromRSUsingMulti: ", e);
    } catch (InterruptedException e) {
        LOG.warn("Got exception in copyQueuesFromRSUsingMulti: ", e);
        Thread.currentThread().interrupt();
    }
    return null;
}
Also used : TreeSet(java.util.TreeSet) ArrayList(java.util.ArrayList) ZKUtilOp(org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp) KeeperException(org.apache.zookeeper.KeeperException) Pair(org.apache.hadoop.hbase.util.Pair)

Example 2 with ZKUtilOp

use of org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp in project hbase by apache.

the class ReplicationPeersZKImpl method registerPeer.

@Override
public void registerPeer(String id, ReplicationPeerConfig peerConfig) throws ReplicationException {
    try {
        if (peerExists(id)) {
            throw new IllegalArgumentException("Cannot add a peer with id=" + id + " because that id already exists.");
        }
        if (id.contains("-")) {
            throw new IllegalArgumentException("Found invalid peer name:" + id);
        }
        if (peerConfig.getClusterKey() != null) {
            try {
                ZKConfig.validateClusterKey(peerConfig.getClusterKey());
            } catch (IOException ioe) {
                throw new IllegalArgumentException(ioe.getMessage());
            }
        }
        checkQueuesDeleted(id);
        ZKUtil.createWithParents(this.zookeeper, this.peersZNode);
        List<ZKUtilOp> listOfOps = new ArrayList<>(2);
        ZKUtilOp op1 = ZKUtilOp.createAndFailSilent(getPeerNode(id), ReplicationSerDeHelper.toByteArray(peerConfig));
        // b/w PeerWatcher and ReplicationZookeeper#add method to create the
        // peer-state znode. This happens while adding a peer
        // The peer state data is set as "ENABLED" by default.
        ZKUtilOp op2 = ZKUtilOp.createAndFailSilent(getPeerStateNode(id), ENABLED_ZNODE_BYTES);
        listOfOps.add(op1);
        listOfOps.add(op2);
        ZKUtil.multiOrSequential(this.zookeeper, listOfOps, false);
    // A peer is enabled by default
    } catch (KeeperException e) {
        throw new ReplicationException("Could not add peer with id=" + id + ", peerConfif=>" + peerConfig, e);
    }
}
Also used : ArrayList(java.util.ArrayList) ZKUtilOp(org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp) IOException(java.io.IOException) KeeperException(org.apache.zookeeper.KeeperException)

Aggregations

ArrayList (java.util.ArrayList)2 ZKUtilOp (org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp)2 KeeperException (org.apache.zookeeper.KeeperException)2 IOException (java.io.IOException)1 TreeSet (java.util.TreeSet)1 Pair (org.apache.hadoop.hbase.util.Pair)1