If we are missing a local database file, we get repeated messages over and over telling us the same thing, rather than being sane and erroring only once. This package adds an INFRQ_ERROR level that is added to the mask if we encounter any errors on a local_db_read() operation, and short circuits future calls if found in the value. This fixes FS#25313. Note that this does not make any behavior changes other than suppressing error messages and repeated code calls to failure cases; we still have more to do in the "local database is hosed" department. Also make a small update to the wrong but unused flags set in be_package; using INFRQ_ALL there was not totally correct. Signed-off-by: Dan McGee <dan@archlinux.org> --- lib/libalpm/be_local.c | 14 +++++++++++--- lib/libalpm/be_package.c | 4 ++-- lib/libalpm/db.h | 3 ++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c index 261ad87..73b533f 100644 --- a/lib/libalpm/be_local.c +++ b/lib/libalpm/be_local.c @@ -533,6 +533,13 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq) /* already loaded all of this info, do nothing */ return 0; } + + if(info->infolevel & INFRQ_ERROR) { + /* We've encountered an error loading this package before. Don't attempt + * repeated reloads, just give up. */ + return -1; + } + _alpm_log(db->handle, ALPM_LOG_FUNCTION, "loading package data for %s : level=0x%x\n", info->name, inforeq); @@ -619,6 +626,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq) } fclose(fp); fp = NULL; + info->infolevel |= INFRQ_DESC; } /* FILES */ @@ -673,6 +681,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq) } fclose(fp); fp = NULL; + info->infolevel |= INFRQ_FILES; } /* INSTALL */ @@ -681,15 +690,14 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq) if(access(path, F_OK) == 0) { info->scriptlet = 1; } + info->infolevel |= INFRQ_SCRIPTLET; } - /* internal */ - info->infolevel |= inforeq; - free(pkgpath); return 0; error: + info->infolevel |= INFRQ_ERROR; free(pkgpath); if(fp) { fclose(fp); diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index 0edaa5a..550f303 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -437,9 +437,9 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle, const char *pkgfile, _alpm_log(handle, ALPM_LOG_DEBUG, "sorting package filelist for %s\n", pkgfile); newpkg->files.files = files_msort(files, files_count); newpkg->files.count = files_count; - newpkg->infolevel = INFRQ_ALL; + newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_FILES | INFRQ_SCRIPTLET; } else { - newpkg->infolevel = INFRQ_BASE | INFRQ_DESC; + newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_SCRIPTLET; } return newpkg; diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index 5c7988b..a09c7e2 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -40,7 +40,8 @@ typedef enum _alpm_dbinfrq_t { INFRQ_SCRIPTLET = (1 << 3), INFRQ_DSIZE = (1 << 4), /* ALL should be info stored in the package or database */ - INFRQ_ALL = 0x1F + INFRQ_ALL = 0x1F, + INFRQ_ERROR = (1 << 31) } alpm_dbinfrq_t; /** Database status. Bitflags. */ -- 1.7.6