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