Search in sources :

Example 16 with KeeperException

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

the class TopologyZKUtils method readTopologyFromZK.

public static AbstractTopology readTopologyFromZK(ZooKeeper zk) {
    AbstractTopology topology = null;
    try {
        byte[] data = zk.getData(VoltZK.topology, false, null);
        String jsonTopology = new String(data, Charsets.UTF_8);
        topology = AbstractTopology.topologyFromJSON(jsonTopology);
    } catch (KeeperException | InterruptedException | JSONException e) {
        VoltDB.crashLocalVoltDB("Unable to read topology from ZK, dying", true, e);
    }
    return topology;
}
Also used : AbstractTopology(org.voltdb.AbstractTopology) JSONException(org.json_voltpatches.JSONException) KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

Example 17 with KeeperException

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

the class ZooKeeperServer method executeRequest.

private void executeRequest(Request request) {
    if (LOG.isDebugEnabled()) {
        LOG.debug("Processing request:: " + request);
    }
    // request.addRQRec(">final");
    long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK;
    if (request.type == OpCode.ping) {
        traceMask = ZooTrace.SERVER_PING_TRACE_MASK;
    }
    if (LOG.isTraceEnabled()) {
        ZooTrace.logRequest(LOG, traceMask, 'E', request, "");
    }
    ProcessTxnResult rc = null;
    synchronized (outstandingChanges) {
        while (!outstandingChanges.isEmpty() && outstandingChanges.get(0).zxid <= request.zxid) {
            ChangeRecord cr = outstandingChanges.remove(0);
            if (cr.zxid < request.zxid) {
                LOG.warn("Zxid outstanding " + cr.zxid + " is less than current " + request.zxid);
            }
            if (outstandingChangesForPath.get(cr.path) == cr) {
                outstandingChangesForPath.remove(cr.path);
            }
        }
        if (request.hdr != null) {
            rc = getZKDatabase().processTxn(request.hdr, request.txn);
        }
    }
    if (request.hdr != null && request.hdr.getType() == OpCode.closeSession) {
        Factory scxn = getServerCnxnFactory();
        // we might just be playing diffs from the leader
        if (scxn != null && request.cnxn == null) {
            // calling this if we have the cnxn results in the client's
            // close session response being lost - we've already closed
            // the session/socket here before we can send the closeSession
            // in the switch block below
            scxn.closeSession(request.sessionId);
            return;
        }
    }
    if (request.cnxn == null) {
        return;
    }
    ServerCnxn cnxn = request.cnxn;
    String lastOp = "NA";
    decInProcess();
    Code err = Code.OK;
    Record rsp = null;
    boolean closeSession = false;
    try {
        if (request.hdr != null && request.hdr.getType() == OpCode.error) {
            throw KeeperException.create(KeeperException.Code.get(((ErrorTxn) request.txn).getErr()));
        }
        KeeperException ke = request.getException();
        if (ke != null) {
            throw ke;
        }
        if (LOG.isDebugEnabled()) {
            LOG.debug(request);
        }
        switch(request.type) {
            case OpCode.ping:
                {
                    serverStats().updateLatency(request.createTime);
                    lastOp = "PING";
                    ((CnxnStats) cnxn.getStats()).updateForResponse(request.cxid, request.zxid, lastOp, request.createTime, System.currentTimeMillis());
                    cnxn.sendResponse(new ReplyHeader(-2, getZKDatabase().getDataTreeLastProcessedZxid(), 0), null, "response");
                    return;
                }
            case OpCode.createSession:
                {
                    serverStats().updateLatency(request.createTime);
                    lastOp = "SESS";
                    ((CnxnStats) cnxn.getStats()).updateForResponse(request.cxid, request.zxid, lastOp, request.createTime, System.currentTimeMillis());
                    cnxn.finishSessionInit(true);
                    return;
                }
            case OpCode.create:
                {
                    lastOp = "CREA";
                    rsp = new CreateResponse(rc.path);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.delete:
                {
                    lastOp = "DELE";
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.setData:
                {
                    lastOp = "SETD";
                    rsp = new SetDataResponse(rc.stat);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.setACL:
                {
                    lastOp = "SETA";
                    rsp = new SetACLResponse(rc.stat);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.closeSession:
                {
                    lastOp = "CLOS";
                    closeSession = true;
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.sync:
                {
                    lastOp = "SYNC";
                    SyncRequest syncRequest = new SyncRequest();
                    ZooKeeperServer.byteBuffer2Record(request.request, syncRequest);
                    rsp = new SyncResponse(syncRequest.getPath());
                    break;
                }
            case OpCode.exists:
                {
                    lastOp = "EXIS";
                    // TODO we need to figure out the security requirement for this!
                    ExistsRequest existsRequest = new ExistsRequest();
                    ZooKeeperServer.byteBuffer2Record(request.request, existsRequest);
                    String path = existsRequest.getPath();
                    if (path.indexOf('\0') != -1) {
                        throw new KeeperException.BadArgumentsException();
                    }
                    Stat stat = getZKDatabase().statNode(path, existsRequest.getWatch() ? cnxn : null);
                    rsp = new ExistsResponse(stat);
                    break;
                }
            case OpCode.getData:
                {
                    lastOp = "GETD";
                    GetDataRequest getDataRequest = new GetDataRequest();
                    ZooKeeperServer.byteBuffer2Record(request.request, getDataRequest);
                    DataNode n = getZKDatabase().getNode(getDataRequest.getPath());
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    Long aclL;
                    synchronized (n) {
                        aclL = n.acl;
                    }
                    checkACL(getZKDatabase().convertLong(aclL), ZooDefs.Perms.READ, request.authInfo);
                    Stat stat = new Stat();
                    byte[] b = getZKDatabase().getData(getDataRequest.getPath(), stat, getDataRequest.getWatch() ? cnxn : null);
                    rsp = new GetDataResponse(b, stat);
                    break;
                }
            case OpCode.setWatches:
                {
                    lastOp = "SETW";
                    SetWatches setWatches = new SetWatches();
                    // XXX We really should NOT need this!!!!
                    request.request.rewind();
                    ZooKeeperServer.byteBuffer2Record(request.request, setWatches);
                    long relativeZxid = setWatches.getRelativeZxid();
                    getZKDatabase().setWatches(relativeZxid, setWatches.getDataWatches(), setWatches.getExistWatches(), setWatches.getChildWatches(), cnxn);
                    break;
                }
            case OpCode.getACL:
                {
                    lastOp = "GETA";
                    GetACLRequest getACLRequest = new GetACLRequest();
                    ZooKeeperServer.byteBuffer2Record(request.request, getACLRequest);
                    Stat stat = new Stat();
                    List<ACL> acl = getZKDatabase().getACL(getACLRequest.getPath(), stat);
                    rsp = new GetACLResponse(acl, stat);
                    break;
                }
            case OpCode.getChildren:
                {
                    lastOp = "GETC";
                    GetChildrenRequest getChildrenRequest = new GetChildrenRequest();
                    ZooKeeperServer.byteBuffer2Record(request.request, getChildrenRequest);
                    DataNode n = getZKDatabase().getNode(getChildrenRequest.getPath());
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    Long aclG;
                    synchronized (n) {
                        aclG = n.acl;
                    }
                    checkACL(getZKDatabase().convertLong(aclG), ZooDefs.Perms.READ, request.authInfo);
                    List<String> children = getZKDatabase().getChildren(getChildrenRequest.getPath(), null, getChildrenRequest.getWatch() ? cnxn : null);
                    rsp = new GetChildrenResponse(children);
                    break;
                }
            case OpCode.getChildren2:
                {
                    lastOp = "GETC";
                    GetChildren2Request getChildren2Request = new GetChildren2Request();
                    ZooKeeperServer.byteBuffer2Record(request.request, getChildren2Request);
                    Stat stat = new Stat();
                    DataNode n = getZKDatabase().getNode(getChildren2Request.getPath());
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    Long aclG;
                    synchronized (n) {
                        aclG = n.acl;
                    }
                    checkACL(getZKDatabase().convertLong(aclG), ZooDefs.Perms.READ, request.authInfo);
                    List<String> children = getZKDatabase().getChildren(getChildren2Request.getPath(), stat, getChildren2Request.getWatch() ? cnxn : null);
                    rsp = new GetChildren2Response(children, stat);
                    break;
                }
        }
    } catch (SessionMovedException e) {
        // session moved is a connection level error, we need to tear
        // down the connection otw ZOOKEEPER-710 might happen
        // ie client on slow follower starts to renew session, fails
        // before this completes, then tries the fast follower (leader)
        // and is successful, however the initial renew is then
        // successfully fwd/processed by the leader and as a result
        // the client and leader disagree on where the client is most
        // recently attached (and therefore invalid SESSION MOVED generated)
        cnxn.sendCloseSession();
        return;
    } catch (KeeperException e) {
        err = e.code();
    } 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;
        bb.rewind();
        while (bb.hasRemaining()) {
            sb.append(Integer.toHexString(bb.get() & 0xff));
        }
        LOG.error("Dumping request buffer: 0x" + sb.toString());
        err = Code.MARSHALLINGERROR;
    }
    ReplyHeader hdr = new ReplyHeader(request.cxid, request.zxid, err.intValue());
    serverStats().updateLatency(request.createTime);
    ((CnxnStats) cnxn.getStats()).updateForResponse(request.cxid, request.zxid, lastOp, request.createTime, System.currentTimeMillis());
    try {
        cnxn.sendResponse(hdr, rsp, "response");
        if (closeSession) {
            cnxn.sendCloseSession();
        }
    } catch (IOException e) {
        LOG.error("FIXMSG", e);
    }
}
Also used : CreateResponse(org.apache.zookeeper_voltpatches.proto.CreateResponse) GetACLRequest(org.apache.zookeeper_voltpatches.proto.GetACLRequest) Factory(org.apache.zookeeper_voltpatches.server.NIOServerCnxn.Factory) ProcessTxnResult(org.apache.zookeeper_voltpatches.server.DataTree.ProcessTxnResult) GetACLResponse(org.apache.zookeeper_voltpatches.proto.GetACLResponse) SetDataResponse(org.apache.zookeeper_voltpatches.proto.SetDataResponse) SetACLResponse(org.apache.zookeeper_voltpatches.proto.SetACLResponse) GetDataRequest(org.apache.zookeeper_voltpatches.proto.GetDataRequest) CnxnStats(org.apache.zookeeper_voltpatches.server.NIOServerCnxn.CnxnStats) Stat(org.apache.zookeeper_voltpatches.data.Stat) SyncResponse(org.apache.zookeeper_voltpatches.proto.SyncResponse) Record(org.apache.jute_voltpatches.Record) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) GetChildren2Response(org.apache.zookeeper_voltpatches.proto.GetChildren2Response) ReplyHeader(org.apache.zookeeper_voltpatches.proto.ReplyHeader) ExistsRequest(org.apache.zookeeper_voltpatches.proto.ExistsRequest) GetChildrenRequest(org.apache.zookeeper_voltpatches.proto.GetChildrenRequest) GetChildren2Request(org.apache.zookeeper_voltpatches.proto.GetChildren2Request) IOException(java.io.IOException) Code(org.apache.zookeeper_voltpatches.KeeperException.Code) OpCode(org.apache.zookeeper_voltpatches.ZooDefs.OpCode) 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) ErrorTxn(org.apache.zookeeper_voltpatches.txn.ErrorTxn) GetChildrenResponse(org.apache.zookeeper_voltpatches.proto.GetChildrenResponse) SyncRequest(org.apache.zookeeper_voltpatches.proto.SyncRequest) SetWatches(org.apache.zookeeper_voltpatches.proto.SetWatches) SessionMovedException(org.apache.zookeeper_voltpatches.KeeperException.SessionMovedException) GetDataResponse(org.apache.zookeeper_voltpatches.proto.GetDataResponse) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) ExistsResponse(org.apache.zookeeper_voltpatches.proto.ExistsResponse)

Example 18 with KeeperException

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

the class CatalogContext method getDebuggingInfoFromCatalog.

// Generate helpful status messages based on configuration present in the
// catalog.  Used to generated these messages at startup and after an
// @UpdateApplicationCatalog
SortedMap<String, String> getDebuggingInfoFromCatalog(boolean verbose) {
    SortedMap<String, String> logLines = new TreeMap<>();
    // topology
    Deployment deployment = cluster.getDeployment().iterator().next();
    int hostCount = m_dbSettings.getCluster().hostcount();
    if (verbose) {
        Map<Integer, Integer> sphMap;
        try {
            sphMap = m_messenger.getSitesPerHostMapFromZK();
        } catch (KeeperException | InterruptedException | JSONException e) {
            hostLog.warn("Failed to get sitesperhost information from Zookeeper", e);
            sphMap = null;
        }
        int kFactor = deployment.getKfactor();
        if (sphMap == null) {
            logLines.put("deployment1", String.format("Cluster has %d hosts with leader hostname: \"%s\". [unknown] local sites count. K = %d.", hostCount, VoltDB.instance().getConfig().m_leader, kFactor));
            logLines.put("deployment2", "Unable to retrieve partition information from the cluster.");
        } else {
            int localSitesCount = sphMap.get(m_messenger.getHostId());
            logLines.put("deployment1", String.format("Cluster has %d hosts with leader hostname: \"%s\". %d local sites count. K = %d.", hostCount, VoltDB.instance().getConfig().m_leader, localSitesCount, kFactor));
            int totalSitesCount = 0;
            for (Map.Entry<Integer, Integer> e : sphMap.entrySet()) {
                totalSitesCount += e.getValue();
            }
            int replicas = kFactor + 1;
            int partitionCount = totalSitesCount / replicas;
            logLines.put("deployment2", String.format("The entire cluster has %d %s of%s %d logical partition%s.", replicas, replicas > 1 ? "copies" : "copy", partitionCount > 1 ? " each of the" : "", partitionCount, partitionCount > 1 ? "s" : ""));
        }
    }
    // voltdb root
    logLines.put("voltdbroot", "Using \"" + VoltDB.instance().getVoltDBRootPath() + "\" for voltdbroot directory.");
    // partition detection
    if (cluster.getNetworkpartition()) {
        logLines.put("partition-detection", "Detection of network partitions in the cluster is enabled.");
    } else {
        logLines.put("partition-detection", "Detection of network partitions in the cluster is not enabled.");
    }
    // security info
    if (cluster.getSecurityenabled()) {
        logLines.put("sec-enabled", "Client authentication is enabled.");
    } else {
        logLines.put("sec-enabled", "Client authentication is not enabled. Anonymous clients accepted.");
    }
    // auto snapshot info
    SnapshotSchedule ssched = database.getSnapshotschedule().get("default");
    if (ssched == null || !ssched.getEnabled()) {
        logLines.put("snapshot-schedule1", "No schedule set for automated snapshots.");
    } else {
        final String frequencyUnitString = ssched.getFrequencyunit().toLowerCase();
        final char frequencyUnit = frequencyUnitString.charAt(0);
        String msg = "[unknown frequency]";
        switch(frequencyUnit) {
            case 's':
                msg = String.valueOf(ssched.getFrequencyvalue()) + " seconds";
                break;
            case 'm':
                msg = String.valueOf(ssched.getFrequencyvalue()) + " minutes";
                break;
            case 'h':
                msg = String.valueOf(ssched.getFrequencyvalue()) + " hours";
                break;
        }
        logLines.put("snapshot-schedule1", "Automatic snapshots enabled, saved to " + VoltDB.instance().getSnapshotPath() + " and named with prefix '" + ssched.getPrefix() + "'.");
        logLines.put("snapshot-schedule2", "Database will retain a history of " + ssched.getRetain() + " snapshots, generated every " + msg + ".");
    }
    return logLines;
}
Also used : Deployment(org.voltdb.catalog.Deployment) JSONException(org.json_voltpatches.JSONException) TreeMap(java.util.TreeMap) SnapshotSchedule(org.voltdb.catalog.SnapshotSchedule) Map(java.util.Map) TreeMap(java.util.TreeMap) CatalogMap(org.voltdb.catalog.CatalogMap) SortedMap(java.util.SortedMap) KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

Example 19 with KeeperException

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

the class ZKCountdownLatch method countDown.

public void countDown(boolean expectNonZeroCount) throws InterruptedException, KeeperException {
    while (true) {
        Stat stat = new Stat();
        ByteBuffer buf = ByteBuffer.wrap(m_zk.getData(m_path, false, stat));
        int count = buf.getInt();
        if (count == 0) {
            countedDown = true;
            if (expectNonZeroCount) {
                throw new RuntimeException("Count should be > 0");
            }
            return;
        }
        count--;
        //Save a few milliseconds
        if (count == 0)
            countedDown = true;
        buf.clear();
        buf.putInt(count);
        try {
            m_zk.setData(m_path, buf.array(), stat.getVersion());
        } catch (KeeperException.BadVersionException e) {
            continue;
        }
        return;
    }
}
Also used : Stat(org.apache.zookeeper_voltpatches.data.Stat) ByteBuffer(java.nio.ByteBuffer) KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

Example 20 with KeeperException

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

the class ExportGeneration method cleanup.

private void cleanup(final HostMessenger messenger) {
    shutdown = true;
    //We need messenger NULL guard for tests.
    if (m_mbox != null && messenger != null) {
        for (Integer partition : m_dataSourcesByPartition.keySet()) {
            final String partitionDN = m_mailboxesZKPath + "/" + partition;
            String path = partitionDN + "/" + m_mbox.getHSId();
            try {
                messenger.getZK().delete(path, 0);
            } catch (InterruptedException ex) {
                ;
            } catch (KeeperException ex) {
                ;
            }
        }
        messenger.removeMailbox(m_mbox);
    }
    m_onAllSourcesDrained = null;
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KeeperException(org.apache.zookeeper_voltpatches.KeeperException)

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