Search in sources :

Example 11 with KeeperException

use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.

the class KeeperException method create.

/**
     * All non-specific keeper exceptions should be constructed via this factory
     * method in order to guarantee consistency in error codes and such. If you
     * know the error code, then you should construct the special purpose
     * exception directly. That will allow you to have the most specific
     * possible declarations of what exceptions might actually be thrown.
     * 
     * @param code
     *            The error code.
     * @param path
     *            The ZooKeeper path being operated on.
     * @return The specialized exception, presumably to be thrown by the caller.
     */
public static KeeperException create(Code code, String path) {
    KeeperException r = create(code);
    r.path = path;
    return r;
}
Also used : KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

Example 12 with KeeperException

use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.

the class KeeperException method create.

/**
     * @deprecated deprecated in 3.1.0, use {@link #create(Code, String)}
     *             instead
     */
@Deprecated
public static KeeperException create(int code, String path) {
    KeeperException r = create(Code.get(code));
    r.path = path;
    return r;
}
Also used : KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

Example 13 with KeeperException

use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.

the class ZooKeeperServer method prepRequest.

/**
     * This method will be called inside the ProcessRequestThread, which is a
     * singleton, so there will be a single thread calling this code.
     *
     * @param request
     */
public void prepRequest(Request request, long txnId) {
    // LOG.info("Prep>>> cxid = " + request.cxid + " type = " +
    // request.type + " id = 0x" + Long.toHexString(request.sessionId));
    TxnHeader txnHeader = null;
    Record txn = null;
    try {
        switch(request.type) {
            case OpCode.create:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.create);
                CreateRequest createRequest = new CreateRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, createRequest);
                String path = createRequest.getPath();
                int lastSlash = path.lastIndexOf('/');
                if (lastSlash == -1 || path.indexOf('\0') != -1) {
                    LOG.info("Invalid path " + path + " with session 0x" + Long.toHexString(request.sessionId));
                    throw new KeeperException.BadArgumentsException(path);
                }
                if (!fixupACL(request.authInfo, createRequest.getAcl())) {
                    throw new KeeperException.InvalidACLException(path);
                }
                String parentPath = path.substring(0, lastSlash);
                ChangeRecord parentRecord = getRecordForPath(parentPath);
                checkACL(parentRecord.acl, ZooDefs.Perms.CREATE, request.authInfo);
                int parentCVersion = parentRecord.stat.getCversion();
                CreateMode createMode = CreateMode.fromFlag(createRequest.getFlags());
                if (createMode.isSequential()) {
                    path = path + String.format("%010d", parentCVersion);
                }
                try {
                    PathUtils.validatePath(path);
                } catch (IllegalArgumentException ie) {
                    LOG.info("Invalid path " + path + " with session 0x" + Long.toHexString(request.sessionId));
                    throw new KeeperException.BadArgumentsException(path);
                }
                try {
                    if (getRecordForPath(path) != null) {
                        throw new KeeperException.NodeExistsException(path);
                    }
                } catch (KeeperException.NoNodeException e) {
                // ignore this one
                }
                boolean ephemeralParent = parentRecord.stat.getEphemeralOwner() != 0;
                if (ephemeralParent) {
                    throw new KeeperException.NoChildrenForEphemeralsException(path);
                }
                txn = new CreateTxn(path, createRequest.getData(), createRequest.getAcl(), createMode.isEphemeral());
                StatPersisted s = new StatPersisted();
                if (createMode.isEphemeral()) {
                    s.setEphemeralOwner(request.sessionId);
                }
                parentRecord = parentRecord.duplicate(txnHeader.getZxid());
                parentRecord.childCount++;
                parentRecord.stat.setCversion(parentRecord.stat.getCversion() + 1);
                addChangeRecord(parentRecord);
                addChangeRecord(new ChangeRecord(txnHeader.getZxid(), path, s, 0, createRequest.getAcl()));
                break;
            case OpCode.delete:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.delete);
                DeleteRequest deleteRequest = new DeleteRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, deleteRequest);
                path = deleteRequest.getPath();
                lastSlash = path.lastIndexOf('/');
                if (lastSlash == -1 || path.indexOf('\0') != -1 || getZKDatabase().isSpecialPath(path)) {
                    throw new KeeperException.BadArgumentsException(path);
                }
                parentPath = path.substring(0, lastSlash);
                parentRecord = getRecordForPath(parentPath);
                ChangeRecord nodeRecord = getRecordForPath(path);
                checkACL(parentRecord.acl, ZooDefs.Perms.DELETE, request.authInfo);
                int version = deleteRequest.getVersion();
                if (version != -1 && nodeRecord.stat.getVersion() != version) {
                    throw new KeeperException.BadVersionException(path);
                }
                if (nodeRecord.childCount > 0) {
                    throw new KeeperException.NotEmptyException(path);
                }
                txn = new DeleteTxn(path);
                parentRecord = parentRecord.duplicate(txnHeader.getZxid());
                parentRecord.childCount--;
                parentRecord.stat.setCversion(parentRecord.stat.getCversion() + 1);
                addChangeRecord(parentRecord);
                addChangeRecord(new ChangeRecord(txnHeader.getZxid(), path, null, -1, null));
                break;
            case OpCode.setData:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.setData);
                SetDataRequest setDataRequest = new SetDataRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, setDataRequest);
                path = setDataRequest.getPath();
                nodeRecord = getRecordForPath(path);
                checkACL(nodeRecord.acl, ZooDefs.Perms.WRITE, request.authInfo);
                version = setDataRequest.getVersion();
                int currentVersion = nodeRecord.stat.getVersion();
                if (version != -1 && version != currentVersion) {
                    throw new KeeperException.BadVersionException(path);
                }
                version = currentVersion + 1;
                txn = new SetDataTxn(path, setDataRequest.getData(), version);
                nodeRecord = nodeRecord.duplicate(txnHeader.getZxid());
                nodeRecord.stat.setVersion(version);
                addChangeRecord(nodeRecord);
                break;
            case OpCode.setACL:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.setACL);
                SetACLRequest setAclRequest = new SetACLRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, setAclRequest);
                path = setAclRequest.getPath();
                if (!fixupACL(request.authInfo, setAclRequest.getAcl())) {
                    throw new KeeperException.InvalidACLException(path);
                }
                nodeRecord = getRecordForPath(path);
                checkACL(nodeRecord.acl, ZooDefs.Perms.ADMIN, request.authInfo);
                version = setAclRequest.getVersion();
                currentVersion = nodeRecord.stat.getAversion();
                if (version != -1 && version != currentVersion) {
                    throw new KeeperException.BadVersionException(path);
                }
                version = currentVersion + 1;
                txn = new SetACLTxn(path, setAclRequest.getAcl(), version);
                nodeRecord = nodeRecord.duplicate(txnHeader.getZxid());
                nodeRecord.stat.setAversion(version);
                addChangeRecord(nodeRecord);
                break;
            case OpCode.createSession:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.createSession);
                request.request.rewind();
                int to = request.request.getInt();
                txn = new CreateSessionTxn((Long) request.getOwner());
                request.request.rewind();
                sessionTracker.addSession(request.sessionId, (Long) request.getOwner());
                break;
            case OpCode.closeSession:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.closeSession);
                // We don't want to do this check since the session expiration
                // thread
                // queues up this operation without being the session owner.
                // this request is the last of the session so it should be ok
                // zks.sessionTracker.checkSession(request.sessionId,
                // request.getOwner());
                HashSet<String> es = getZKDatabase().getEphemerals(request.sessionId);
                synchronized (outstandingChanges) {
                    for (ChangeRecord c : outstandingChanges) {
                        if (c.stat == null) {
                            // Doing a delete
                            es.remove(c.path);
                        } else if (c.stat.getEphemeralOwner() == request.sessionId) {
                            es.add(c.path);
                        }
                    }
                    for (String path2Delete : es) {
                        addChangeRecord(new ChangeRecord(txnHeader.getZxid(), path2Delete, null, 0, null));
                    }
                }
                sessionTracker.removeSession(request.sessionId);
                LOG.info("Processed session termination for sessionid: 0x" + Long.toHexString(request.sessionId));
                break;
            case OpCode.sync:
            case OpCode.exists:
            case OpCode.getData:
            case OpCode.getACL:
            case OpCode.getChildren:
            case OpCode.getChildren2:
            case OpCode.ping:
            case OpCode.setWatches:
            default:
        }
    } catch (KeeperException e) {
        if (txnHeader != null) {
            txnHeader.setType(OpCode.error);
            txn = new ErrorTxn(e.code().intValue());
        }
        LOG.debug("Got user-level KeeperException when processing " + request.toString() + " Error Path:" + e.getPath() + " Error:" + e.getMessage());
        request.setException(e);
    } catch (Exception e) {
        // log at error level as we are returning a marshalling
        // error to the user
        LOG.error("Failed to process " + request, e);
        StringBuilder sb = new StringBuilder();
        ByteBuffer bb = request.request;
        if (bb != null) {
            bb.rewind();
            while (bb.hasRemaining()) {
                sb.append(Integer.toHexString(bb.get() & 0xff));
            }
        } else {
            sb.append("request buffer is null");
        }
        LOG.error("Dumping request buffer: 0x" + sb.toString());
        if (txnHeader != null) {
            txnHeader.setType(OpCode.error);
            txn = new ErrorTxn(Code.MARSHALLINGERROR.intValue());
        }
    }
    request.hdr = txnHeader;
    request.txn = txn;
    request.zxid = txnId;
    executeRequest(request);
}
Also used : CreateRequest(org.apache.zookeeper_voltpatches.proto.CreateRequest) DeleteTxn(org.apache.zookeeper_voltpatches.txn.DeleteTxn) CreateSessionTxn(org.apache.zookeeper_voltpatches.txn.CreateSessionTxn) Record(org.apache.jute_voltpatches.Record) SetACLRequest(org.apache.zookeeper_voltpatches.proto.SetACLRequest) SetDataRequest(org.apache.zookeeper_voltpatches.proto.SetDataRequest) SetDataTxn(org.apache.zookeeper_voltpatches.txn.SetDataTxn) ByteBuffer(java.nio.ByteBuffer) SessionMovedException(org.apache.zookeeper_voltpatches.KeeperException.SessionMovedException) InstanceAlreadyExistsException(javax.management.InstanceAlreadyExistsException) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) IOException(java.io.IOException) CreateTxn(org.apache.zookeeper_voltpatches.txn.CreateTxn) ErrorTxn(org.apache.zookeeper_voltpatches.txn.ErrorTxn) CreateMode(org.apache.zookeeper_voltpatches.CreateMode) SetACLTxn(org.apache.zookeeper_voltpatches.txn.SetACLTxn) StatPersisted(org.apache.zookeeper_voltpatches.data.StatPersisted) DeleteRequest(org.apache.zookeeper_voltpatches.proto.DeleteRequest) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) TxnHeader(org.apache.zookeeper_voltpatches.txn.TxnHeader)

Example 14 with KeeperException

use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.

the class RealVoltDB method validateStartAction.

private void validateStartAction() {
    ZooKeeper zk = m_messenger.getZK();
    boolean initCompleted = false;
    List<String> children = null;
    try {
        initCompleted = zk.exists(VoltZK.init_completed, false) != null;
        children = zk.getChildren(VoltZK.start_action, new StartActionWatcher(), null);
    } catch (KeeperException e) {
        hostLog.error("Failed to validate the start actions", e);
        return;
    } catch (InterruptedException e) {
        VoltDB.crashLocalVoltDB("Interrupted during start action validation:" + e.getMessage(), true, e);
    }
    if (children != null && !children.isEmpty()) {
        for (String child : children) {
            byte[] data = null;
            try {
                data = zk.getData(VoltZK.start_action + "/" + child, false, null);
            } catch (KeeperException excp) {
                if (excp.code() == Code.NONODE) {
                    hostLog.debug("Failed to validate the start action as node " + VoltZK.start_action + "/" + child + " got disconnected", excp);
                } else {
                    hostLog.error("Failed to validate the start actions ", excp);
                }
                return;
            } catch (InterruptedException e) {
                VoltDB.crashLocalVoltDB("Interrupted during start action validation:" + e.getMessage(), true, e);
            }
            if (data == null) {
                VoltDB.crashLocalVoltDB("Couldn't find " + VoltZK.start_action + "/" + child);
            }
            String startAction = new String(data);
            if ((startAction.equals(StartAction.JOIN.toString()) || startAction.equals(StartAction.REJOIN.toString()) || startAction.equals(StartAction.LIVE_REJOIN.toString())) && !initCompleted) {
                int nodeId = VoltZK.getHostIDFromChildName(child);
                if (nodeId == m_messenger.getHostId()) {
                    VoltDB.crashLocalVoltDB("This node was started with start action " + startAction + " during cluster creation. " + "All nodes should be started with matching create or recover actions when bring up a cluster. " + "Join and rejoin are for adding nodes to an already running cluster.");
                } else {
                    hostLog.warn("Node " + nodeId + " tried to " + startAction + " cluster but it is not allowed during cluster creation. " + "All nodes should be started with matching create or recover actions when bring up a cluster. " + "Join and rejoin are for adding nodes to an already running cluster.");
                }
            }
        }
    }
}
Also used : ZooKeeper(org.apache.zookeeper_voltpatches.ZooKeeper) KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

Example 15 with KeeperException

use of org.apache.zookeeper_voltpatches.KeeperException in project voltdb by VoltDB.

the class SnapshotSaveAPI method logParticipatingHostCount.

/**
     * Once participating host count is set, SnapshotCompletionMonitor can check this ZK node to
     * determine whether the snapshot has finished or not.
     *
     * This should only be called when all participants have responded. It is possible that some
     * hosts finish taking snapshot before the coordinator logs the participating host count. In
     * this case, the host count would have been decremented multiple times already. To make sure
     * finished hosts are logged correctly, this method adds participating host count + 1 to the
     * current host count.
     *
     * @param txnId The snapshot txnId
     * @param participantCount The number of hosts participating in this snapshot
     */
public static void logParticipatingHostCount(long txnId, int participantCount) {
    ZooKeeper zk = VoltDB.instance().getHostMessenger().getZK();
    final String snapshotPath = VoltZK.completed_snapshots + "/" + txnId;
    boolean success = false;
    while (!success) {
        Stat stat = new Stat();
        byte[] data = null;
        try {
            data = zk.getData(snapshotPath, false, stat);
        } catch (KeeperException e) {
            if (e.code() == KeeperException.Code.NONODE) {
                // If snapshot creation failed for some reason, the node won't exist. ignore
                return;
            }
            VoltDB.crashLocalVoltDB("Failed to get snapshot completion node", true, e);
        } catch (InterruptedException e) {
            VoltDB.crashLocalVoltDB("Interrupted getting snapshot completion node", true, e);
        }
        if (data == null) {
            VoltDB.crashLocalVoltDB("Data should not be null if the node exists", false, null);
        }
        try {
            JSONObject jsonObj = new JSONObject(new String(data, Charsets.UTF_8));
            if (jsonObj.getLong("txnId") != txnId) {
                VoltDB.crashLocalVoltDB("TxnId should match", false, null);
            }
            int hostCount = jsonObj.getInt("hostCount");
            // +1 because hostCount was initialized to -1
            jsonObj.put("hostCount", hostCount + participantCount + 1);
            zk.setData(snapshotPath, jsonObj.toString(4).getBytes(Charsets.UTF_8), stat.getVersion());
        } catch (KeeperException.BadVersionException e) {
            continue;
        } catch (Exception e) {
            VoltDB.crashLocalVoltDB("This ZK call should never fail", true, e);
        }
        success = true;
    }
}
Also used : ZooKeeper(org.apache.zookeeper_voltpatches.ZooKeeper) Stat(org.apache.zookeeper_voltpatches.data.Stat) JSONObject(org.json_voltpatches.JSONObject) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) TimeoutException(java.util.concurrent.TimeoutException) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) BrokenBarrierException(java.util.concurrent.BrokenBarrierException) JSONException(org.json_voltpatches.JSONException)

Aggregations

KeeperException (org.apache.zookeeper_voltpatches.KeeperException)25 Stat (org.apache.zookeeper_voltpatches.data.Stat)12 JSONException (org.json_voltpatches.JSONException)9 ZooKeeper (org.apache.zookeeper_voltpatches.ZooKeeper)6 JSONObject (org.json_voltpatches.JSONObject)5 ByteBuffer (java.nio.ByteBuffer)4 List (java.util.List)4 Map (java.util.Map)4 IOException (java.io.IOException)3 HashMap (java.util.HashMap)3 ExecutionException (java.util.concurrent.ExecutionException)3 InetAddress (java.net.InetAddress)2 ArrayList (java.util.ArrayList)2 Set (java.util.Set)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 CreateTxn (org.apache.zookeeper_voltpatches.txn.CreateTxn)2 DeleteTxn (org.apache.zookeeper_voltpatches.txn.DeleteTxn)2 ErrorTxn (org.apache.zookeeper_voltpatches.txn.ErrorTxn)2 SetACLTxn (org.apache.zookeeper_voltpatches.txn.SetACLTxn)2 SetDataTxn (org.apache.zookeeper_voltpatches.txn.SetDataTxn)2