Search in sources :

Example 1 with MultiOperationRecord

use of org.apache.zookeeper.MultiOperationRecord in project zookeeper by apache.

the class QuorumZooKeeperServer method checkUpgradeSession.

public Request checkUpgradeSession(Request request) throws IOException, KeeperException {
    if (request.isThrottled()) {
        return null;
    }
    // So will not be called concurrently by two threads.
    if ((request.type != OpCode.create && request.type != OpCode.create2 && request.type != OpCode.multi) || !upgradeableSessionTracker.isLocalSession(request.sessionId)) {
        return null;
    }
    if (OpCode.multi == request.type) {
        MultiOperationRecord multiTransactionRecord = new MultiOperationRecord();
        request.request.rewind();
        ByteBufferInputStream.byteBuffer2Record(request.request, multiTransactionRecord);
        request.request.rewind();
        boolean containsEphemeralCreate = false;
        for (Op op : multiTransactionRecord) {
            if (op.getType() == OpCode.create || op.getType() == OpCode.create2) {
                CreateRequest createRequest = (CreateRequest) op.toRequestRecord();
                CreateMode createMode = CreateMode.fromFlag(createRequest.getFlags());
                if (createMode.isEphemeral()) {
                    containsEphemeralCreate = true;
                    break;
                }
            }
        }
        if (!containsEphemeralCreate) {
            return null;
        }
    } else {
        CreateRequest createRequest = new CreateRequest();
        request.request.rewind();
        ByteBufferInputStream.byteBuffer2Record(request.request, createRequest);
        request.request.rewind();
        CreateMode createMode = CreateMode.fromFlag(createRequest.getFlags());
        if (!createMode.isEphemeral()) {
            return null;
        }
    }
    // Uh oh.  We need to upgrade before we can proceed.
    if (!self.isLocalSessionsUpgradingEnabled()) {
        throw new KeeperException.EphemeralOnLocalSessionException();
    }
    return makeUpgradeRequest(request.sessionId);
}
Also used : Op(org.apache.zookeeper.Op) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) CreateMode(org.apache.zookeeper.CreateMode) CreateRequest(org.apache.zookeeper.proto.CreateRequest)

Example 2 with MultiOperationRecord

use of org.apache.zookeeper.MultiOperationRecord in project zookeeper by apache.

the class PrepRequestProcessor method pRequestHelper.

/**
 * This method is a helper to pRequest method
 *
 * @param request
 */
private void pRequestHelper(Request request) throws RequestProcessorException {
    try {
        switch(request.type) {
            case OpCode.createContainer:
            case OpCode.create:
            case OpCode.create2:
                CreateRequest create2Request = new CreateRequest();
                pRequest2Txn(request.type, zks.getNextZxid(), request, create2Request, true);
                break;
            case OpCode.createTTL:
                CreateTTLRequest createTtlRequest = new CreateTTLRequest();
                pRequest2Txn(request.type, zks.getNextZxid(), request, createTtlRequest, true);
                break;
            case OpCode.deleteContainer:
            case OpCode.delete:
                DeleteRequest deleteRequest = new DeleteRequest();
                pRequest2Txn(request.type, zks.getNextZxid(), request, deleteRequest, true);
                break;
            case OpCode.setData:
                SetDataRequest setDataRequest = new SetDataRequest();
                pRequest2Txn(request.type, zks.getNextZxid(), request, setDataRequest, true);
                break;
            case OpCode.reconfig:
                ReconfigRequest reconfigRequest = new ReconfigRequest();
                ByteBufferInputStream.byteBuffer2Record(request.request, reconfigRequest);
                pRequest2Txn(request.type, zks.getNextZxid(), request, reconfigRequest, true);
                break;
            case OpCode.setACL:
                SetACLRequest setAclRequest = new SetACLRequest();
                pRequest2Txn(request.type, zks.getNextZxid(), request, setAclRequest, true);
                break;
            case OpCode.check:
                CheckVersionRequest checkRequest = new CheckVersionRequest();
                pRequest2Txn(request.type, zks.getNextZxid(), request, checkRequest, true);
                break;
            case OpCode.multi:
                MultiOperationRecord multiRequest = new MultiOperationRecord();
                try {
                    ByteBufferInputStream.byteBuffer2Record(request.request, multiRequest);
                } catch (IOException e) {
                    request.setHdr(new TxnHeader(request.sessionId, request.cxid, zks.getNextZxid(), Time.currentWallTime(), OpCode.multi));
                    throw e;
                }
                List<Txn> txns = new ArrayList<Txn>();
                // Each op in a multi-op must have the same zxid!
                long zxid = zks.getNextZxid();
                KeeperException ke = null;
                // Store off current pending change records in case we need to rollback
                Map<String, ChangeRecord> pendingChanges = getPendingChanges(multiRequest);
                request.setHdr(new TxnHeader(request.sessionId, request.cxid, zxid, Time.currentWallTime(), request.type));
                for (Op op : multiRequest) {
                    Record subrequest = op.toRequestRecord();
                    int type;
                    Record txn;
                    /* If we've already failed one of the ops, don't bother
                     * trying the rest as we know it's going to fail and it
                     * would be confusing in the logfiles.
                     */
                    if (ke != null) {
                        type = OpCode.error;
                        txn = new ErrorTxn(Code.RUNTIMEINCONSISTENCY.intValue());
                    } else {
                        /* Prep the request and convert to a Txn */
                        try {
                            pRequest2Txn(op.getType(), zxid, request, subrequest, false);
                            type = op.getType();
                            txn = request.getTxn();
                        } catch (KeeperException e) {
                            ke = e;
                            type = OpCode.error;
                            txn = new ErrorTxn(e.code().intValue());
                            if (e.code().intValue() > Code.APIERROR.intValue()) {
                                LOG.info("Got user-level KeeperException when processing {} aborting" + " remaining multi ops. Error Path:{} Error:{}", request.toString(), e.getPath(), e.getMessage());
                            }
                            request.setException(e);
                            /* Rollback change records from failed multi-op */
                            rollbackPendingChanges(zxid, pendingChanges);
                        }
                    }
                    // not sure how else to get the txn stored into our list.
                    try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
                        BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos);
                        txn.serialize(boa, "request");
                        ByteBuffer bb = ByteBuffer.wrap(baos.toByteArray());
                        txns.add(new Txn(type, bb.array()));
                    }
                }
                request.setTxn(new MultiTxn(txns));
                if (digestEnabled) {
                    setTxnDigest(request);
                }
                break;
            // create/close session don't require request record
            case OpCode.createSession:
            case OpCode.closeSession:
                if (!request.isLocalSession()) {
                    pRequest2Txn(request.type, zks.getNextZxid(), request, null, true);
                }
                break;
            // All the rest don't need to create a Txn - just verify session
            case OpCode.sync:
            case OpCode.exists:
            case OpCode.getData:
            case OpCode.getACL:
            case OpCode.getChildren:
            case OpCode.getAllChildrenNumber:
            case OpCode.getChildren2:
            case OpCode.ping:
            case OpCode.setWatches:
            case OpCode.setWatches2:
            case OpCode.checkWatches:
            case OpCode.removeWatches:
            case OpCode.getEphemerals:
            case OpCode.multiRead:
            case OpCode.addWatch:
            case OpCode.whoAmI:
                zks.sessionTracker.checkSession(request.sessionId, request.getOwner());
                break;
            default:
                LOG.warn("unknown type {}", request.type);
                break;
        }
    } catch (KeeperException e) {
        if (request.getHdr() != null) {
            request.getHdr().setType(OpCode.error);
            request.setTxn(new ErrorTxn(e.code().intValue()));
        }
        if (e.code().intValue() > Code.APIERROR.intValue()) {
            LOG.info("Got user-level KeeperException when processing {} Error Path:{} Error:{}", request.toString(), e.getPath(), 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(String.format("%02x", (0xff & bb.get())));
            }
        } else {
            sb.append("request buffer is null");
        }
        LOG.error("Dumping request buffer for request type {}: 0x{}", Request.op2String(request.type), sb);
        if (request.getHdr() != null) {
            request.getHdr().setType(OpCode.error);
            request.setTxn(new ErrorTxn(Code.MARSHALLINGERROR.intValue()));
        }
    }
}
Also used : Op(org.apache.zookeeper.Op) BinaryOutputArchive(org.apache.jute.BinaryOutputArchive) CheckVersionRequest(org.apache.zookeeper.proto.CheckVersionRequest) MultiTxn(org.apache.zookeeper.txn.MultiTxn) CreateRequest(org.apache.zookeeper.proto.CreateRequest) ArrayList(java.util.ArrayList) SetDataTxn(org.apache.zookeeper.txn.SetDataTxn) CreateSessionTxn(org.apache.zookeeper.txn.CreateSessionTxn) CreateTxn(org.apache.zookeeper.txn.CreateTxn) CreateTTLTxn(org.apache.zookeeper.txn.CreateTTLTxn) DeleteTxn(org.apache.zookeeper.txn.DeleteTxn) CreateContainerTxn(org.apache.zookeeper.txn.CreateContainerTxn) SetACLTxn(org.apache.zookeeper.txn.SetACLTxn) CheckVersionTxn(org.apache.zookeeper.txn.CheckVersionTxn) Txn(org.apache.zookeeper.txn.Txn) MultiTxn(org.apache.zookeeper.txn.MultiTxn) ErrorTxn(org.apache.zookeeper.txn.ErrorTxn) CloseSessionTxn(org.apache.zookeeper.txn.CloseSessionTxn) ReconfigRequest(org.apache.zookeeper.proto.ReconfigRequest) CreateTTLRequest(org.apache.zookeeper.proto.CreateTTLRequest) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) Record(org.apache.jute.Record) ChangeRecord(org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) SetACLRequest(org.apache.zookeeper.proto.SetACLRequest) SetDataRequest(org.apache.zookeeper.proto.SetDataRequest) IOException(java.io.IOException) ByteArrayOutputStream(java.io.ByteArrayOutputStream) ByteBuffer(java.nio.ByteBuffer) BadArgumentsException(org.apache.zookeeper.KeeperException.BadArgumentsException) ConfigException(org.apache.zookeeper.server.quorum.QuorumPeerConfig.ConfigException) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException) ErrorTxn(org.apache.zookeeper.txn.ErrorTxn) DeleteRequest(org.apache.zookeeper.proto.DeleteRequest) ChangeRecord(org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord) KeeperException(org.apache.zookeeper.KeeperException) TxnHeader(org.apache.zookeeper.txn.TxnHeader)

Example 3 with MultiOperationRecord

use of org.apache.zookeeper.MultiOperationRecord in project zookeeper by apache.

the class AuditHelper method getCreateModes.

private static Map<String, String> getCreateModes(Request request) throws IOException, KeeperException {
    Map<String, String> createModes = new HashMap<>();
    if (!ZKAuditProvider.isAuditEnabled()) {
        return createModes;
    }
    MultiOperationRecord multiRequest = new MultiOperationRecord();
    deserialize(request, multiRequest);
    for (Op op : multiRequest) {
        if (op.getType() == ZooDefs.OpCode.create || op.getType() == ZooDefs.OpCode.create2 || op.getType() == ZooDefs.OpCode.createContainer) {
            CreateRequest requestRecord = (CreateRequest) op.toRequestRecord();
            createModes.put(requestRecord.getPath(), getCreateMode(requestRecord));
        }
    }
    return createModes;
}
Also used : Op(org.apache.zookeeper.Op) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) HashMap(java.util.HashMap) CreateRequest(org.apache.zookeeper.proto.CreateRequest)

Example 4 with MultiOperationRecord

use of org.apache.zookeeper.MultiOperationRecord 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)

Example 5 with MultiOperationRecord

use of org.apache.zookeeper.MultiOperationRecord in project zookeeper by apache.

the class PrepRequestProcessorTest method process.

private void process(List<Op> ops) throws Exception {
    pLatch = new CountDownLatch(1);
    processor = new PrepRequestProcessor(zks, new MyRequestProcessor());
    Record record = new MultiOperationRecord(ops);
    Request req = createRequest(record, OpCode.multi, false);
    processor.pRequest(req);
    assertTrue(pLatch.await(5, TimeUnit.SECONDS), "request hasn't been processed in chain");
}
Also used : MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) CreateRequest(org.apache.zookeeper.proto.CreateRequest) SetDataRequest(org.apache.zookeeper.proto.SetDataRequest) ReconfigRequest(org.apache.zookeeper.proto.ReconfigRequest) Record(org.apache.jute.Record) ChangeRecord(org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord) MultiOperationRecord(org.apache.zookeeper.MultiOperationRecord) CountDownLatch(java.util.concurrent.CountDownLatch)

Aggregations

MultiOperationRecord (org.apache.zookeeper.MultiOperationRecord)5 Op (org.apache.zookeeper.Op)4 CreateRequest (org.apache.zookeeper.proto.CreateRequest)4 Record (org.apache.jute.Record)3 IOException (java.io.IOException)2 ByteBuffer (java.nio.ByteBuffer)2 ArrayList (java.util.ArrayList)2 KeeperException (org.apache.zookeeper.KeeperException)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Set (java.util.Set)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 BinaryOutputArchive (org.apache.jute.BinaryOutputArchive)1 CreateMode (org.apache.zookeeper.CreateMode)1 BadArgumentsException (org.apache.zookeeper.KeeperException.BadArgumentsException)1 Code (org.apache.zookeeper.KeeperException.Code)1 SessionMovedException (org.apache.zookeeper.KeeperException.SessionMovedException)1 MultiResponse (org.apache.zookeeper.MultiResponse)1 OpResult (org.apache.zookeeper.OpResult)1