Search in sources :

Example 21 with ReplyHeader

use of org.apache.zookeeper_voltpatches.proto.ReplyHeader in project voltdb by VoltDB.

the class ZooKeeper method getACL.

/**
     * Return the ACL and stat of the node of the given path.
     * <p>
     * A KeeperException with error code KeeperException.NoNode will be thrown
     * if no node with the given path exists.
     *
     * @param path
     *            the given path for the node
     * @param stat
     *            the stat of the node will be copied to this parameter.
     * @return the ACL array of the given node.
     * @throws InterruptedException
     *             If the server transaction is interrupted.
     * @throws KeeperException
     *             If the server signals an error with a non-zero error code.
     * @throws IllegalArgumentException
     *             if an invalid path is specified
     */
public List<ACL> getACL(final String path, Stat stat) throws KeeperException, InterruptedException {
    verbotenThreadCheck();
    final String clientPath = path;
    PathUtils.validatePath(clientPath);
    final String serverPath = prependChroot(clientPath);
    RequestHeader h = new RequestHeader();
    h.setType(ZooDefs.OpCode.getACL);
    GetACLRequest request = new GetACLRequest();
    request.setPath(serverPath);
    GetACLResponse response = new GetACLResponse();
    ReplyHeader r = cnxn.submitRequest(h, request, response, null);
    if (r.getErr() != 0) {
        throw KeeperException.create(KeeperException.Code.get(r.getErr()), clientPath);
    }
    DataTree.copyStat(response.getStat(), stat);
    return response.getAcl();
}
Also used : ReplyHeader(org.apache.zookeeper_voltpatches.proto.ReplyHeader) GetACLRequest(org.apache.zookeeper_voltpatches.proto.GetACLRequest) RequestHeader(org.apache.zookeeper_voltpatches.proto.RequestHeader) GetACLResponse(org.apache.zookeeper_voltpatches.proto.GetACLResponse)

Example 22 with ReplyHeader

use of org.apache.zookeeper_voltpatches.proto.ReplyHeader in project voltdb by VoltDB.

the class ZooKeeper method create.

/**
     * Create a node with the given path. The node data will be the given data,
     * and node acl will be the given acl.
     * <p>
     * The flags argument specifies whether the created node will be ephemeral
     * or not.
     * <p>
     * An ephemeral node will be removed by the ZooKeeper automatically when the
     * session associated with the creation of the node expires.
     * <p>
     * The flags argument can also specify to create a sequential node. The
     * actual path name of a sequential node will be the given path plus a
     * suffix "i" where i is the current sequential number of the node. The
     * sequence number is always fixed length of 10 digits, 0 padded. Once such
     * a node is created, the sequential number will be incremented by one.
     * <p>
     * If a node with the same actual path already exists in the ZooKeeper, a
     * KeeperException with error code KeeperException.NodeExists will be
     * thrown. Note that since a different actual path is used for each
     * invocation of creating sequential node with the same path argument, the
     * call will never throw "file exists" KeeperException.
     * <p>
     * If the parent node does not exist in the ZooKeeper, a KeeperException
     * with error code KeeperException.NoNode will be thrown.
     * <p>
     * An ephemeral node cannot have children. If the parent node of the given
     * path is ephemeral, a KeeperException with error code
     * KeeperException.NoChildrenForEphemerals will be thrown.
     * <p>
     * This operation, if successful, will trigger all the watches left on the
     * node of the given path by exists and getData API calls, and the watches
     * left on the parent node by getChildren API calls.
     * <p>
     * If a node is created successfully, the ZooKeeper server will trigger the
     * watches on the path left by exists calls, and the watches on the parent
     * of the node by getChildren calls.
     * <p>
     * The maximum allowable size of the data array is 1 MB (1,048,576 bytes).
     * Arrays larger than this will cause a KeeperExecption to be thrown.
     *
     * @param path
     *            the path for the node
     * @param data
     *            the initial data for the node
     * @param acl
     *            the acl for the node
     * @param createMode
     *            specifying whether the node to be created is ephemeral and/or
     *            sequential
     * @return the actual path of the created node
     * @throws KeeperException
     *             if the server returns a non-zero error code
     * @throws KeeperException.InvalidACLException
     *             if the ACL is invalid, null, or empty
     * @throws InterruptedException
     *             if the transaction is interrupted
     * @throws IllegalArgumentException
     *             if an invalid path is specified
     */
public String create(final String path, byte[] data, List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException {
    verbotenThreadCheck();
    final String clientPath = path;
    PathUtils.validatePath(clientPath, createMode.isSequential());
    final String serverPath = prependChroot(clientPath);
    RequestHeader h = new RequestHeader();
    h.setType(ZooDefs.OpCode.create);
    CreateRequest request = new CreateRequest();
    CreateResponse response = new CreateResponse();
    request.setData(data);
    request.setFlags(createMode.toFlag());
    request.setPath(serverPath);
    if (acl != null && acl.size() == 0) {
        throw new KeeperException.InvalidACLException();
    }
    request.setAcl(acl);
    ReplyHeader r = cnxn.submitRequest(h, request, response, null);
    if (r.getErr() != 0) {
        throw KeeperException.create(KeeperException.Code.get(r.getErr()), clientPath);
    }
    if (cnxn.chrootPath == null) {
        return response.getPath();
    } else {
        return response.getPath().substring(cnxn.chrootPath.length());
    }
}
Also used : ReplyHeader(org.apache.zookeeper_voltpatches.proto.ReplyHeader) CreateRequest(org.apache.zookeeper_voltpatches.proto.CreateRequest) CreateResponse(org.apache.zookeeper_voltpatches.proto.CreateResponse) RequestHeader(org.apache.zookeeper_voltpatches.proto.RequestHeader)

Example 23 with ReplyHeader

use of org.apache.zookeeper_voltpatches.proto.ReplyHeader in project voltdb by VoltDB.

the class ClientCnxn method submitRequest.

public ReplyHeader submitRequest(RequestHeader h, Record request, Record response, WatchRegistration watchRegistration) throws InterruptedException {
    ReplyHeader r = new ReplyHeader();
    Packet packet = queuePacket(h, r, request, response, null, null, null, null, watchRegistration);
    synchronized (packet) {
        while (!packet.finished) {
            packet.wait();
        }
    }
    return r;
}
Also used : ReplyHeader(org.apache.zookeeper_voltpatches.proto.ReplyHeader) AuthPacket(org.apache.zookeeper_voltpatches.proto.AuthPacket)

Example 24 with ReplyHeader

use of org.apache.zookeeper_voltpatches.proto.ReplyHeader in project voltdb by VoltDB.

the class NIOServerCnxn method readRequest.

private void readRequest() throws IOException {
    // We have the request, now process and setup for next
    InputStream bais = new ByteBufferInputStream(incomingBuffer);
    BinaryInputArchive bia = BinaryInputArchive.getArchive(bais);
    RequestHeader h = new RequestHeader();
    h.deserialize(bia, "header");
    // Through the magic of byte buffers, txn will not be
    // pointing
    // to the start of the txn
    incomingBuffer = incomingBuffer.slice();
    if (h.getType() == OpCode.auth) {
        AuthPacket authPacket = new AuthPacket();
        ZooKeeperServer.byteBuffer2Record(incomingBuffer, authPacket);
        String scheme = authPacket.getScheme();
        AuthenticationProvider ap = ProviderRegistry.getProvider(scheme);
        if (ap == null || (ap.handleAuthentication(this, authPacket.getAuth()) != KeeperException.Code.OK)) {
            if (ap == null) {
                LOG.warn("No authentication provider for scheme: " + scheme + " has " + ProviderRegistry.listProviders());
            } else {
                LOG.warn("Authentication failed for scheme: " + scheme);
            }
            // send a response...
            ReplyHeader rh = new ReplyHeader(h.getXid(), 0, KeeperException.Code.AUTHFAILED.intValue());
            sendResponse(rh, null, null);
            // ... and close connection
            sendCloseSession();
            disableRecv();
        } else {
            if (LOG.isDebugEnabled()) {
                LOG.debug("Authentication succeeded for scheme: " + scheme);
            }
            ReplyHeader rh = new ReplyHeader(h.getXid(), 0, KeeperException.Code.OK.intValue());
            sendResponse(rh, null, null);
        }
        return;
    } else {
        Request si = new Request(this, sessionId, h.getXid(), h.getType(), incomingBuffer, authInfo);
        si.setOwner(ServerCnxn.me);
        zk.submitRequest(si);
    }
    if (h.getXid() >= 0) {
        synchronized (this) {
            outstandingRequests++;
        }
        synchronized (this.factory) {
            // check throttling
            if (zk.getInProcess() > factory.outstandingLimit) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Throttling recv " + zk.getInProcess());
                }
                disableRecv();
            // following lines should not be needed since we are
            // already reading
            // } else {
            // enableRecv();
            }
        }
    }
}
Also used : BinaryInputArchive(org.apache.jute_voltpatches.BinaryInputArchive) ReplyHeader(org.apache.zookeeper_voltpatches.proto.ReplyHeader) InputStream(java.io.InputStream) AuthPacket(org.apache.zookeeper_voltpatches.proto.AuthPacket) AuthenticationProvider(org.apache.zookeeper_voltpatches.server.auth.AuthenticationProvider) ConnectRequest(org.apache.zookeeper_voltpatches.proto.ConnectRequest) RequestHeader(org.apache.zookeeper_voltpatches.proto.RequestHeader)

Example 25 with ReplyHeader

use of org.apache.zookeeper_voltpatches.proto.ReplyHeader 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)

Aggregations

ReplyHeader (org.apache.zookeeper_voltpatches.proto.ReplyHeader)25 RequestHeader (org.apache.zookeeper_voltpatches.proto.RequestHeader)20 SetDataResponse (org.apache.zookeeper_voltpatches.proto.SetDataResponse)5 CreateResponse (org.apache.zookeeper_voltpatches.proto.CreateResponse)3 ExistsRequest (org.apache.zookeeper_voltpatches.proto.ExistsRequest)3 GetACLRequest (org.apache.zookeeper_voltpatches.proto.GetACLRequest)3 GetACLResponse (org.apache.zookeeper_voltpatches.proto.GetACLResponse)3 GetChildren2Request (org.apache.zookeeper_voltpatches.proto.GetChildren2Request)3 GetChildren2Response (org.apache.zookeeper_voltpatches.proto.GetChildren2Response)3 GetChildrenRequest (org.apache.zookeeper_voltpatches.proto.GetChildrenRequest)3 GetChildrenResponse (org.apache.zookeeper_voltpatches.proto.GetChildrenResponse)3 GetDataRequest (org.apache.zookeeper_voltpatches.proto.GetDataRequest)3 GetDataResponse (org.apache.zookeeper_voltpatches.proto.GetDataResponse)3 SetACLResponse (org.apache.zookeeper_voltpatches.proto.SetACLResponse)3 AuthPacket (org.apache.zookeeper_voltpatches.proto.AuthPacket)2 CreateRequest (org.apache.zookeeper_voltpatches.proto.CreateRequest)2 DeleteRequest (org.apache.zookeeper_voltpatches.proto.DeleteRequest)2 SetACLRequest (org.apache.zookeeper_voltpatches.proto.SetACLRequest)2 SetDataRequest (org.apache.zookeeper_voltpatches.proto.SetDataRequest)2 SyncRequest (org.apache.zookeeper_voltpatches.proto.SyncRequest)2