diff options
author | Sascha Silbe <sascha-pgp@silbe.org> | 2010-06-30 19:57:21 (GMT) |
---|---|---|
committer | Sascha Silbe <sascha-pgp@silbe.org> | 2010-06-30 19:57:21 (GMT) |
commit | b1f3837a12c11a373e22932ffdef4230eb4a3eb9 (patch) | |
tree | ef873e99b1aa9fb5b37c4317cb3ff1b5d42a1035 | |
parent | 7b00e7d8155cd1989ba840d5af68fde80e24dc2f (diff) |
fix missing index update when index has been removed between freeze() and thaw()t/freeze
-rw-r--r-- | src/carquinyol/datastore.py | 5 | ||||
-rw-r--r-- | src/carquinyol/layoutmanager.py | 28 | ||||
-rw-r--r-- | tests/test_freeze.py | 17 | ||||
-rw-r--r-- | tests/test_massops.py | 4 |
4 files changed, 42 insertions, 12 deletions
diff --git a/src/carquinyol/datastore.py b/src/carquinyol/datastore.py index d902147..5bc8416 100644 --- a/src/carquinyol/datastore.py +++ b/src/carquinyol/datastore.py @@ -421,6 +421,8 @@ class DataStore(dbus.service.Object): logging.info('Starting to thaw.') + layoutmanager.get_instance().recheck_index_updated() + if self._migrate(): self._rebuild_index() else: @@ -429,6 +431,9 @@ class DataStore(dbus.service.Object): except Exception: logging.exception('Failed to open index, will rebuild') self._rebuild_index() + else: + if not layoutmanager.get_instance().index_updated: + self._update_index() self.frozen = False gobject.idle_add(self._thaw_work_cb, async_cb, async_err_cb, diff --git a/src/carquinyol/layoutmanager.py b/src/carquinyol/layoutmanager.py index 8402b6d..ef4db16 100644 --- a/src/carquinyol/layoutmanager.py +++ b/src/carquinyol/layoutmanager.py @@ -17,6 +17,9 @@ import os import logging +from sugar.logger import trace + + MAX_QUERY_LIMIT = 40960 CURRENT_LAYOUT_VERSION = 4 @@ -89,18 +92,27 @@ class LayoutManager(object): def get_queue_path(self): return os.path.join(self.get_checksums_dir(), 'queue') + def recheck_index_updated(self): + """Check whether the index_updated file exists.""" + index_updated_path = os.path.join(self._root_path, 'index_updated') + self._index_updated = os.path.exists(index_updated_path) + + @trace() def _is_index_updated(self): return self._index_updated + @trace() def _set_index_updated(self, index_updated): - if index_updated != self._index_updated: - self._index_updated = index_updated - - index_updated_path = os.path.join(self._root_path, 'index_updated') - if os.path.exists(index_updated_path): - os.remove(index_updated_path) - else: - open(index_updated_path, 'w').close() + self._index_updated = index_updated + + index_updated_path = os.path.join(self._root_path, 'index_updated') + if not (os.path.exists(index_updated_path) ^ index_updated): + return + + if index_updated: + open(index_updated_path, 'w').close() + else: + os.remove(index_updated_path) index_updated = property(_is_index_updated, _set_index_updated) diff --git a/tests/test_freeze.py b/tests/test_freeze.py index 8ebc02e..fd97a3d 100644 --- a/tests/test_freeze.py +++ b/tests/test_freeze.py @@ -2,6 +2,7 @@ """Test the freeze/thaw feature.""" import os +import shutil import unittest from test_massops import MassOpsTestCase @@ -14,14 +15,24 @@ class FreezeThawTestCase(MassOpsTestCase): # TODO: test queuing - def _test_freeze_thaw(self): + def _test_freeze_thaw_migration(self): """Issue freeze(), force a migration and run thaw().""" self._datastore.freeze(timeout=_DBUS_TIMEOUT_MAX) os.remove(os.environ['HOME']+'/.sugar/default/datastore/version') self._datastore.thaw(timeout=_DBUS_TIMEOUT_MAX) - test_a_freeze_thaw = _test_freeze_thaw - test_y_freeze_thaw = _test_freeze_thaw + def _test_freeze_thaw_reindex(self): + """Issue freeze(), force an index rebuild and run thaw().""" + self._datastore.freeze(timeout=_DBUS_TIMEOUT_MAX) + shutil.rmtree(os.environ['HOME']+'/.sugar/default/datastore/index') + os.remove(os.environ['HOME']+'/.sugar/default/datastore/index_updated') + self._datastore.thaw(timeout=_DBUS_TIMEOUT_MAX) + + test_a_freeze_thaw = _test_freeze_thaw_reindex + test_y10_freeze_thaw = _test_freeze_thaw_reindex + test_y11_update_verify = MassOpsTestCase.test_update_verify + test_y20_freeze_thaw = _test_freeze_thaw_migration + test_y21_update_verify = MassOpsTestCase.test_update_verify def suite(): diff --git a/tests/test_massops.py b/tests/test_massops.py index ac524cf..8082aa6 100644 --- a/tests/test_massops.py +++ b/tests/test_massops.py @@ -143,7 +143,9 @@ class MassOpsTestCase(unittest.TestCase): def test_update_verify(self): """Verify test_update() has changed content and metadata of all entries.""" - for entry in self._datastore.find({}, [], byte_arrays=True)[0]: + entries, total_count = self._datastore.find({}, [], byte_arrays=True) + self.assertEquals(total_count, NUM_RUNS) + for entry in entries: filename = self._datastore.get_filename(entry['uid'], byte_arrays=True) self._filter_properties(entry) |