Search in sources :

Example 1 with TxnHeader

use of org.apache.zookeeper_voltpatches.txn.TxnHeader in project voltdb by VoltDB.

the class ZooKeeperServer method prepRequest.

/**
     * This method will be called inside the ProcessRequestThread, which is a
     * singleton, so there will be a single thread calling this code.
     *
     * @param request
     */
public void prepRequest(Request request, long txnId) {
    // LOG.info("Prep>>> cxid = " + request.cxid + " type = " +
    // request.type + " id = 0x" + Long.toHexString(request.sessionId));
    TxnHeader txnHeader = null;
    Record txn = null;
    try {
        switch(request.type) {
            case OpCode.create:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.create);
                CreateRequest createRequest = new CreateRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, createRequest);
                String path = createRequest.getPath();
                int lastSlash = path.lastIndexOf('/');
                if (lastSlash == -1 || path.indexOf('\0') != -1) {
                    LOG.info("Invalid path " + path + " with session 0x" + Long.toHexString(request.sessionId));
                    throw new KeeperException.BadArgumentsException(path);
                }
                if (!fixupACL(request.authInfo, createRequest.getAcl())) {
                    throw new KeeperException.InvalidACLException(path);
                }
                String parentPath = path.substring(0, lastSlash);
                ChangeRecord parentRecord = getRecordForPath(parentPath);
                checkACL(parentRecord.acl, ZooDefs.Perms.CREATE, request.authInfo);
                int parentCVersion = parentRecord.stat.getCversion();
                CreateMode createMode = CreateMode.fromFlag(createRequest.getFlags());
                if (createMode.isSequential()) {
                    path = path + String.format("%010d", parentCVersion);
                }
                try {
                    PathUtils.validatePath(path);
                } catch (IllegalArgumentException ie) {
                    LOG.info("Invalid path " + path + " with session 0x" + Long.toHexString(request.sessionId));
                    throw new KeeperException.BadArgumentsException(path);
                }
                try {
                    if (getRecordForPath(path) != null) {
                        throw new KeeperException.NodeExistsException(path);
                    }
                } catch (KeeperException.NoNodeException e) {
                // ignore this one
                }
                boolean ephemeralParent = parentRecord.stat.getEphemeralOwner() != 0;
                if (ephemeralParent) {
                    throw new KeeperException.NoChildrenForEphemeralsException(path);
                }
                txn = new CreateTxn(path, createRequest.getData(), createRequest.getAcl(), createMode.isEphemeral());
                StatPersisted s = new StatPersisted();
                if (createMode.isEphemeral()) {
                    s.setEphemeralOwner(request.sessionId);
                }
                parentRecord = parentRecord.duplicate(txnHeader.getZxid());
                parentRecord.childCount++;
                parentRecord.stat.setCversion(parentRecord.stat.getCversion() + 1);
                addChangeRecord(parentRecord);
                addChangeRecord(new ChangeRecord(txnHeader.getZxid(), path, s, 0, createRequest.getAcl()));
                break;
            case OpCode.delete:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.delete);
                DeleteRequest deleteRequest = new DeleteRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, deleteRequest);
                path = deleteRequest.getPath();
                lastSlash = path.lastIndexOf('/');
                if (lastSlash == -1 || path.indexOf('\0') != -1 || getZKDatabase().isSpecialPath(path)) {
                    throw new KeeperException.BadArgumentsException(path);
                }
                parentPath = path.substring(0, lastSlash);
                parentRecord = getRecordForPath(parentPath);
                ChangeRecord nodeRecord = getRecordForPath(path);
                checkACL(parentRecord.acl, ZooDefs.Perms.DELETE, request.authInfo);
                int version = deleteRequest.getVersion();
                if (version != -1 && nodeRecord.stat.getVersion() != version) {
                    throw new KeeperException.BadVersionException(path);
                }
                if (nodeRecord.childCount > 0) {
                    throw new KeeperException.NotEmptyException(path);
                }
                txn = new DeleteTxn(path);
                parentRecord = parentRecord.duplicate(txnHeader.getZxid());
                parentRecord.childCount--;
                parentRecord.stat.setCversion(parentRecord.stat.getCversion() + 1);
                addChangeRecord(parentRecord);
                addChangeRecord(new ChangeRecord(txnHeader.getZxid(), path, null, -1, null));
                break;
            case OpCode.setData:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.setData);
                SetDataRequest setDataRequest = new SetDataRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, setDataRequest);
                path = setDataRequest.getPath();
                nodeRecord = getRecordForPath(path);
                checkACL(nodeRecord.acl, ZooDefs.Perms.WRITE, request.authInfo);
                version = setDataRequest.getVersion();
                int currentVersion = nodeRecord.stat.getVersion();
                if (version != -1 && version != currentVersion) {
                    throw new KeeperException.BadVersionException(path);
                }
                version = currentVersion + 1;
                txn = new SetDataTxn(path, setDataRequest.getData(), version);
                nodeRecord = nodeRecord.duplicate(txnHeader.getZxid());
                nodeRecord.stat.setVersion(version);
                addChangeRecord(nodeRecord);
                break;
            case OpCode.setACL:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.setACL);
                SetACLRequest setAclRequest = new SetACLRequest();
                ZooKeeperServer.byteBuffer2Record(request.request, setAclRequest);
                path = setAclRequest.getPath();
                if (!fixupACL(request.authInfo, setAclRequest.getAcl())) {
                    throw new KeeperException.InvalidACLException(path);
                }
                nodeRecord = getRecordForPath(path);
                checkACL(nodeRecord.acl, ZooDefs.Perms.ADMIN, request.authInfo);
                version = setAclRequest.getVersion();
                currentVersion = nodeRecord.stat.getAversion();
                if (version != -1 && version != currentVersion) {
                    throw new KeeperException.BadVersionException(path);
                }
                version = currentVersion + 1;
                txn = new SetACLTxn(path, setAclRequest.getAcl(), version);
                nodeRecord = nodeRecord.duplicate(txnHeader.getZxid());
                nodeRecord.stat.setAversion(version);
                addChangeRecord(nodeRecord);
                break;
            case OpCode.createSession:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.createSession);
                request.request.rewind();
                int to = request.request.getInt();
                txn = new CreateSessionTxn((Long) request.getOwner());
                request.request.rewind();
                sessionTracker.addSession(request.sessionId, (Long) request.getOwner());
                break;
            case OpCode.closeSession:
                txnHeader = new TxnHeader(request.sessionId, request.cxid, txnId, getTime(), OpCode.closeSession);
                // We don't want to do this check since the session expiration
                // thread
                // queues up this operation without being the session owner.
                // this request is the last of the session so it should be ok
                // zks.sessionTracker.checkSession(request.sessionId,
                // request.getOwner());
                HashSet<String> es = getZKDatabase().getEphemerals(request.sessionId);
                synchronized (outstandingChanges) {
                    for (ChangeRecord c : outstandingChanges) {
                        if (c.stat == null) {
                            // Doing a delete
                            es.remove(c.path);
                        } else if (c.stat.getEphemeralOwner() == request.sessionId) {
                            es.add(c.path);
                        }
                    }
                    for (String path2Delete : es) {
                        addChangeRecord(new ChangeRecord(txnHeader.getZxid(), path2Delete, null, 0, null));
                    }
                }
                sessionTracker.removeSession(request.sessionId);
                LOG.info("Processed session termination for sessionid: 0x" + Long.toHexString(request.sessionId));
                break;
            case OpCode.sync:
            case OpCode.exists:
            case OpCode.getData:
            case OpCode.getACL:
            case OpCode.getChildren:
            case OpCode.getChildren2:
            case OpCode.ping:
            case OpCode.setWatches:
            default:
        }
    } catch (KeeperException e) {
        if (txnHeader != null) {
            txnHeader.setType(OpCode.error);
            txn = new ErrorTxn(e.code().intValue());
        }
        LOG.debug("Got user-level KeeperException when processing " + request.toString() + " Error Path:" + e.getPath() + " Error:" + 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(Integer.toHexString(bb.get() & 0xff));
            }
        } else {
            sb.append("request buffer is null");
        }
        LOG.error("Dumping request buffer: 0x" + sb.toString());
        if (txnHeader != null) {
            txnHeader.setType(OpCode.error);
            txn = new ErrorTxn(Code.MARSHALLINGERROR.intValue());
        }
    }
    request.hdr = txnHeader;
    request.txn = txn;
    request.zxid = txnId;
    executeRequest(request);
}
Also used : CreateRequest(org.apache.zookeeper_voltpatches.proto.CreateRequest) DeleteTxn(org.apache.zookeeper_voltpatches.txn.DeleteTxn) CreateSessionTxn(org.apache.zookeeper_voltpatches.txn.CreateSessionTxn) Record(org.apache.jute_voltpatches.Record) SetACLRequest(org.apache.zookeeper_voltpatches.proto.SetACLRequest) SetDataRequest(org.apache.zookeeper_voltpatches.proto.SetDataRequest) SetDataTxn(org.apache.zookeeper_voltpatches.txn.SetDataTxn) 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) CreateTxn(org.apache.zookeeper_voltpatches.txn.CreateTxn) ErrorTxn(org.apache.zookeeper_voltpatches.txn.ErrorTxn) CreateMode(org.apache.zookeeper_voltpatches.CreateMode) SetACLTxn(org.apache.zookeeper_voltpatches.txn.SetACLTxn) StatPersisted(org.apache.zookeeper_voltpatches.data.StatPersisted) DeleteRequest(org.apache.zookeeper_voltpatches.proto.DeleteRequest) KeeperException(org.apache.zookeeper_voltpatches.KeeperException) TxnHeader(org.apache.zookeeper_voltpatches.txn.TxnHeader)

Example 2 with TxnHeader

use of org.apache.zookeeper_voltpatches.txn.TxnHeader in project voltdb by VoltDB.

the class FileTxnLog method getLastLoggedZxid.

/**
     * get the last zxid that was logged in the transaction logs
     * @return the last zxid logged in the transaction logs
     */
public long getLastLoggedZxid() {
    File[] files = getLogFiles(logDir.listFiles(), 0);
    long maxLog = files.length > 0 ? Util.getZxidFromName(files[files.length - 1].getName(), "log") : -1;
    // if a log file is more recent we must scan it to find
    // the highest zxid
    long zxid = maxLog;
    try {
        FileTxnLog txn = new FileTxnLog(logDir);
        TxnIterator itr = txn.read(maxLog);
        while (true) {
            if (!itr.next())
                break;
            TxnHeader hdr = itr.getHeader();
            zxid = hdr.getZxid();
        }
    } catch (IOException e) {
        LOG.warn("Unexpected exception", e);
    }
    return zxid;
}
Also used : FileTxnLog(org.apache.zookeeper_voltpatches.server.persistence.FileTxnLog) IOException(java.io.IOException) RandomAccessFile(java.io.RandomAccessFile) File(java.io.File) TxnHeader(org.apache.zookeeper_voltpatches.txn.TxnHeader)

Example 3 with TxnHeader

use of org.apache.zookeeper_voltpatches.txn.TxnHeader in project voltdb by VoltDB.

the class TxnHeader method compareTo.

public int compareTo(Object peer_) throws ClassCastException {
    if (!(peer_ instanceof TxnHeader)) {
        throw new ClassCastException("Comparing different types of records.");
    }
    TxnHeader peer = (TxnHeader) peer_;
    int ret = 0;
    ret = (clientId == peer.clientId) ? 0 : ((clientId < peer.clientId) ? -1 : 1);
    if (ret != 0)
        return ret;
    ret = (cxid == peer.cxid) ? 0 : ((cxid < peer.cxid) ? -1 : 1);
    if (ret != 0)
        return ret;
    ret = (zxid == peer.zxid) ? 0 : ((zxid < peer.zxid) ? -1 : 1);
    if (ret != 0)
        return ret;
    ret = (time == peer.time) ? 0 : ((time < peer.time) ? -1 : 1);
    if (ret != 0)
        return ret;
    ret = (type == peer.type) ? 0 : ((type < peer.type) ? -1 : 1);
    if (ret != 0)
        return ret;
    return ret;
}
Also used : TxnHeader(org.apache.zookeeper_voltpatches.txn.TxnHeader)

Example 4 with TxnHeader

use of org.apache.zookeeper_voltpatches.txn.TxnHeader in project voltdb by VoltDB.

the class TxnHeader method equals.

@Override
public boolean equals(Object peer_) {
    if (!(peer_ instanceof TxnHeader)) {
        return false;
    }
    if (peer_ == this) {
        return true;
    }
    TxnHeader peer = (TxnHeader) peer_;
    boolean ret = false;
    ret = (clientId == peer.clientId);
    if (!ret)
        return ret;
    ret = (cxid == peer.cxid);
    if (!ret)
        return ret;
    ret = (zxid == peer.zxid);
    if (!ret)
        return ret;
    ret = (time == peer.time);
    if (!ret)
        return ret;
    ret = (type == peer.type);
    if (!ret)
        return ret;
    return ret;
}
Also used : TxnHeader(org.apache.zookeeper_voltpatches.txn.TxnHeader)

Example 5 with TxnHeader

use of org.apache.zookeeper_voltpatches.txn.TxnHeader in project voltdb by VoltDB.

the class LogFormatter method main.

/**
     * @param args
     */
public static void main(String[] args) throws Exception {
    if (args.length != 1) {
        System.err.println("USAGE: LogFormatter log_file");
        System.exit(2);
    }
    FileInputStream fis = new FileInputStream(args[0]);
    BinaryInputArchive logStream = BinaryInputArchive.getArchive(fis);
    FileHeader fhdr = new FileHeader();
    fhdr.deserialize(logStream, "fileheader");
    if (fhdr.getMagic() != FileTxnLog.TXNLOG_MAGIC) {
        System.err.println("Invalid magic number for " + args[0]);
        System.exit(2);
    }
    System.out.println("ZooKeeper Transactional Log File with dbid " + fhdr.getDbid() + " txnlog format version " + fhdr.getVersion());
    int count = 0;
    while (true) {
        long crcValue;
        byte[] bytes;
        try {
            crcValue = logStream.readLong("crcvalue");
            bytes = logStream.readBuffer("txnEntry");
        } catch (EOFException e) {
            System.out.println("EOF reached after " + count + " txns.");
            return;
        }
        if (bytes.length == 0) {
            // Since we preallocate, we define EOF to be an
            // empty transaction
            System.out.println("EOF reached after " + count + " txns.");
            return;
        }
        Checksum crc = new Adler32();
        crc.update(bytes, 0, bytes.length);
        if (crcValue != crc.getValue()) {
            throw new IOException("CRC doesn't match " + crcValue + " vs " + crc.getValue());
        }
        InputArchive iab = BinaryInputArchive.getArchive(new ByteArrayInputStream(bytes));
        TxnHeader hdr = new TxnHeader();
        SerializeUtils.deserializeTxn(iab, hdr);
        System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(new Date(hdr.getTime())) + " session 0x" + Long.toHexString(hdr.getClientId()) + " cxid 0x" + Long.toHexString(hdr.getCxid()) + " zxid 0x" + Long.toHexString(hdr.getZxid()) + " " + TraceFormatter.op2String(hdr.getType()));
        if (logStream.readByte("EOR") != 'B') {
            LOG.error("Last transaction was partial.");
            throw new EOFException("Last transaction was partial.");
        }
        count++;
    }
}
Also used : BinaryInputArchive(org.apache.jute_voltpatches.BinaryInputArchive) InputArchive(org.apache.jute_voltpatches.InputArchive) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) Adler32(java.util.zip.Adler32) Date(java.util.Date) BinaryInputArchive(org.apache.jute_voltpatches.BinaryInputArchive) ByteArrayInputStream(java.io.ByteArrayInputStream) Checksum(java.util.zip.Checksum) EOFException(java.io.EOFException) FileHeader(org.apache.zookeeper_voltpatches.server.persistence.FileHeader) TxnHeader(org.apache.zookeeper_voltpatches.txn.TxnHeader)

Aggregations

TxnHeader (org.apache.zookeeper_voltpatches.txn.TxnHeader)5 IOException (java.io.IOException)3 ByteArrayInputStream (java.io.ByteArrayInputStream)1 EOFException (java.io.EOFException)1 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 RandomAccessFile (java.io.RandomAccessFile)1 ByteBuffer (java.nio.ByteBuffer)1 Date (java.util.Date)1 Adler32 (java.util.zip.Adler32)1 Checksum (java.util.zip.Checksum)1 InstanceAlreadyExistsException (javax.management.InstanceAlreadyExistsException)1 BinaryInputArchive (org.apache.jute_voltpatches.BinaryInputArchive)1 InputArchive (org.apache.jute_voltpatches.InputArchive)1 Record (org.apache.jute_voltpatches.Record)1 CreateMode (org.apache.zookeeper_voltpatches.CreateMode)1 KeeperException (org.apache.zookeeper_voltpatches.KeeperException)1 SessionMovedException (org.apache.zookeeper_voltpatches.KeeperException.SessionMovedException)1 StatPersisted (org.apache.zookeeper_voltpatches.data.StatPersisted)1 CreateRequest (org.apache.zookeeper_voltpatches.proto.CreateRequest)1