Search in sources :

Example 1 with DeleteResult

use of org.apache.zookeeper.OpResult.DeleteResult in project zookeeper by apache.

the class MultiTransactionTest method testTransactionBuilder.

@Test
public void testTransactionBuilder() throws Exception {
    List<OpResult> results = commit(zk.transaction().create("/t1", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT).create("/t1/child", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT).create("/t2", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL));
    assertEquals(3, results.size());
    for (OpResult r : results) {
        CreateResult c = (CreateResult) r;
        assertTrue(c.getPath().startsWith("/t"));
        assertNotNull(c.toString());
    }
    assertNotNull(zk.exists("/t1", false));
    assertNotNull(zk.exists("/t1/child", false));
    assertNotNull(zk.exists("/t2", false));
    results = commit(zk.transaction().check("/t1", 0).check("/t1/child", 0).check("/t2", 0));
    assertEquals(3, results.size());
    for (OpResult r : results) {
        CheckResult c = (CheckResult) r;
        assertNotNull(c.toString());
    }
    try {
        results = commit(zk.transaction().check("/t1", 0).check("/t1/child", 0).check("/t2", 1));
        fail();
    } catch (KeeperException.BadVersionException e) {
    // expected
    }
    results = commit(zk.transaction().check("/t1", 0).setData("/t1", new byte[0], 0));
    assertEquals(2, results.size());
    for (OpResult r : results) {
        assertNotNull(r.toString());
    }
    try {
        results = commit(zk.transaction().check("/t1", 1).setData("/t1", new byte[0], 2));
        fail();
    } catch (KeeperException.BadVersionException e) {
    // expected
    }
    results = commit(zk.transaction().check("/t1", 1).check("/t1/child", 0).check("/t2", 0));
    assertEquals(3, results.size());
    results = commit(zk.transaction().delete("/t2", -1).delete("/t1/child", -1));
    assertEquals(2, results.size());
    for (OpResult r : results) {
        DeleteResult d = (DeleteResult) r;
        assertNotNull(d.toString());
    }
    assertNotNull(zk.exists("/t1", false));
    assertNull(zk.exists("/t1/child", false));
    assertNull(zk.exists("/t2", false));
}
Also used : CreateResult(org.apache.zookeeper.OpResult.CreateResult) OpResult(org.apache.zookeeper.OpResult) CheckResult(org.apache.zookeeper.OpResult.CheckResult) KeeperException(org.apache.zookeeper.KeeperException) DeleteResult(org.apache.zookeeper.OpResult.DeleteResult) Test(org.junit.Test)

Example 2 with DeleteResult

use of org.apache.zookeeper.OpResult.DeleteResult in project zookeeper by apache.

the class MultiTransactionTest method testOpResultEquals.

/**
 * Exercise the equals methods of OpResult classes.
 */
@Test
public void testOpResultEquals() {
    opEquals(new CreateResult("/foo"), new CreateResult("/foo"), new CreateResult("nope"));
    opEquals(new CreateResult("/foo"), new CreateResult("/foo"), new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)));
    opEquals(new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("nope", new Stat(11, 12, 13, 14, 15, 16, 17, 18, 19, 110, 111)));
    opEquals(new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("/foo"));
    opEquals(new CheckResult(), new CheckResult(), null);
    opEquals(new SetDataResult(new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new SetDataResult(new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new SetDataResult(new Stat(11, 12, 13, 14, 15, 16, 17, 18, 19, 110, 111)));
    opEquals(new ErrorResult(1), new ErrorResult(1), new ErrorResult(2));
    opEquals(new DeleteResult(), new DeleteResult(), null);
    opEquals(new ErrorResult(1), new ErrorResult(1), new ErrorResult(2));
}
Also used : SetDataResult(org.apache.zookeeper.OpResult.SetDataResult) Stat(org.apache.zookeeper.data.Stat) CreateResult(org.apache.zookeeper.OpResult.CreateResult) CheckResult(org.apache.zookeeper.OpResult.CheckResult) ErrorResult(org.apache.zookeeper.OpResult.ErrorResult) DeleteResult(org.apache.zookeeper.OpResult.DeleteResult) Test(org.junit.Test)

Example 3 with DeleteResult

use of org.apache.zookeeper.OpResult.DeleteResult in project zookeeper by apache.

the class FinalRequestProcessor method processRequest.

public void processRequest(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 (zks.outstandingChanges) {
        // Need to process local session requests
        rc = zks.processTxn(request);
        // that add to outstandingChanges.
        if (request.getHdr() != null) {
            TxnHeader hdr = request.getHdr();
            Record txn = request.getTxn();
            long zxid = hdr.getZxid();
            while (!zks.outstandingChanges.isEmpty() && zks.outstandingChanges.get(0).zxid <= zxid) {
                ChangeRecord cr = zks.outstandingChanges.remove(0);
                if (cr.zxid < zxid) {
                    LOG.warn("Zxid outstanding " + cr.zxid + " is less than current " + zxid);
                }
                if (zks.outstandingChangesForPath.get(cr.path) == cr) {
                    zks.outstandingChangesForPath.remove(cr.path);
                }
            }
        }
        // do not add non quorum packets to the queue.
        if (request.isQuorum()) {
            zks.getZKDatabase().addCommittedProposal(request);
        }
    }
    // Calling closeSession() after losing the cnxn, results in the client close session response being dropped.
    if (request.type == OpCode.closeSession && connClosedByClient(request)) {
        // we are just playing diffs from the leader.
        if (closeSession(zks.serverCnxnFactory, request.sessionId) || closeSession(zks.secureServerCnxnFactory, request.sessionId)) {
            return;
        }
    }
    if (request.cnxn == null) {
        return;
    }
    ServerCnxn cnxn = request.cnxn;
    String lastOp = "NA";
    zks.decInProcess();
    Code err = Code.OK;
    Record rsp = null;
    try {
        if (request.getHdr() != null && request.getHdr().getType() == OpCode.error) {
            /*
                 * 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 != null && request.type != OpCode.multi) {
            throw ke;
        }
        if (LOG.isDebugEnabled()) {
            LOG.debug("{}", request);
        }
        switch(request.type) {
            case OpCode.ping:
                {
                    zks.serverStats().updateLatency(request.createTime);
                    lastOp = "PING";
                    cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp, request.createTime, Time.currentElapsedTime());
                    cnxn.sendResponse(new ReplyHeader(-2, zks.getZKDatabase().getDataTreeLastProcessedZxid(), 0), null, "response");
                    return;
                }
            case OpCode.createSession:
                {
                    zks.serverStats().updateLatency(request.createTime);
                    lastOp = "SESS";
                    cnxn.updateStatsForResponse(request.cxid, request.zxid, lastOp, request.createTime, Time.currentElapsedTime());
                    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);
                                break;
                            default:
                                throw new IOException("Invalid type of op");
                        }
                        ((MultiResponse) rsp).add(subResult);
                    }
                    break;
                }
            case OpCode.create:
                {
                    lastOp = "CREA";
                    rsp = new CreateResponse(rc.path);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.create2:
            case OpCode.createTTL:
            case OpCode.createContainer:
                {
                    lastOp = "CREA";
                    rsp = new Create2Response(rc.path, rc.stat);
                    err = Code.get(rc.err);
                    break;
                }
            case OpCode.delete:
            case OpCode.deleteContainer:
                {
                    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.reconfig:
                {
                    lastOp = "RECO";
                    rsp = new GetDataResponse(((QuorumZooKeeperServer) zks).self.getQuorumVerifier().toString().getBytes(), 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";
                    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());
                    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);
                    String 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);
                    break;
                }
            case OpCode.getData:
                {
                    lastOp = "GETD";
                    GetDataRequest getDataRequest = new GetDataRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getDataRequest);
                    DataNode n = zks.getZKDatabase().getNode(getDataRequest.getPath());
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    PrepRequestProcessor.checkACL(zks, request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.READ, request.authInfo, getDataRequest.getPath(), null);
                    Stat stat = new Stat();
                    byte[] b = zks.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();
                    ByteBufferInputStream.byteBuffer2Record(request.request, setWatches);
                    long relativeZxid = setWatches.getRelativeZxid();
                    zks.getZKDatabase().setWatches(relativeZxid, setWatches.getDataWatches(), setWatches.getExistWatches(), setWatches.getChildWatches(), cnxn);
                    break;
                }
            case OpCode.getACL:
                {
                    lastOp = "GETA";
                    GetACLRequest getACLRequest = new GetACLRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getACLRequest);
                    Stat stat = new Stat();
                    List<ACL> acl = zks.getZKDatabase().getACL(getACLRequest.getPath(), stat);
                    rsp = new GetACLResponse(acl, stat);
                    break;
                }
            case OpCode.getChildren:
                {
                    lastOp = "GETC";
                    GetChildrenRequest getChildrenRequest = new GetChildrenRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getChildrenRequest);
                    DataNode n = zks.getZKDatabase().getNode(getChildrenRequest.getPath());
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    PrepRequestProcessor.checkACL(zks, request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.READ, request.authInfo, getChildrenRequest.getPath(), null);
                    List<String> children = zks.getZKDatabase().getChildren(getChildrenRequest.getPath(), null, getChildrenRequest.getWatch() ? cnxn : null);
                    rsp = new GetChildrenResponse(children);
                    break;
                }
            case OpCode.getChildren2:
                {
                    lastOp = "GETC";
                    GetChildren2Request getChildren2Request = new GetChildren2Request();
                    ByteBufferInputStream.byteBuffer2Record(request.request, getChildren2Request);
                    Stat stat = new Stat();
                    DataNode n = zks.getZKDatabase().getNode(getChildren2Request.getPath());
                    if (n == null) {
                        throw new KeeperException.NoNodeException();
                    }
                    PrepRequestProcessor.checkACL(zks, request.cnxn, zks.getZKDatabase().aclForNode(n), ZooDefs.Perms.READ, request.authInfo, getChildren2Request.getPath(), null);
                    List<String> children = zks.getZKDatabase().getChildren(getChildren2Request.getPath(), stat, getChildren2Request.getWatch() ? cnxn : null);
                    rsp = new GetChildren2Response(children, stat);
                    break;
                }
            case OpCode.checkWatches:
                {
                    lastOp = "CHKW";
                    CheckWatchesRequest checkWatches = new CheckWatchesRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, checkWatches);
                    WatcherType type = WatcherType.fromInt(checkWatches.getType());
                    boolean containsWatcher = zks.getZKDatabase().containsWatcher(checkWatches.getPath(), type, cnxn);
                    if (!containsWatcher) {
                        String msg = String.format(Locale.ENGLISH, "%s (type: %s)", checkWatches.getPath(), type);
                        throw new KeeperException.NoWatcherException(msg);
                    }
                    break;
                }
            case OpCode.removeWatches:
                {
                    lastOp = "REMW";
                    RemoveWatchesRequest removeWatches = new RemoveWatchesRequest();
                    ByteBufferInputStream.byteBuffer2Record(request.request, removeWatches);
                    WatcherType type = WatcherType.fromInt(removeWatches.getType());
                    boolean removed = zks.getZKDatabase().removeWatch(removeWatches.getPath(), type, cnxn);
                    if (!removed) {
                        String msg = String.format(Locale.ENGLISH, "%s (type: %s)", removeWatches.getPath(), type);
                        throw new KeeperException.NoWatcherException(msg);
                    }
                    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;
    }
    long lastZxid = zks.getZKDatabase().getDataTreeLastProcessedZxid();
    ReplyHeader hdr = new ReplyHeader(request.cxid, lastZxid, err.intValue());
    zks.serverStats().updateLatency(request.createTime);
    cnxn.updateStatsForResponse(request.cxid, lastZxid, lastOp, request.createTime, Time.currentElapsedTime());
    try {
        cnxn.sendResponse(hdr, rsp, "response");
        if (request.type == OpCode.closeSession) {
            cnxn.sendCloseSession();
        }
    } catch (IOException e) {
        LOG.error("FIXMSG", e);
    }
}
Also used : MultiResponse(org.apache.zookeeper.MultiResponse) WatcherType(org.apache.zookeeper.Watcher.WatcherType) CreateResponse(org.apache.zookeeper.proto.CreateResponse) GetACLRequest(org.apache.zookeeper.proto.GetACLRequest) ErrorResult(org.apache.zookeeper.OpResult.ErrorResult) ProcessTxnResult(org.apache.zookeeper.server.DataTree.ProcessTxnResult) GetACLResponse(org.apache.zookeeper.proto.GetACLResponse) SetACLResponse(org.apache.zookeeper.proto.SetACLResponse) CreateResult(org.apache.zookeeper.OpResult.CreateResult) OpResult(org.apache.zookeeper.OpResult) CheckResult(org.apache.zookeeper.OpResult.CheckResult) List(java.util.List) GetChildren2Response(org.apache.zookeeper.proto.GetChildren2Response) GetChildren2Request(org.apache.zookeeper.proto.GetChildren2Request) OpCode(org.apache.zookeeper.ZooDefs.OpCode) Code(org.apache.zookeeper.KeeperException.Code) GetChildrenResponse(org.apache.zookeeper.proto.GetChildrenResponse) SyncRequest(org.apache.zookeeper.proto.SyncRequest) SetWatches(org.apache.zookeeper.proto.SetWatches) SessionMovedException(org.apache.zookeeper.KeeperException.SessionMovedException) GetDataResponse(org.apache.zookeeper.proto.GetDataResponse) KeeperException(org.apache.zookeeper.KeeperException) DeleteResult(org.apache.zookeeper.OpResult.DeleteResult) ExistsResponse(org.apache.zookeeper.proto.ExistsResponse) 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) ChangeRecord(org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord) ReplyHeader(org.apache.zookeeper.proto.ReplyHeader) ExistsRequest(org.apache.zookeeper.proto.ExistsRequest) GetChildrenRequest(org.apache.zookeeper.proto.GetChildrenRequest) IOException(java.io.IOException) CheckWatchesRequest(org.apache.zookeeper.proto.CheckWatchesRequest) ByteBuffer(java.nio.ByteBuffer) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException) SessionMovedException(org.apache.zookeeper.KeeperException.SessionMovedException) ErrorTxn(org.apache.zookeeper.txn.ErrorTxn) ChangeRecord(org.apache.zookeeper.server.ZooKeeperServer.ChangeRecord) TxnHeader(org.apache.zookeeper.txn.TxnHeader)

Aggregations

CheckResult (org.apache.zookeeper.OpResult.CheckResult)3 CreateResult (org.apache.zookeeper.OpResult.CreateResult)3 DeleteResult (org.apache.zookeeper.OpResult.DeleteResult)3 KeeperException (org.apache.zookeeper.KeeperException)2 OpResult (org.apache.zookeeper.OpResult)2 ErrorResult (org.apache.zookeeper.OpResult.ErrorResult)2 SetDataResult (org.apache.zookeeper.OpResult.SetDataResult)2 Stat (org.apache.zookeeper.data.Stat)2 Test (org.junit.Test)2 IOException (java.io.IOException)1 ByteBuffer (java.nio.ByteBuffer)1 List (java.util.List)1 Record (org.apache.jute.Record)1 Code (org.apache.zookeeper.KeeperException.Code)1 SessionMovedException (org.apache.zookeeper.KeeperException.SessionMovedException)1 MultiResponse (org.apache.zookeeper.MultiResponse)1 WatcherType (org.apache.zookeeper.Watcher.WatcherType)1 OpCode (org.apache.zookeeper.ZooDefs.OpCode)1 CheckWatchesRequest (org.apache.zookeeper.proto.CheckWatchesRequest)1 Create2Response (org.apache.zookeeper.proto.Create2Response)1