From f5707c7969f5bac6700c37c946dbfb0eb9a8d7ef Mon Sep 17 00:00:00 2001 From: Keith Wall Date: Wed, 25 Jul 2012 22:37:21 +0000 Subject: QPID-4164: Prevent the erroneous re-storing of recovered messages during move/copyMessage management functions. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1365832 13f79535-47bb-0310-9956-ffa450edef68 --- .../store/berkeleydb/AbstractBDBMessageStore.java | 45 +++++++++------------- 1 file changed, 18 insertions(+), 27 deletions(-) (limited to 'qpid/java/bdbstore/src/main') diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java index a812436f34..755cb9c89e 100644 --- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java +++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java @@ -546,7 +546,7 @@ public abstract class AbstractBDBMessageStore implements MessageStore long messageId = LongBinding.entryToLong(key); StorableMessageMetaData metaData = valueBinding.entryToObject(value); - StoredBDBMessage message = new StoredBDBMessage(messageId, metaData, false); + StoredBDBMessage message = new StoredBDBMessage(messageId, metaData, true); mrh.message(message); @@ -1576,34 +1576,26 @@ public abstract class AbstractBDBMessageStore implements MessageStore { private final long _messageId; - private volatile SoftReference _metaDataRef; + private final boolean _isRecovered; private StorableMessageMetaData _metaData; - private volatile SoftReference _dataRef; + private volatile SoftReference _metaDataRef; + private byte[] _data; + private volatile SoftReference _dataRef; StoredBDBMessage(long messageId, StorableMessageMetaData metaData) { - this(messageId, metaData, true); + this(messageId, metaData, false); } - - StoredBDBMessage(long messageId, - StorableMessageMetaData metaData, boolean persist) + StoredBDBMessage(long messageId, StorableMessageMetaData metaData, boolean isRecovered) { - try - { - _messageId = messageId; - _metaData = metaData; - - _metaDataRef = new SoftReference(metaData); - - } - catch (DatabaseException e) - { - throw new RuntimeException(e); - } + _messageId = messageId; + _isRecovered = isRecovered; + _metaData = metaData; + _metaDataRef = new SoftReference(metaData); } public StorableMessageMetaData getMetaData() @@ -1693,8 +1685,7 @@ public abstract class AbstractBDBMessageStore implements MessageStore synchronized void store(com.sleepycat.je.Transaction txn) { - - if(unstored()) + if (!stored()) { try { @@ -1724,14 +1715,9 @@ public abstract class AbstractBDBMessageStore implements MessageStore } } - private boolean unstored() - { - return _metaData != null; - } - public synchronized StoreFuture flushToStore() { - if(unstored()) + if(!stored()) { com.sleepycat.je.Transaction txn = _environment.beginTransaction(null, null); store(txn); @@ -1755,6 +1741,11 @@ public abstract class AbstractBDBMessageStore implements MessageStore throw new RuntimeException(e); } } + + private boolean stored() + { + return _metaData == null || _isRecovered; + } } private class BDBTransaction implements org.apache.qpid.server.store.Transaction -- cgit v1.2.1