Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha 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)
commitb1f3837a12c11a373e22932ffdef4230eb4a3eb9 (patch)
treeef873e99b1aa9fb5b37c4317cb3ff1b5d42a1035
parent7b00e7d8155cd1989ba840d5af68fde80e24dc2f (diff)
fix missing index update when index has been removed between freeze() and thaw()t/freeze
-rw-r--r--src/carquinyol/datastore.py5
-rw-r--r--src/carquinyol/layoutmanager.py28
-rw-r--r--tests/test_freeze.py17
-rw-r--r--tests/test_massops.py4
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)