summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-06-24 11:11:38 +0200
committerDan McGee <dan@archlinux.org>2011-06-24 11:11:38 +0200
commit4f8ae2bab61c8fc678589c6840d44977c82d4cc2 (patch)
treeaec21e9a271a51b419ce681f82f8e1753c949b2f
parent7b8f8f69f14dac2bbcd7e96fc548aa084be7cd8e (diff)
downloadpacman-4f8ae2bab61c8fc678589c6840d44977c82d4cc2.tar.gz
pacman-4f8ae2bab61c8fc678589c6840d44977c82d4cc2.tar.xz
Don't require a transaction for sync DB updates
Instead, just do the required locking directly in the backend in calls to alpm_db_update(). Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/be_sync.c42
-rw-r--r--src/pacman/sync.c7
2 files changed, 24 insertions, 25 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index c1703ffe..f51ab97a 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -113,26 +113,22 @@ valid:
* \a force is true, the update will only be performed if the remote
* database was modified since the last update.
*
- * A transaction is necessary for this operation, in order to obtain a
- * database lock. During this transaction the front-end will be informed
- * of the download progress of the database via the download callback.
+ * This operation requires a database lock, and will return an applicable error
+ * if the lock could not be obtained.
*
* Example:
* @code
* alpm_list_t *syncs = alpm_option_get_syncdbs();
- * if(alpm_trans_init(0, NULL, NULL, NULL) == 0) {
- * for(i = syncs; i; i = alpm_list_next(i)) {
- * pmdb_t *db = alpm_list_getdata(i);
- * result = alpm_db_update(0, db);
- * alpm_trans_release();
+ * for(i = syncs; i; i = alpm_list_next(i)) {
+ * pmdb_t *db = alpm_list_getdata(i);
+ * result = alpm_db_update(0, db);
*
- * if(result < 0) {
- * printf("Unable to update database: %s\n", alpm_strerrorlast());
- * } else if(result == 1) {
- * printf("Database already up to date\n");
- * } else {
- * printf("Database updated\n");
- * }
+ * if(result < 0) {
+ * printf("Unable to update database: %s\n", alpm_strerrorlast());
+ * } else if(result == 1) {
+ * printf("Database already up to date\n");
+ * } else {
+ * printf("Database updated\n");
* }
* }
* @endcode
@@ -162,15 +158,21 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
ASSERT(db != handle->db_local, RET_ERR(handle, PM_ERR_WRONG_ARGS, -1));
ASSERT(db->servers != NULL, RET_ERR(handle, PM_ERR_SERVER_NONE, -1));
- /* make sure we have a sane umask */
- oldmask = umask(0022);
-
syncpath = get_sync_dir(handle);
if(!syncpath) {
return -1;
}
+
+ /* make sure we have a sane umask */
+ oldmask = umask(0022);
+
check_sig = _alpm_db_get_sigverify_level(db);
+ /* attempt to grab a lock */
+ if(_alpm_handle_lock(handle)) {
+ RET_ERR(handle, PM_ERR_HANDLE_LOCK, -1);
+ }
+
for(i = db->servers; i; i = i->next) {
const char *server = i->data;
char *fileurl;
@@ -232,6 +234,10 @@ int SYMEXPORT alpm_db_update(int force, pmdb_t *db)
cleanup:
+ if(_alpm_handle_unlock(handle)) {
+ _alpm_log(handle, PM_LOG_WARNING, _("could not remove lock file %s\n"),
+ alpm_option_get_lockfile(handle));
+ }
free(syncpath);
umask(oldmask);
return ret;
diff --git a/src/pacman/sync.c b/src/pacman/sync.c
index 6c86bd10..f242c827 100644
--- a/src/pacman/sync.c
+++ b/src/pacman/sync.c
@@ -283,10 +283,6 @@ static int sync_synctree(int level, alpm_list_t *syncs)
alpm_list_t *i;
int success = 0, ret;
- if(trans_init(0) == -1) {
- return 0;
- }
-
for(i = syncs; i; i = alpm_list_next(i)) {
pmdb_t *db = alpm_list_getdata(i);
@@ -302,9 +298,6 @@ static int sync_synctree(int level, alpm_list_t *syncs)
}
}
- if(trans_release() == -1) {
- return 0;
- }
/* We should always succeed if at least one DB was upgraded - we may possibly
* fail later with unresolved deps, but that should be rare, and would be
* expected