Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Use values from config for locking timeouts.
Vsevolod Stakhov committed 11 years ago
commit 991a9769adec89d47ed0d4a3a871dda4b68c8697
parent 34ec3e1
2 files changed +23 -17
modified libpkg/pkg.h.in
@@ -995,9 +995,8 @@ int pkgdb_open_all(struct pkgdb **db, pkgdb_t type, const char *reponame);
/**
 * Locking functions
 */
-
int pkgdb_obtain_lock(struct pkgdb *db, pkgdb_lock_t type, double delay, unsigned int retries);
-
int pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_type,
-
		double delay, unsigned int retries);
+
int pkgdb_obtain_lock(struct pkgdb *db, pkgdb_lock_t type);
+
int pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_type);
int pkgdb_release_lock(struct pkgdb *db, pkgdb_lock_t type);

/**
modified libpkg/pkgdb.c
@@ -4209,15 +4209,24 @@ pkgdb_reset_lock(struct pkgdb *db)
}

static int
-
pkgdb_try_lock(struct pkgdb *db, const char *lock_sql,
-
		double delay, unsigned int retries, pkgdb_lock_t type,
+
pkgdb_try_lock(struct pkgdb *db, const char *lock_sql, pkgdb_lock_t type,
		bool upgrade)
{
	unsigned int tries = 0;
	struct timespec ts;
	int ret = EPKG_END;
+
	const pkg_object *timeout, *max_tries;
+
	int64_t num_timeout = 1, num_maxtries = 1;

-
	while (tries <= retries) {
+
	timeout = pkg_config_get("LOCK_WAIT");
+
	max_tries = pkg_config_get("LOCK_RETRIES");
+

+
	if (timeout)
+
		num_timeout = pkg_object_int(timeout);
+
	if (max_tries)
+
		num_maxtries = pkg_object_int(num_maxtries);
+

+
	while (tries <= num_maxtries) {
		ret = sqlite3_exec(db->sqlite, lock_sql, NULL, NULL, NULL);
		if (ret != SQLITE_OK) {
			if (ret == SQLITE_READONLY && type == PKGDB_LOCK_READONLY) {
@@ -4240,15 +4249,15 @@ pkgdb_try_lock(struct pkgdb *db, const char *lock_sql,
					 * hence switch upgrade to retain
					 */
					pkgdb_remove_lock_pid(db, (int64_t)getpid());
-
					return pkgdb_obtain_lock(db, type, delay, retries - tries);
+
					return pkgdb_obtain_lock(db, type);
				}
				continue;
			}
-
			else if (delay > 0) {
-
				ts.tv_sec = (int)delay;
-
				ts.tv_nsec = (delay - (int)delay) * 1000000000.;
+
			else if (num_timeout > 0) {
+
				ts.tv_sec = (int)num_timeout;
+
				ts.tv_nsec = (num_timeout - (int)num_timeout) * 1000000000.;
				pkg_debug(1, "waiting for database lock for %d times, "
-
						"next try in %.2f seconds", tries, delay);
+
						"next try in %.2f seconds", tries, num_timeout);
				(void)nanosleep(&ts, NULL);
			}
			else {
@@ -4270,8 +4279,7 @@ pkgdb_try_lock(struct pkgdb *db, const char *lock_sql,
}

int
-
pkgdb_obtain_lock(struct pkgdb *db, pkgdb_lock_t type,
-
		double delay, unsigned int retries)
+
pkgdb_obtain_lock(struct pkgdb *db, pkgdb_lock_t type)
{
	int ret;
	const char table_sql[] = ""
@@ -4323,14 +4331,13 @@ pkgdb_obtain_lock(struct pkgdb *db, pkgdb_lock_t type,
		break;
	}

-
	ret = pkgdb_try_lock(db, lock_sql, delay, retries, type, false);
+
	ret = pkgdb_try_lock(db, lock_sql, type, false);

	return (ret);
}

int
-
pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_type,
-
		double delay, unsigned int retries)
+
pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_type)
{
	const char advisory_exclusive_lock_sql[] = ""
		"UPDATE pkg_lock SET exclusive=1,advisory=1 WHERE exclusive=0 AND advisory=1 AND read=0;";
@@ -4340,7 +4347,7 @@ pkgdb_upgrade_lock(struct pkgdb *db, pkgdb_lock_t old_type, pkgdb_lock_t new_typ

	if (old_type == PKGDB_LOCK_ADVISORY && new_type == PKGDB_LOCK_EXCLUSIVE) {
		pkg_debug(1, "want to upgrade advisory to exclusive lock");
-
		ret = pkgdb_try_lock(db, advisory_exclusive_lock_sql, delay, retries,
+
		ret = pkgdb_try_lock(db, advisory_exclusive_lock_sql,
				new_type, true);
	}