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]

Reply via email to