in dcrpm/rpmutil.py [0:0]
def recover_db(self):
# type: () -> None
"""
Runs `db_recover`.
"""
proc = run_with_timeout(
[self.recover_path, "-h", self.dbpath],
RECOVER_TIMEOUT_SEC,
raise_on_nonzero=False,
)
# We've seen an unrecoverable failure mode where
# db_recover segfaults, remediable only by a rebuild
if proc.returncode != StatusCode.SUCCESS:
self.status_logger.warning("db_recover_failed")
if proc.returncode == StatusCode.SEGFAULT:
raise DBNeedsRebuild
else:
raise DcRPMException(
"db_recover returned nonzero exit code ({}): {} {}".format(
proc.returncode, proc.stdout, proc.stderr
)
)
elif self.forensic:
self.status_logger.debug(proc.stderr, extra={"key": "db_recover"})