Search in sources :

Example 1 with ErrorResponse

use of org.apache.zookeeper.proto.ErrorResponse in project zookeeper by apache.

the class ZooKeeper method addWatch.

/**
 * Add a watch to the given znode using the given mode. Note: not all
 * watch types can be set with this method. Only the modes available
 * in {@link AddWatchMode} can be set with this method.
 *
 * @param basePath the path that the watcher applies to
 * @param watcher the watcher
 * @param mode type of watcher to add
 * @throws InterruptedException If the server transaction is interrupted.
 * @throws KeeperException If the server signals an error with a non-zero
 *  error code.
 * @since 3.6.0
 */
public void addWatch(String basePath, Watcher watcher, AddWatchMode mode) throws KeeperException, InterruptedException {
    PathUtils.validatePath(basePath);
    validateWatcher(watcher);
    String serverPath = prependChroot(basePath);
    RequestHeader h = new RequestHeader();
    h.setType(ZooDefs.OpCode.addWatch);
    AddWatchRequest request = new AddWatchRequest(serverPath, mode.getMode());
    ReplyHeader r = cnxn.submitRequest(h, request, new ErrorResponse(), new AddWatchRegistration(watcher, basePath, mode));
    if (r.getErr() != 0) {
        throw KeeperException.create(KeeperException.Code.get(r.getErr()), basePath);
    }
}
Also used : ReplyHeader(org.apache.zookeeper.proto.ReplyHeader) RequestHeader(org.apache.zookeeper.proto.RequestHeader) AddWatchRequest(org.apache.zookeeper.proto.AddWatchRequest) ErrorResponse(org.apache.zookeeper.proto.ErrorResponse)

Example 2 with ErrorResponse

use of org.apache.zookeeper.proto.ErrorResponse in project zookeeper by apache.

the class ZooKeeper method addWatch.

/**
 * Async version of {@link #addWatch(String, Watcher, AddWatchMode)} (see it for details)
 *
 * @param basePath the path that the watcher applies to
 * @param watcher the watcher
 * @param mode type of watcher to add
 * @param cb a handler for the callback
 * @param ctx context to be provided to the callback
 * @throws IllegalArgumentException if an invalid path is specified
 * @since 3.6.0
 */
public void addWatch(String basePath, Watcher watcher, AddWatchMode mode, VoidCallback cb, Object ctx) {
    PathUtils.validatePath(basePath);
    validateWatcher(watcher);
    String serverPath = prependChroot(basePath);
    RequestHeader h = new RequestHeader();
    h.setType(ZooDefs.OpCode.addWatch);
    AddWatchRequest request = new AddWatchRequest(serverPath, mode.getMode());
    cnxn.queuePacket(h, new ReplyHeader(), request, new ErrorResponse(), cb, basePath, serverPath, ctx, new AddWatchRegistration(watcher, basePath, mode));
}
Also used : ReplyHeader(org.apache.zookeeper.proto.ReplyHeader) RequestHeader(org.apache.zookeeper.proto.RequestHeader) AddWatchRequest(org.apache.zookeeper.proto.AddWatchRequest) ErrorResponse(org.apache.zookeeper.proto.ErrorResponse)

Example 3 with ErrorResponse

use of org.apache.zookeeper.proto.ErrorResponse in project zookeeper by apache.

the class MultiResponse method deserialize.

@Override
public void deserialize(InputArchive archive, String tag) throws IOException {
    results = new ArrayList<OpResult>();
    archive.startRecord(tag);
    MultiHeader h = new MultiHeader();
    h.deserialize(archive, tag);
    while (!h.getDone()) {
        switch(h.getType()) {
            case ZooDefs.OpCode.create:
                CreateResponse cr = new CreateResponse();
                cr.deserialize(archive, tag);
                results.add(new OpResult.CreateResult(cr.getPath()));
                break;
            case ZooDefs.OpCode.create2:
                Create2Response cr2 = new Create2Response();
                cr2.deserialize(archive, tag);
                results.add(new OpResult.CreateResult(cr2.getPath(), cr2.getStat()));
                break;
            case ZooDefs.OpCode.delete:
                results.add(new OpResult.DeleteResult());
                break;
            case ZooDefs.OpCode.setData:
                SetDataResponse sdr = new SetDataResponse();
                sdr.deserialize(archive, tag);
                results.add(new OpResult.SetDataResult(sdr.getStat()));
                break;
            case ZooDefs.OpCode.check:
                results.add(new OpResult.CheckResult());
                break;
            case ZooDefs.OpCode.getChildren:
                GetChildrenResponse gcr = new GetChildrenResponse();
                gcr.deserialize(archive, tag);
                results.add(new OpResult.GetChildrenResult(gcr.getChildren()));
                break;
            case ZooDefs.OpCode.getData:
                GetDataResponse gdr = new GetDataResponse();
                gdr.deserialize(archive, tag);
                results.add(new OpResult.GetDataResult(gdr.getData(), gdr.getStat()));
                break;
            case ZooDefs.OpCode.error:
                // TODO: need way to more cleanly serialize/deserialize exceptions
                ErrorResponse er = new ErrorResponse();
                er.deserialize(archive, tag);
                results.add(new OpResult.ErrorResult(er.getErr()));
                break;
            default:
                throw new IOException("Invalid type " + h.getType() + " in MultiResponse");
        }
        h.deserialize(archive, tag);
    }
    archive.endRecord(tag);
}
Also used : CreateResponse(org.apache.zookeeper.proto.CreateResponse) IOException(java.io.IOException) Create2Response(org.apache.zookeeper.proto.Create2Response) SetDataResponse(org.apache.zookeeper.proto.SetDataResponse) MultiHeader(org.apache.zookeeper.proto.MultiHeader) ErrorResponse(org.apache.zookeeper.proto.ErrorResponse) GetChildrenResponse(org.apache.zookeeper.proto.GetChildrenResponse) GetDataResponse(org.apache.zookeeper.proto.GetDataResponse)

Example 4 with ErrorResponse

use of org.apache.zookeeper.proto.ErrorResponse in project zookeeper by apache.

the class MultiResponse method serialize.

@Override
public void serialize(OutputArchive archive, String tag) throws IOException {
    archive.startRecord(this, tag);
    for (OpResult result : results) {
        int err = result.getType() == ZooDefs.OpCode.error ? ((OpResult.ErrorResult) result).getErr() : 0;
        new MultiHeader(result.getType(), false, err).serialize(archive, tag);
        switch(result.getType()) {
            case ZooDefs.OpCode.create:
                new CreateResponse(((OpResult.CreateResult) result).getPath()).serialize(archive, tag);
                break;
            case ZooDefs.OpCode.create2:
                OpResult.CreateResult createResult = (OpResult.CreateResult) result;
                new Create2Response(createResult.getPath(), createResult.getStat()).serialize(archive, tag);
                break;
            case ZooDefs.OpCode.delete:
            case ZooDefs.OpCode.check:
                break;
            case ZooDefs.OpCode.setData:
                new SetDataResponse(((OpResult.SetDataResult) result).getStat()).serialize(archive, tag);
                break;
            case ZooDefs.OpCode.getChildren:
                new GetChildrenResponse(((OpResult.GetChildrenResult) result).getChildren()).serialize(archive, tag);
                break;
            case ZooDefs.OpCode.getData:
                new GetDataResponse(((OpResult.GetDataResult) result).getData(), ((OpResult.GetDataResult) result).getStat()).serialize(archive, tag);
                break;
            case ZooDefs.OpCode.error:
                new ErrorResponse(((OpResult.ErrorResult) result).getErr()).serialize(archive, tag);
                break;
            default:
                throw new IOException("Invalid type " + result.getType() + " in MultiResponse");
        }
    }
    new MultiHeader(-1, true, -1).serialize(archive, tag);
    archive.endRecord(this, tag);
}
Also used : CreateResponse(org.apache.zookeeper.proto.CreateResponse) IOException(java.io.IOException) Create2Response(org.apache.zookeeper.proto.Create2Response) SetDataResponse(org.apache.zookeeper.proto.SetDataResponse) MultiHeader(org.apache.zookeeper.proto.MultiHeader) ErrorResponse(org.apache.zookeeper.proto.ErrorResponse) GetChildrenResponse(org.apache.zookeeper.proto.GetChildrenResponse) GetDataResponse(org.apache.zookeeper.proto.GetDataResponse)

Example 5 with ErrorResponse

use of org.apache.zookeeper.proto.ErrorResponse in project zookeeper by apache.

the class FinalRequestProcessor method processRequest.

public void processRequest(Request request) {
    LOG.debug("Processing request:: {}", request);
    if (LOG.isTraceEnabled()) {
        long traceMask = ZooTrace.CLIENT_REQUEST_TRACE_MASK;
        if (request.type == OpCode.ping) {
            traceMask = ZooTrace.SERVER_PING_TRACE_MASK;
        }
        ZooTrace.logRequest(LOG, traceMask, 'E', request, "");
    }
    ProcessTxnResult rc = null;
    if (!request.isThrottled()) {
        rc = applyRequest(request);
    }
    if (request.cnxn == null) {
        return;
    }
    ServerCnxn cnxn = request.cnxn;
    long lastZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid();
    String lastOp = "NA";
    // Notify ZooKeeperServer that the request has finished so that it can
    // update any request accounting/throttling limits
    zks.decInProcess();
    zks.requestFinished(request);
    Code err = Code.OK;
    Record rsp = null;
    String path = null;
    int responseSize = 0;
    try {
        if (request.getHdr() != null && request.getHdr().getType() == OpCode.error) {
            AuditHelper.addAuditLog(request, rc, true);
            /*
                 * When local session upgrading is disabled, leader will
                 * reject the ephemeral node creation due to session expire.
                 * However, if this is the follower that issue the request,
                 * it will have the correct error code, so we should use that
                 * and report to user
                 */
            if (request.getException() != null) {
                throw request.getException();
            } else {
                throw KeeperException.create(KeeperException.Code.get(((ErrorTxn) request.getTxn()).getErr()));
            }
        }
        KeeperException ke = request.getException();
        if (ke instanceof SessionMovedException) {
            throw ke;
        }
        if (ke != null && request.type != OpCode.multi) {
            throw ke;
        }
        LOG.debug("{}", request);
        if (request.isStale()) {
            ServerMetrics.getMetrics().STALE_REPLIES.add(1);
        }
        if (request.isThrottled()) {
            throw KeeperException.create(Code.THROTTLEDOP);
        }
        AuditHelper.addAuditLog(request, rc);
        switch(request.type) {
            case OpCode.ping:
                {
                    lastOp = "PING";
                    updateStats(request, lastOp, lastZxid);
                    responseSize = cnxn.sendResponse(new ReplyHeader(ClientCnxn.PING_XID, lastZxid, 0), null, "response");
                    return;
                }
            case OpCode.createSession:
                {
                    lastOp = "SESS";
                    updateStats(request, lastOp, lastZxid);
                    zks.finishSessionInit(request.cnxn, true);
                    return;
                }
            case OpCode.multi:
                {
                    lastOp = "MULT";
                    rsp = new MultiResponse();
                    for (ProcessTxnResult subTxnResult : rc.multiResult) {
                        OpResult subResult;
                        switch(subTxnResult.type) {
                            case OpCode.check:
                                subResult = new CheckResult();
                                break;
                            case OpCode.create:
                                subResult = new CreateResult(subTxnResult.path);
                                break;
                            case OpCode.create2:
                            case OpCode.createTTL:
                            case OpCode.createContainer:
                                subResult = new CreateResult(subTxnResult.path, subTxnResult.stat);
                                break;
                            case OpCode.delete:
                            case OpCode.deleteContainer:
                                subResult = new DeleteResult();
                                break;
                            case OpCode.setData:
                                subResult = new SetDataResult(subTxnResult.stat);
                                break;
                            case OpCode.error:
                                subResult = new ErrorResult(subTxnResult.err);
                                if (subTxnResult.err == Code.SESSIONMOVED.intValue()) {
                                    throw new SessionMovedException();
                                }
                                break;
                            default:
                                throw new IOException("Invalid type of op");
                        }
                        ((MultiResponse) rsp).add(subResult);
                    }
                    break;
                }
            case OpCode.multiRead:
                {
                    lastOp = "MLTR";
                    MultiOperationRecord multiReadRecord = new MultiOperationRecord();
                    ByteBufferInputStream.byteBuffer2Record(request.request, multiReadRecord);
                    rsp = new MultiResponse();
                    OpResult subResult;
                    for (Op readOp : multiReadRecord) {
                        try {
                            Record rec;
                            switch(readOp.getType()) {
                                case OpCode.getChildren:
                                    rec = handleGetChildrenRequest(readOp.toRequestRecord(), cnxn, request.authInfo);
                                    subResult = new GetChildrenResult(((GetChildrenResponse) rec).getChildren());
                                    break;
                                case OpCode.getData:
                                    rec = handleGetDataRequest(readOp.toRequestRecord(), cnxn, request.authInfo);
                                    GetDataResponse gdr = (GetDataResponse) rec;
                                    subResult = new GetDataResult(gdr.getData(), gdr.getStat());
                                    break;
                                default:
                                    throw new IOException("Invalid type of readOp");
                            }
                        } catch (KeeperException e) {
                            subResult = new ErrorResult(e.code().intValue());
                        }
                        ((MultiResponse) rsp).add(subResult);
                    }
                    break;
                }
            case OpCode.create:
                {
                    lastOp = "CREA";
                    rsp = new CreateResponse(rc.path);
                    err = Code.get(rc.err);
                    requestPathMetricsCollector.registerRequest(request.type, rc.path);
                    break;
                }
            case OpCode.create2:
            case OpCode.createTTL:
            case OpCode.createContainer:
                {
                    lastOp = "CREA";
                    rsp = new Create2Response(rc.path, rc.stat);
                    err = Code.get(rc.err);
                    requestPathMetricsCollector.registerRequest(request.type, rc.path);
                    break;
                }
            case OpCode.delete:
            case OpCode.deleteContainer:
                {
                    lastOp = "DELE";
                    err = Code.get(rc.err);
                    requestPathMetricsCollector.registerRequest(request.type, rc.path);
                    break;
                }
            case OpCode.setData:
                {
                    lastOp = "SETD";
                    rsp = new SetDataResponse(rc.stat);
                    err = Code.get(rc.err);
                    requestPathMetricsCollector.registerRequest(request.type, rc.path);
                    break;
                }
            case OpCode.reconfig:
                {
                    lastOp = "RECO";
                    rsp = new GetDataResponse(((QuorumZooKeeperServer) zks).self.getQuorumVerifier().toString().getBytes(UTF_8), rc.stat);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.setACL:
                {
                    lastOp = "SETA";
                    rsp = new SetACLResponse(rc.stat);
                    err = Code.get(rc.err);
                    requestPathMetricsCollector.registerRequest(request.type, rc.path);
                    break;
                }
            case OpCode.closeSession:
                {
                    lastOp = "CLOS";
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.sync:
                {
                    lastOp = "SYNC";
                    SyncRequest syncRequest = new SyncRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, syncRequest);
                    rsp = new SyncResponse(syncRequest.getPath());
                    requestPathMetricsCollector.registerRequest(request.type, syncRequest.getPath());
                    break;
                }
            case OpCode.check:
                {
                    lastOp = "CHEC";
                    rsp = new SetDataResponse(rc.stat);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.exists:
                {
                    lastOp = "EXIS";
                    // TODO we need to figure out the security requirement for this!
                    ExistsRequest existsRequest = new ExistsRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, existsRequest);
                    path = existsRequest.getPath();
                    if (path.indexOf('\0') != -1) {
                        throw new KeeperException.BadArgumentsException();
                    }
                    Stat stat = zks.getZKDatabase().statNode(path, existsRequest.getWatch() ? cnxn : null);
                    rsp = new ExistsResponse(stat);
                    requestPathMetricsCollector.registerRequest(request.type, path);
                    break;
                }
            case OpCode.getData:
                {
                    lastOp = "GETD";
                    GetDataRequest getDataRequest = new GetDataRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getDataRequest);
                    path = getDataRequest.getPath();
                    rsp = handleGetDataRequest(getDataRequest, cnxn, request.authInfo);
                    requestPathMetricsCollector.registerRequest(request.type, path);
                    break;
                }
            case OpCode.setWatches:
                {
                    lastOp = "SETW";
                    SetWatches setWatches = new SetWatches();
                    // TODO we really should not need this
                    request.request.rewind();
                    ByteBufferInputStream.byteBuffer2Record(request.request, setWatches);
                    long relativeZxid = setWatches.getRelativeZxid();
                    zks.getZKDatabase().setWatches(relativeZxid, setWatches.getDataWatches(), setWatches.getExistWatches(), setWatches.getChildWatches(), Collections.emptyList(), Collections.emptyList(), cnxn);
                    break;
                }
            case OpCode.setWatches2:
                {
                    lastOp = "STW2";
                    SetWatches2 setWatches = new SetWatches2();
                    // TODO we really should not need this
                    request.request.rewind();
                    ByteBufferInputStream.byteBuffer2Record(request.request, setWatches);
                    long relativeZxid = setWatches.getRelativeZxid();
                    zks.getZKDatabase().setWatches(relativeZxid, setWatches.getDataWatches(), setWatches.getExistWatches(), setWatches.getChildWatches(), setWatches.getPersistentWatches(), setWatches.getPersistentRecursiveWatches(), cnxn);
                    break;
                }
            case OpCode.addWatch:
                {
                    lastOp = "ADDW";
                    AddWatchRequest addWatcherRequest = new AddWatchRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, addWatcherRequest);
                    zks.getZKDatabase().addWatch(addWatcherRequest.getPath(), cnxn, addWatcherRequest.getMode());
                    rsp = new ErrorResponse(0);
                    break;
                }
            case OpCode.getACL:
                {
                    lastOp = "GETA";
                    GetACLRequest getACLRequest = new GetACLRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getACLRequest);
                    path = getACLRequest.getPath();
                    DataNode n = zks.getZKDatabase().getNode(path);
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    zks.checkACL(request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.READ | ZooDefs.Perms.ADMIN, request.authInfo, path, null);
                    Stat stat = new Stat();
                    List<ACL> acl = zks.getZKDatabase().getACL(path, stat);
                    requestPathMetricsCollector.registerRequest(request.type, getACLRequest.getPath());
                    try {
                        zks.checkACL(request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.ADMIN, request.authInfo, path, null);
                        rsp = new GetACLResponse(acl, stat);
                    } catch (KeeperException.NoAuthException e) {
                        List<ACL> acl1 = new ArrayList<ACL>(acl.size());
                        for (ACL a : acl) {
                            if ("digest".equals(a.getId().getScheme())) {
                                Id id = a.getId();
                                Id id1 = new Id(id.getScheme(), id.getId().replaceAll(":.*", ":x"));
                                acl1.add(new ACL(a.getPerms(), id1));
                            } else {
                                acl1.add(a);
                            }
                        }
                        rsp = new GetACLResponse(acl1, stat);
                    }
                    break;
                }
            case OpCode.getChildren:
                {
                    lastOp = "GETC";
                    GetChildrenRequest getChildrenRequest = new GetChildrenRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getChildrenRequest);
                    path = getChildrenRequest.getPath();
                    rsp = handleGetChildrenRequest(getChildrenRequest, cnxn, request.authInfo);
                    requestPathMetricsCollector.registerRequest(request.type, path);
                    break;
                }
            case OpCode.getAllChildrenNumber:
                {
                    lastOp = "GETACN";
                    GetAllChildrenNumberRequest getAllChildrenNumberRequest = new GetAllChildrenNumberRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getAllChildrenNumberRequest);
                    path = getAllChildrenNumberRequest.getPath();
                    DataNode n = zks.getZKDatabase().getNode(path);
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    zks.checkACL(request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.READ, request.authInfo, path, null);
                    int number = zks.getZKDatabase().getAllChildrenNumber(path);
                    rsp = new GetAllChildrenNumberResponse(number);
                    break;
                }
            case OpCode.getChildren2:
                {
                    lastOp = "GETC";
                    GetChildren2Request getChildren2Request = new GetChildren2Request();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getChildren2Request);
                    Stat stat = new Stat();
                    path = getChildren2Request.getPath();
                    DataNode n = zks.getZKDatabase().getNode(path);
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    zks.checkACL(request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.READ, request.authInfo, path, null);
                    List<String> children = zks.getZKDatabase().getChildren(path, stat, getChildren2Request.getWatch() ? cnxn : null);
                    rsp = new GetChildren2Response(children, stat);
                    requestPathMetricsCollector.registerRequest(request.type, path);
                    break;
                }
            case OpCode.checkWatches:
                {
                    lastOp = "CHKW";
                    CheckWatchesRequest checkWatches = new CheckWatchesRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, checkWatches);
                    WatcherType type = WatcherType.fromInt(checkWatches.getType());
                    path = checkWatches.getPath();
                    boolean containsWatcher = zks.getZKDatabase().containsWatcher(path, type, cnxn);
                    if (!containsWatcher) {
                        String msg = String.format(Locale.ENGLISH, "%s (type: %s)", path, type);
                        throw new KeeperException.NoWatcherException(msg);
                    }
                    requestPathMetricsCollector.registerRequest(request.type, checkWatches.getPath());
                    break;
                }
            case OpCode.removeWatches:
                {
                    lastOp = "REMW";
                    RemoveWatchesRequest removeWatches = new RemoveWatchesRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, removeWatches);
                    WatcherType type = WatcherType.fromInt(removeWatches.getType());
                    path = removeWatches.getPath();
                    boolean removed = zks.getZKDatabase().removeWatch(path, type, cnxn);
                    if (!removed) {
                        String msg = String.format(Locale.ENGLISH, "%s (type: %s)", path, type);
                        throw new KeeperException.NoWatcherException(msg);
                    }
                    requestPathMetricsCollector.registerRequest(request.type, removeWatches.getPath());
                    break;
                }
            case OpCode.whoAmI:
                {
                    lastOp = "HOMI";
                    rsp = new WhoAmIResponse(AuthUtil.getClientInfos(request.authInfo));
                    break;
                }
            case OpCode.getEphemerals:
                {
                    lastOp = "GETE";
                    GetEphemeralsRequest getEphemerals = new GetEphemeralsRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getEphemerals);
                    String prefixPath = getEphemerals.getPrefixPath();
                    Set<String> allEphems = zks.getZKDatabase().getDataTree().getEphemerals(request.sessionId);
                    List<String> ephemerals = new ArrayList<>();
                    if (prefixPath == null || prefixPath.trim().isEmpty() || "/".equals(prefixPath.trim())) {
                        ephemerals.addAll(allEphems);
                    } else {
                        for (String p : allEphems) {
                            if (p.startsWith(prefixPath)) {
                                ephemerals.add(p);
                            }
                        }
                    }
                    rsp = new GetEphemeralsResponse(ephemerals);
                    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(String.format("%02x", (0xff & bb.get())));
        }
        LOG.error("Dumping request buffer for request type {}: 0x{}", Request.op2String(request.type), sb);
        err = Code.MARSHALLINGERROR;
    }
    ReplyHeader hdr = new ReplyHeader(request.cxid, lastZxid, err.intValue());
    updateStats(request, lastOp, lastZxid);
    try {
        if (path == null || rsp == null) {
            responseSize = cnxn.sendResponse(hdr, rsp, "response");
        } else {
            int opCode = request.type;
            Stat stat = null;
            // so these values are passed along with the response.
            switch(opCode) {
                case OpCode.getData:
                    {
                        GetDataResponse getDataResponse = (GetDataResponse) rsp;
                        stat = getDataResponse.getStat();
                        responseSize = cnxn.sendResponse(hdr, rsp, "response", path, stat, opCode);
                        break;
                    }
                case OpCode.getChildren2:
                    {
                        GetChildren2Response getChildren2Response = (GetChildren2Response) rsp;
                        stat = getChildren2Response.getStat();
                        responseSize = cnxn.sendResponse(hdr, rsp, "response", path, stat, opCode);
                        break;
                    }
                default:
                    responseSize = cnxn.sendResponse(hdr, rsp, "response");
            }
        }
        if (request.type == OpCode.closeSession) {
            cnxn.sendCloseSession();
        }
    } catch (IOException e) {
        LOG.error("FIXMSG", e);
    } finally {
        ServerMetrics.getMetrics().RESPONSE_BYTES.add(responseSize);
    }
}
Also used : Op(org.apache.zookeeper.Op) MultiResponse(org.apache.zookeeper.MultiResponse) WatcherType(org.apache.zookeeper.Watcher.WatcherType) GetChildrenResult(org.apache.zookeeper.OpResult.GetChildrenResult) CreateResponse(org.apache.zookeeper.proto.CreateResponse) GetACLRequest(org.apache.zookeeper.proto.GetACLRequest) ErrorResult(org.apache.zookeeper.OpResult.ErrorResult) ArrayList(java.util.ArrayList) ProcessTxnResult(org.apache.zookeeper.server.DataTree.ProcessTxnResult) GetACLResponse(org.apache.zookeeper.proto.GetACLResponse) SetACLResponse(org.apache.zookeeper.proto.SetACLResponse) WhoAmIResponse(org.apache.zookeeper.proto.WhoAmIResponse) SetWatches2(org.apache.zookeeper.proto.SetWatches2) CreateResult(org.apache.zookeeper.OpResult.CreateResult) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) OpResult(org.apache.zookeeper.OpResult) CheckResult(org.apache.zookeeper.OpResult.CheckResult) List(java.util.List) ArrayList(java.util.ArrayList) GetChildren2Response(org.apache.zookeeper.proto.GetChildren2Response) GetChildren2Request(org.apache.zookeeper.proto.GetChildren2Request) Code(org.apache.zookeeper.KeeperException.Code) OpCode(org.apache.zookeeper.ZooDefs.OpCode) AddWatchRequest(org.apache.zookeeper.proto.AddWatchRequest) GetEphemeralsRequest(org.apache.zookeeper.proto.GetEphemeralsRequest) GetEphemeralsResponse(org.apache.zookeeper.proto.GetEphemeralsResponse) SyncRequest(org.apache.zookeeper.proto.SyncRequest) SetWatches(org.apache.zookeeper.proto.SetWatches) SessionMovedException(org.apache.zookeeper.KeeperException.SessionMovedException) GetDataResponse(org.apache.zookeeper.proto.GetDataResponse) Id(org.apache.zookeeper.data.Id) KeeperException(org.apache.zookeeper.KeeperException) DeleteResult(org.apache.zookeeper.OpResult.DeleteResult) ExistsResponse(org.apache.zookeeper.proto.ExistsResponse) GetAllChildrenNumberResponse(org.apache.zookeeper.proto.GetAllChildrenNumberResponse) Set(java.util.Set) GetDataResult(org.apache.zookeeper.OpResult.GetDataResult) Create2Response(org.apache.zookeeper.proto.Create2Response) SetDataResponse(org.apache.zookeeper.proto.SetDataResponse) RemoveWatchesRequest(org.apache.zookeeper.proto.RemoveWatchesRequest) GetDataRequest(org.apache.zookeeper.proto.GetDataRequest) SetDataResult(org.apache.zookeeper.OpResult.SetDataResult) QuorumZooKeeperServer(org.apache.zookeeper.server.quorum.QuorumZooKeeperServer) Stat(org.apache.zookeeper.data.Stat) SyncResponse(org.apache.zookeeper.proto.SyncResponse) Record(org.apache.jute.Record) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) GetAllChildrenNumberRequest(org.apache.zookeeper.proto.GetAllChildrenNumberRequest) ReplyHeader(org.apache.zookeeper.proto.ReplyHeader) ExistsRequest(org.apache.zookeeper.proto.ExistsRequest) GetChildrenRequest(org.apache.zookeeper.proto.GetChildrenRequest) ACL(org.apache.zookeeper.data.ACL) IOException(java.io.IOException) CheckWatchesRequest(org.apache.zookeeper.proto.CheckWatchesRequest) ByteBuffer(java.nio.ByteBuffer) SessionMovedException(org.apache.zookeeper.KeeperException.SessionMovedException) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException) ErrorResponse(org.apache.zookeeper.proto.ErrorResponse) ErrorTxn(org.apache.zookeeper.txn.ErrorTxn)

Aggregations

ErrorResponse (org.apache.zookeeper.proto.ErrorResponse)5 IOException (java.io.IOException)3 AddWatchRequest (org.apache.zookeeper.proto.AddWatchRequest)3 Create2Response (org.apache.zookeeper.proto.Create2Response)3 CreateResponse (org.apache.zookeeper.proto.CreateResponse)3 GetDataResponse (org.apache.zookeeper.proto.GetDataResponse)3 ReplyHeader (org.apache.zookeeper.proto.ReplyHeader)3 SetDataResponse (org.apache.zookeeper.proto.SetDataResponse)3 GetChildrenResponse (org.apache.zookeeper.proto.GetChildrenResponse)2 MultiHeader (org.apache.zookeeper.proto.MultiHeader)2 ByteBuffer (java.nio.ByteBuffer)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Set (java.util.Set)1 Record (org.apache.jute.Record)1 KeeperException (org.apache.zookeeper.KeeperException)1 Code (org.apache.zookeeper.KeeperException.Code)1 SessionMovedException (org.apache.zookeeper.KeeperException.SessionMovedException)1 MultiOperationRecord (org.apache.zookeeper.MultiOperationRecord)1 MultiResponse (org.apache.zookeeper.MultiResponse)1