diff options
-rw-r--r-- | scripts/migration/0.8.2/migrate_couch_schema/__init__.py | 17 | ||||
-rw-r--r-- | scripts/migration/0.8.2/tests/conftest.py | 4 |
2 files changed, 17 insertions, 4 deletions
diff --git a/scripts/migration/0.8.2/migrate_couch_schema/__init__.py b/scripts/migration/0.8.2/migrate_couch_schema/__init__.py index edf671ae..f0b456e4 100644 --- a/scripts/migration/0.8.2/migrate_couch_schema/__init__.py +++ b/scripts/migration/0.8.2/migrate_couch_schema/__init__.py @@ -32,9 +32,7 @@ def _get_couch_server(couch_url): def _is_migrateable(db): config_doc = db.get('u1db_config') - if config_doc is None: - return False - return True + return bool(config_doc) def _get_transaction_log(db): @@ -126,6 +124,8 @@ def _migrate_config_doc(db, do_migrate): logger.info("[%s] moving config doc: %s -> %s" % (db.name, old_doc['_id'], new_doc['_id'])) if do_migrate: + # the config doc must not exist, otherwise we would have skipped this + # database. db.save(new_doc) db.delete(old_doc) @@ -167,7 +167,16 @@ def _migrate_sync_docs(db, do_migrate): logger.debug("[%s] moving sync doc: %s -> %s" % (db.name, old_id, new_id)) if do_migrate: - db.save(new_doc) + try: + db.save(new_doc) + except ResourceConflict: + # this sync document already exists. if documents are the same, + # continue with migration. + existing_doc = db.get(new_id) + for key in [GENERATION_KEY, TRANSACTION_ID_KEY, + REPLICA_UID_KEY]: + if existing_doc[key] != new_doc[key]: + raise db.delete(old_doc) diff --git a/scripts/migration/0.8.2/tests/conftest.py b/scripts/migration/0.8.2/tests/conftest.py index 8e49891c..61f6c7ee 100644 --- a/scripts/migration/0.8.2/tests/conftest.py +++ b/scripts/migration/0.8.2/tests/conftest.py @@ -33,6 +33,10 @@ initial_docs = [ {'_id': '_design/syncs'}, {'_id': '_design/transactions', 'views': {'log': {'map': transaction_map}}}, + # add some data from previous interrupted migration + {'_id': '_local/sync_A', 'gen': 0, 'trans_id': '', 'replica_uid': 'A'}, + {'_id': 'gen-0000000002', + 'gen': 2, 'trans_id': 'trans-2', 'doc_id': 'doc2'}, # the following should be removed if found in the dbs {'_id': 'u1db_sync_log'}, {'_id': 'u1db_sync_state'}, |