[pacman-dev] [PATCH 1/3] Store a package info level flag if we fail to load data

Dan McGee dan at archlinux.org
Fri Jul 29 19:49:36 EDT 2011


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 at 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



More information about the pacman-dev mailing list