You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2015/08/28 00:54:19 UTC

svn commit: r1698237 - in /qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb: AbstractBDBMessageStore.java tuple/MessageMetaDataBinding.java tuple/QueueEntryBinding.java

Author: rgodfrey
Date: Thu Aug 27 22:54:19 2015
New Revision: 1698237

URL: http://svn.apache.org/r1698237
Log:
QPID-6662 : Remove unnecessary copying of data in BDB for meta data

Modified:
    qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
    qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java
    qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java

Modified: qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java?rev=1698237&r1=1698236&r2=1698237&view=diff
==============================================================================
--- qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java (original)
+++ qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java Thu Aug 27 22:54:19 2015
@@ -402,10 +402,6 @@ public abstract class AbstractBDBMessage
         LongBinding.longToEntry(messageId, contentKeyEntry);
         DatabaseEntry value = new DatabaseEntry();
 
-
-        ByteBufferBinding contentTupleBinding = ByteBufferBinding.getInstance();
-
-
         getLogger().debug("Message Id: {} Getting content body", messageId);
 
         try
@@ -600,6 +596,7 @@ public abstract class AbstractBDBMessage
     }
 
 
+    private static final byte[] ENQUEUE_RECORD_VALUE = new byte[1];
     /**
      * Places a message onto a specified queue, in a given transaction.
      *
@@ -618,7 +615,7 @@ public abstract class AbstractBDBMessage
         QueueEntryKey dd = new QueueEntryKey(queue.getId(), messageId);
         keyBinding.objectToEntry(dd, key);
         DatabaseEntry value = new DatabaseEntry();
-        ByteBinding.byteToEntry((byte) 0, value);
+        value.setData(ENQUEUE_RECORD_VALUE, 0, 1);
 
         try
         {

Modified: qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java?rev=1698237&r1=1698236&r2=1698237&view=diff
==============================================================================
--- qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java (original)
+++ qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MessageMetaDataBinding.java Thu Aug 27 22:54:19 2015
@@ -20,11 +20,15 @@
  */
 package org.apache.qpid.server.store.berkeleydb.tuple;
 
+import com.sleepycat.bind.EntryBinding;
+import com.sleepycat.je.DatabaseEntry;
 import java.nio.ByteBuffer;
 
 import com.sleepycat.bind.tuple.TupleBinding;
 import com.sleepycat.bind.tuple.TupleInput;
 import com.sleepycat.bind.tuple.TupleOutput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.plugin.MessageMetaDataType;
 import org.apache.qpid.server.store.MessageMetaDataTypeRegistry;
@@ -33,8 +37,10 @@ import org.apache.qpid.server.store.Stor
 /**
  * Handles the mapping to and from message meta data
  */
-public class MessageMetaDataBinding extends TupleBinding<StorableMessageMetaData>
+public class MessageMetaDataBinding implements EntryBinding<StorableMessageMetaData>
 {
+    private static final Logger LOGGER = LoggerFactory.getLogger(MessageMetaDataBinding.class);
+
     private static final MessageMetaDataBinding INSTANCE = new MessageMetaDataBinding();
 
     public static MessageMetaDataBinding getInstance()
@@ -46,31 +52,30 @@ public class MessageMetaDataBinding exte
     private MessageMetaDataBinding() { }
 
     @Override
-    public StorableMessageMetaData entryToObject(TupleInput tupleInput)
+    public StorableMessageMetaData entryToObject(DatabaseEntry entry)
     {
-        final int bodySize = tupleInput.readInt();
-        byte[] dataAsBytes = new byte[bodySize];
-        tupleInput.readFast(dataAsBytes);
-
-        ByteBuffer buf = ByteBuffer.wrap(dataAsBytes);
-        buf.position(1);
+        ByteBuffer buf = ByteBuffer.wrap(entry.getData(), entry.getOffset(), entry.getSize());
+        final int bodySize = buf.getInt() ^ 0x80000000;
+        final int metaDataType = buf.get() & 0xff;
         buf = buf.slice();
-        MessageMetaDataType type = MessageMetaDataTypeRegistry.fromOrdinal(dataAsBytes[0]);
+        LOGGER.debug("RGDEBUG : remaining {} limit {}", buf.remaining(), bodySize);
+        buf.limit(bodySize-1);
+        MessageMetaDataType type = MessageMetaDataTypeRegistry.fromOrdinal(metaDataType);
         return type.createMetaData(buf);
     }
 
     @Override
-    public void objectToEntry(StorableMessageMetaData metaData, TupleOutput tupleOutput)
+    public void objectToEntry(StorableMessageMetaData metaData, DatabaseEntry entry)
     {
         final int bodySize = 1 + metaData.getStorableSize();
-        byte[] underlying = new byte[bodySize];
-        underlying[0] = (byte) metaData.getType().ordinal();
+        byte[] underlying = new byte[4+bodySize];
+        underlying[4] = (byte) metaData.getType().ordinal();
         ByteBuffer buf = ByteBuffer.wrap(underlying);
-        buf.position(1);
+        buf.putInt(bodySize ^ 0x80000000);
+        buf.position(5);
         buf = buf.slice();
 
         metaData.writeToBuffer(buf);
-        tupleOutput.writeInt(bodySize);
-        tupleOutput.writeFast(underlying);
+        entry.setData(underlying);
     }
 }

Modified: qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java?rev=1698237&r1=1698236&r2=1698237&view=diff
==============================================================================
--- qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java (original)
+++ qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java Thu Aug 27 22:54:19 2015
@@ -22,13 +22,15 @@ package org.apache.qpid.server.store.ber
 
 import java.util.UUID;
 
+import com.sleepycat.bind.EntryBinding;
 import com.sleepycat.bind.tuple.TupleBinding;
 import com.sleepycat.bind.tuple.TupleInput;
 import com.sleepycat.bind.tuple.TupleOutput;
+import com.sleepycat.je.DatabaseEntry;
 
 import org.apache.qpid.server.store.berkeleydb.entry.QueueEntryKey;
 
-public class QueueEntryBinding extends TupleBinding<QueueEntryKey>
+public class QueueEntryBinding implements EntryBinding<QueueEntryKey>
 {
 
     private static final QueueEntryBinding INSTANCE = new QueueEntryBinding();
@@ -41,19 +43,52 @@ public class QueueEntryBinding extends T
     /** private constructor forces getInstance instead */
     private QueueEntryBinding() { }
 
-    public QueueEntryKey entryToObject(TupleInput tupleInput)
+    public QueueEntryKey entryToObject(DatabaseEntry entry)
     {
-        UUID queueId = new UUID(tupleInput.readLong(), tupleInput.readLong());
-        long messageId = tupleInput.readLong();
+        byte[] data = entry.getData();
+        int offset = entry.getOffset();
+
+        UUID queueId = new UUID(readUnsignedLong(data,offset)^ 0x8000000000000000L, readUnsignedLong(data,offset+8)^ 0x8000000000000000L);
+        long messageId = readUnsignedLong(data,offset+16)^ 0x8000000000000000L;
 
         return new QueueEntryKey(queueId, messageId);
     }
 
-    public void objectToEntry(QueueEntryKey mk, TupleOutput tupleOutput)
+    public void objectToEntry(QueueEntryKey mk, DatabaseEntry entry)
     {
+        byte[] output = new byte[24];
         UUID uuid = mk.getQueueId();
-        tupleOutput.writeLong(uuid.getMostSignificantBits());
-        tupleOutput.writeLong(uuid.getLeastSignificantBits());
-        tupleOutput.writeLong(mk.getMessageId());
+        writeUnsignedLong(uuid.getMostSignificantBits() ^ 0x8000000000000000L, output, 0);
+        writeUnsignedLong(uuid.getLeastSignificantBits() ^ 0x8000000000000000L, output, 8);
+        writeUnsignedLong(mk.getMessageId() ^ 0x8000000000000000L, output, 16);
+        entry.setData(output);
+    }
+
+    private void writeUnsignedLong(long val, byte[] data, int offset)
+    {
+        data[offset++] = (byte) (val >>> 56);
+        data[offset++] = (byte) (val >>> 48);
+        data[offset++] = (byte) (val >>> 40);
+        data[offset++] = (byte) (val >>> 32);
+        data[offset++] = (byte) (val >>> 24);
+        data[offset++] = (byte) (val >>> 16);
+        data[offset++] = (byte) (val >>> 8);
+        data[offset] = (byte) val;
     }
-}
\ No newline at end of file
+
+    private long readUnsignedLong(final byte[] data, int offset)
+    {
+        return (((long)data[offset++] & 0xffl) << 56)
+               | (((long)data[offset++] & 0xffl) << 48)
+               | (((long)data[offset++] & 0xffl) << 40)
+               | (((long)data[offset++] & 0xffl) << 32)
+               | (((long)data[offset++] & 0xffl) << 24)
+               | (((long)data[offset++] & 0xffl) << 16)
+               | (((long)data[offset++] & 0xffl) << 8)
+               | ((long)data[offset] & 0xffl) ;
+    }
+
+
+
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org