2
0
Эх сурвалжийг харах

check: only write to repo if --repair is given

old borg just didn't commit the transaction and
thus caused a transaction rollback if not in
repair mode.

we can't do that anymore, thus we must avoid
modifying the repo if not in repair mode.
Thomas Waldmann 10 сар өмнө
parent
commit
8412168555
1 өөрчлөгдсөн 21 нэмэгдсэн , 10 устгасан
  1. 21 10
      src/borg/archive.py

+ 21 - 10
src/borg/archive.py

@@ -2025,7 +2025,11 @@ class ArchiveChecker:
                 if archive_id not in self.chunks:
                     logger.error("Archive metadata block %s is missing!", bin_to_hex(archive_id))
                     self.error_found = True
-                    self.manifest.archives.delete(info.name)
+                    if self.repair:
+                        logger.error(f"Deleting broken archive {info.name}.")
+                        self.manifest.archives.delete(info.name)
+                    else:
+                        logger.error(f"Would delete broken archive {info.name}.")
                     continue
                 cdata = self.repository.get(archive_id)
                 try:
@@ -2033,7 +2037,11 @@ class ArchiveChecker:
                 except IntegrityError as integrity_error:
                     logger.error("Archive metadata block %s is corrupted: %s", bin_to_hex(archive_id), integrity_error)
                     self.error_found = True
-                    self.manifest.archives.delete(info.name)
+                    if self.repair:
+                        logger.error(f"Deleting broken archive {info.name}.")
+                        self.manifest.archives.delete(info.name)
+                    else:
+                        logger.error(f"Would delete broken archive {info.name}.")
                     continue
                 archive = self.key.unpack_archive(data)
                 archive = ArchiveItem(internal_dict=archive)
@@ -2046,14 +2054,17 @@ class ArchiveChecker:
                         verify_file_chunks(info.name, item)
                     items_buffer.add(item)
                 items_buffer.flush(flush=True)
-                archive.item_ptrs = archive_put_items(
-                    items_buffer.chunks, repo_objs=self.repo_objs, add_reference=add_reference
-                )
-                data = self.key.pack_metadata(archive.as_dict())
-                new_archive_id = self.key.id_hash(data)
-                cdata = self.repo_objs.format(new_archive_id, {}, data, ro_type=ROBJ_ARCHIVE_META)
-                add_reference(new_archive_id, len(data), cdata)
-                self.manifest.archives.create(info.name, new_archive_id, info.ts, overwrite=True)
+                if self.repair:
+                    archive.item_ptrs = archive_put_items(
+                        items_buffer.chunks, repo_objs=self.repo_objs, add_reference=add_reference
+                    )
+                    data = self.key.pack_metadata(archive.as_dict())
+                    new_archive_id = self.key.id_hash(data)
+                    logger.debug(f"archive id old: {bin_to_hex(archive_id)}")
+                    logger.debug(f"archive id new: {bin_to_hex(new_archive_id)}")
+                    cdata = self.repo_objs.format(new_archive_id, {}, data, ro_type=ROBJ_ARCHIVE_META)
+                    add_reference(new_archive_id, len(data), cdata)
+                    self.manifest.archives.create(info.name, new_archive_id, info.ts, overwrite=True)
             pi.finish()
 
     def finish(self):