Author: orudyy
Date: Mon Apr 17 11:22:47 2017
New Revision: 1791684
URL: http://svn.apache.org/viewvc?rev=1791684&view=rev
Log:
QPID-7721: Update preferences store version upon upgrade
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBPreferenceStore.java
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBPreferenceStoreTest.java
qpid/java/trunk/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyPreferenceStoreTest.java
qpid/java/trunk/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBPreferenceStore.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBPreferenceStore.java?rev=1791684&r1=1791683&r2=1791684&view=diff
==============================================================================
---
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBPreferenceStore.java
(original)
+++
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBPreferenceStore.java
Mon Apr 17 11:22:47 2017
@@ -51,6 +51,7 @@ import org.apache.qpid.server.store.pref
import org.apache.qpid.server.store.preferences.PreferenceRecordImpl;
import org.apache.qpid.server.store.preferences.PreferenceStore;
import org.apache.qpid.server.store.preferences.PreferenceStoreUpdater;
+import org.apache.qpid.server.util.Action;
abstract class AbstractBDBPreferenceStore implements PreferenceStore
{
@@ -93,7 +94,8 @@ abstract class AbstractBDBPreferenceStor
}
records = updater.updatePreferences(storedVersion.toString(),
records);
- replace(ids, records);
+
+ removeAndAdd(ids, records, transaction ->
updateVersion(transaction, currentVersion.toString()));
}
return records;
@@ -155,6 +157,13 @@ abstract class AbstractBDBPreferenceStor
public void replace(final Collection<UUID> preferenceRecordsToRemove,
final Collection<PreferenceRecord>
preferenceRecordsToAdd)
{
+ removeAndAdd(preferenceRecordsToRemove, preferenceRecordsToAdd, null);
+ }
+
+ private void removeAndAdd(final Collection<UUID> preferenceRecordsToRemove,
+ final Collection<PreferenceRecord>
preferenceRecordsToAdd,
+ final Action<Transaction> preCommitAction)
+ {
_useOrCloseRWLock.readLock().lock();
try
{
@@ -188,6 +197,12 @@ abstract class AbstractBDBPreferenceStor
}
}
updateOrCreateInternal(txn, preferenceRecordsToAdd);
+
+ if (preCommitAction != null)
+ {
+ preCommitAction.performAction(txn);
+ }
+
txn.commit();
txn = null;
}
@@ -335,18 +350,25 @@ abstract class AbstractBDBPreferenceStor
}
catch (DatabaseNotFoundException e)
{
- preferencesVersionDb =
getEnvironmentFacade().openDatabase(PREFERENCES_VERSION_DB_NAME,
DEFAULT_DATABASE_CONFIG);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- StringBinding.stringToEntry(BrokerModel.MODEL_VERSION, key);
- LongBinding.longToEntry(System.currentTimeMillis(), value);
- preferencesVersionDb.put(null, key, value);
+ preferencesVersionDb = updateVersion(null,
BrokerModel.MODEL_VERSION);
}
return preferencesVersionDb;
}
- private ModelVersion getStoredVersion() throws RuntimeException
+ private Database updateVersion(Transaction txn, final String
currentVersion)
+ {
+ final Database preferencesVersionDb =
+
getEnvironmentFacade().openDatabase(PREFERENCES_VERSION_DB_NAME,
DEFAULT_DATABASE_CONFIG);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ StringBinding.stringToEntry(currentVersion, key);
+ LongBinding.longToEntry(System.currentTimeMillis(), value);
+ preferencesVersionDb.put(txn, key, value);
+ return preferencesVersionDb;
+ }
+
+ ModelVersion getStoredVersion()
{
try(Cursor cursor = getPreferencesVersionDb().openCursor(null, null))
{
Modified:
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBPreferenceStoreTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBPreferenceStoreTest.java?rev=1791684&r1=1791683&r2=1791684&view=diff
==============================================================================
---
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBPreferenceStoreTest.java
(original)
+++
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBPreferenceStoreTest.java
Mon Apr 17 11:22:47 2017
@@ -43,6 +43,7 @@ import com.sleepycat.je.EnvironmentConfi
import org.apache.qpid.server.model.BrokerModel;
import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ModelVersion;
import org.apache.qpid.server.model.preferences.PreferenceTestHelper;
import org.apache.qpid.server.store.berkeleydb.tuple.MapBinding;
import org.apache.qpid.server.store.berkeleydb.tuple.UUIDTupleBinding;
@@ -79,7 +80,7 @@ public class BDBPreferenceStoreTest exte
_testInitialRecords = Arrays.<PreferenceRecord>asList(
new PreferenceRecordImpl(UUID.randomUUID(),
Collections.<String, Object>singletonMap("name", "test")),
new PreferenceRecordImpl(UUID.randomUUID(),
Collections.<String, Object>singletonMap("name", "test1")));
- populateTestData(_testInitialRecords);
+ populateTestData(_testInitialRecords, BrokerModel.MODEL_VERSION);
}
@Override
@@ -96,6 +97,21 @@ public class BDBPreferenceStoreTest exte
}
}
+ public void testVersionAfterUpgrade() throws Exception
+ {
+ FileUtils.delete(_storeFile, true);
+ _storeFile.mkdirs();
+ ModelVersion storeVersion =
+ new ModelVersion(BrokerModel.MODEL_MAJOR_VERSION - 1,
BrokerModel.MODEL_MINOR_VERSION);
+ populateTestData(_testInitialRecords, storeVersion.toString());
+
+ _preferenceStore.openAndLoad(_updater);
+
+ ModelVersion storedVersion = _preferenceStore.getStoredVersion();
+
+ assertEquals("Unexpected version", BrokerModel.MODEL_VERSION,
storedVersion.toString());
+ }
+
public void testOpenAndLoad() throws Exception
{
Collection<PreferenceRecord> recovered =
_preferenceStore.openAndLoad(_updater);
@@ -179,7 +195,7 @@ public class BDBPreferenceStoreTest exte
}
- private void populateTestData(final List<PreferenceRecord> records)
+ private void populateTestData(final List<PreferenceRecord> records, final
String modelVersion)
{
EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
@@ -203,7 +219,7 @@ public class BDBPreferenceStoreTest exte
}
ByteBinding.byteToEntry((byte) 0, value);
- StringBinding.stringToEntry(BrokerModel.MODEL_VERSION, key);
+ StringBinding.stringToEntry(modelVersion, key);
versionDb.put(null, key, value);
}
}
Modified:
qpid/java/trunk/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyPreferenceStoreTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyPreferenceStoreTest.java?rev=1791684&r1=1791683&r2=1791684&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyPreferenceStoreTest.java
(original)
+++
qpid/java/trunk/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/store/derby/DerbyPreferenceStoreTest.java
Mon Apr 17 11:22:47 2017
@@ -29,6 +29,7 @@ import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -43,6 +44,7 @@ import org.slf4j.LoggerFactory;
import org.apache.qpid.server.model.BrokerModel;
import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ModelVersion;
import org.apache.qpid.server.store.jdbc.AbstractJDBCPreferenceStore;
import org.apache.qpid.server.store.preferences.PreferenceRecord;
import org.apache.qpid.server.store.preferences.PreferenceRecordImpl;
@@ -95,6 +97,30 @@ public class DerbyPreferenceStoreTest ex
}
}
+ public void testVersionAfterUpgrade() throws Exception
+ {
+ ModelVersion storeVersion =
+ new ModelVersion(BrokerModel.MODEL_MAJOR_VERSION - 1,
BrokerModel.MODEL_MINOR_VERSION);
+
+ _testConnection = DriverManager.getConnection(_connectionUrl);
+ try (Statement stmt = _testConnection.createStatement())
+ {
+ stmt.execute("CREATE TABLE PREFERENCES_VERSION ( version
VARCHAR(20) NOT NULL )");
+ }
+
+ try (PreparedStatement pstmt =
_testConnection.prepareStatement("INSERT INTO PREFERENCES_VERSION ( version )
VALUES ( ? )"))
+ {
+ pstmt.setString(1, storeVersion.toString());
+ pstmt.execute();
+ }
+
+ _preferenceStore.openAndLoad(_updater);
+
+ ModelVersion storedVersion = _preferenceStore.getPreferencesVersion();
+
+ assertEquals("Unexpected version", BrokerModel.MODEL_VERSION,
storedVersion.toString());
+ }
+
public void testOpenAndLoadEmptyStore() throws Exception
{
Collection<PreferenceRecord> records =
_preferenceStore.openAndLoad(_updater);
@@ -313,5 +339,13 @@ public class DerbyPreferenceStoreTest ex
{
// noop
}
+
+ ModelVersion getPreferencesVersion() throws SQLException
+ {
+ try(Connection connection = getConnection())
+ {
+ return super.getPreferencesVersion(connection);
+ }
+ }
}
}
Modified:
qpid/java/trunk/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java?rev=1791684&r1=1791683&r2=1791684&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
(original)
+++
qpid/java/trunk/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
Mon Apr 17 11:22:47 2017
@@ -109,7 +109,11 @@ public abstract class AbstractJDBCPrefer
}
records =
updater.updatePreferences(preferencesVersion.toString(), records);
- replace(ids, records);
+
+ removeAndAdd(ids,
+ records,
+ transactedConnection ->
updateVersion(transactedConnection,
+
brokerModelVersion.toString()));
}
}
@@ -153,6 +157,13 @@ public abstract class AbstractJDBCPrefer
public void replace(final Collection<UUID> preferenceRecordsToRemove,
final Collection<PreferenceRecord>
preferenceRecordsToAdd)
{
+ removeAndAdd(preferenceRecordsToRemove, preferenceRecordsToAdd, null);
+ }
+
+ private void removeAndAdd(final Collection<UUID> preferenceRecordsToRemove,
+ final Collection<PreferenceRecord>
preferenceRecordsToAdd,
+ final BaseAction<Connection, SQLException>
preCommitAction)
+ {
_useOrCloseRWLock.readLock().lock();
try
{
@@ -181,6 +192,10 @@ public abstract class AbstractJDBCPrefer
}
}
updateOrCreateInternal(connection, preferenceRecordsToAdd);
+ if (preCommitAction != null)
+ {
+ preCommitAction.performAction(connection);
+ }
}
});
}
@@ -376,11 +391,16 @@ public abstract class AbstractJDBCPrefer
stmt.execute(CREATE_PREFERENCES_VERSION_TABLE);
}
- try (PreparedStatement pstmt =
conn.prepareStatement(INSERT_INTO_PREFERENCES_VERSION))
- {
- pstmt.setString(1, BrokerModel.MODEL_VERSION);
- pstmt.execute();
- }
+ updateVersion(conn, BrokerModel.MODEL_VERSION);
+ }
+ }
+
+ private void updateVersion(final Connection conn, final String
currentVersion) throws SQLException
+ {
+ try (PreparedStatement pstmt =
conn.prepareStatement(INSERT_INTO_PREFERENCES_VERSION))
+ {
+ pstmt.setString(1, currentVersion);
+ pstmt.execute();
}
}
@@ -399,27 +419,36 @@ public abstract class AbstractJDBCPrefer
}
}
- private ModelVersion getPreferencesVersion(Connection conn) throws
SQLException
+ protected ModelVersion getPreferencesVersion(Connection conn) throws
SQLException
{
+ ModelVersion storedVersion = null;
try (Statement stmt = conn.createStatement())
{
try (ResultSet rs =
stmt.executeQuery(SELECT_FROM_PREFERENCES_VERSION))
{
- if (rs.next())
+ while (rs.next())
{
String versionString = rs.getString(1);
try
{
- return ModelVersion.fromString(versionString);
+ ModelVersion version =
ModelVersion.fromString(versionString);
+ if (storedVersion == null ||
storedVersion.lessThan(version))
+ {
+ storedVersion = version;
+ }
}
catch (IllegalArgumentException e)
{
throw new StoreException("preference store version is
malformed", e);
}
}
- throw new StoreException("No preferences version found");
}
}
+ if (storedVersion == null)
+ {
+ throw new StoreException("No preferences version found");
+ }
+ return storedVersion;
}
private Collection<PreferenceRecord> getPreferenceRecords(final Connection
connection) throws SQLException
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]