- check for stale locks when opening write-cursors (#860500, #962750...)
This commit is contained in:
		
							parent
							
								
									52532da53c
								
							
						
					
					
						commit
						e3501faaf5
					
				
							
								
								
									
										56
									
								
								rpm-4.11.x-cursor-failchk.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								rpm-4.11.x-cursor-failchk.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| commit 452553111b9929074bcbb77a49c041582daae0e8 | ||||
| Author: Panu Matilainen <pmatilai@redhat.com> | ||||
| Date:   Tue Feb 5 10:11:19 2013 +0200 | ||||
| 
 | ||||
|     Check for stale db locks when opening write-cursors | ||||
|      | ||||
|     - During long-running transactions its entirely possible for some | ||||
|       other player to come and go leaving stale locks behind and cause | ||||
|       the transaction to get stuck until the cavalry comes along in the | ||||
|       form of somebody else opening the rpmdb, clearing the blockage. | ||||
|     - Presumably dbenv->failchk() is not entirely free of cost so we only | ||||
|       do this for writes which are way more critical and also more prone to | ||||
|       getting stuck. | ||||
|     - dbenv->failchk() could return DB_RUNRECOVER in which case we should | ||||
|       abort everything but we lack a mechanism to do it... just add | ||||
|       a reminder comment for now. | ||||
| 
 | ||||
| diff --git a/lib/backend/db3.c b/lib/backend/db3.c
 | ||||
| index 656486b..de8071b 100644
 | ||||
| --- a/lib/backend/db3.c
 | ||||
| +++ b/lib/backend/db3.c
 | ||||
| @@ -248,7 +248,7 @@ dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags)
 | ||||
|  	DB * db = dbi->dbi_db; | ||||
|  	DBC * cursor; | ||||
|  	int cflags; | ||||
| -	int rc;
 | ||||
| +	int rc = 0;
 | ||||
|  	uint32_t eflags = db_envflags(db); | ||||
|  	 | ||||
|         /* DB_WRITECURSOR requires CDB and writable db */ | ||||
| @@ -259,8 +259,23 @@ dbiCursor dbiCursorInit(dbiIndex dbi, unsigned int flags)
 | ||||
|  	} else | ||||
|  	    cflags = 0; | ||||
|   | ||||
| -	rc = db->cursor(db, NULL, &cursor, cflags);
 | ||||
| -	rc = cvtdberr(dbi, "db->cursor", rc, _debug);
 | ||||
| +	/*
 | ||||
| +	 * Check for stale locks which could block writes "forever".
 | ||||
| +	 * XXX: Should we also do this on reads? Reads are less likely
 | ||||
| +	 *      to get blocked so it seems excessive...
 | ||||
| +	 * XXX: On DB_RUNRECOVER, we should abort everything. Now
 | ||||
| +	 *      we'll just fail to open a cursor again and again and again.
 | ||||
| +	 */
 | ||||
| +	if (cflags & DB_WRITECURSOR) {
 | ||||
| +	    DB_ENV *dbenv = db->get_env(db);
 | ||||
| +	    rc = dbenv->failchk(dbenv, 0);
 | ||||
| +	    rc = cvtdberr(dbi, "dbenv->failchk", rc, _debug);
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	if (rc == 0) {
 | ||||
| +	    rc = db->cursor(db, NULL, &cursor, cflags);
 | ||||
| +	    rc = cvtdberr(dbi, "db->cursor", rc, _debug);
 | ||||
| +	}
 | ||||
|   | ||||
|  	if (rc == 0) { | ||||
|  	    dbc = xcalloc(1, sizeof(*dbc)); | ||||
							
								
								
									
										8
									
								
								rpm.spec
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								rpm.spec
									
									
									
									
									
								
							| @ -21,7 +21,7 @@ | ||||
| Summary: The RPM package management system | ||||
| Name: rpm | ||||
| Version: %{rpmver} | ||||
| Release: %{?snapver:0.%{snapver}.}3%{?dist} | ||||
| Release: %{?snapver:0.%{snapver}.}4%{?dist} | ||||
| Group: System Environment/Base | ||||
| Url: http://www.rpm.org/ | ||||
| Source0: http://rpm.org/releases/testing/%{name}-%{srcver}.tar.bz2 | ||||
| @ -47,6 +47,8 @@ Patch6: rpm-4.9.0-armhfp-logic.patch | ||||
| # Patches already in upstream | ||||
| # http://www.rpm.org/ticket/865 | ||||
| Patch100: 0001-Finish-lua-5.2-support-trac-865.patch | ||||
| # Check for stale locks when opening write-cursors | ||||
| Patch101: rpm-4.11.x-cursor-failchk.patch | ||||
| 
 | ||||
| # These are not yet upstream | ||||
| Patch301: rpm-4.6.0-niagara.patch | ||||
| @ -226,6 +228,7 @@ packages on a system. | ||||
| %patch4 -p1 -b .use-gpg2 | ||||
| 
 | ||||
| %patch100 -p1 -b .lua-5.2 | ||||
| %patch101 -p1 -b .cursor-failchk | ||||
| 
 | ||||
| %patch301 -p1 -b .niagara | ||||
| %patch302 -p1 -b .geode | ||||
| @ -459,6 +462,9 @@ exit 0 | ||||
| %doc COPYING doc/librpm/html/* | ||||
| 
 | ||||
| %changelog | ||||
| * Thu May 16 2013 Panu Matilainen <pmatilai@redhat.com> - - 4.11.0.1-4 | ||||
| - check for stale locks when opening write-cursors (#860500, #962750...) | ||||
| 
 | ||||
| * Fri May 10 2013 Tom Callaway <spot@fedoraproject.org> - 4.11.0.1-3 | ||||
| - lua 5.2 fix from upstream | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user