[pacman-dev] Transaction failure handling

Xavier shiningxc at gmail.com
Thu Sep 6 07:05:23 EDT 2007


On Thu, Aug 30, 2007 at 11:50:51PM +0100, Andrew Fyfe wrote:
> Xavier wrote:
> > 
> > That causes another problem though...
> > in _alpm_trans_release, we have :
> > 
> > 184         /* during a commit do not interrupt immediately, just after a target */
> > 185         if(trans->state == STATE_COMMITING || trans->state == STATE_INTERRUPTED) {
> > 186                 if(trans->state == STATE_COMMITING) {
> > 187                         trans->state = STATE_INTERRUPTED;
> > 188                 }
> > 189                 pm_errno = PM_ERR_TRANS_COMMITING;
> > 190                 return(-1);
> > 191         }
> > 
> > So since the state now stays on STATE_COMMITING (without going back to STATE_PREPARED)
> > when a transaction fails, this code is now run, and the function returns here,
> > without removing the lock.
> > 
> > Now, I'm totally unable to fix this correctly, the thing is, I really don't understand
> > the purpose of this part, what it's intended to do, in which cases, etc ...
> > 
> > It annoyed me that pacman didn't remove the lock on each error (for example,
> > conflicting targets), so I had to hack this, but that most likely kills totally what
> > the original author had in mind, making the code worse than it is.
> > 
> > I guess what I'm trying to say here is that I need someone to look at this,
> > and fix it correctly.
> > Maybe I could revert that previous change in sync.c, so that the state goes back to
> > STATE_PREPARED on failure, and then do the same in add.c / remove.c , but I
> > still don't like that idea..
> > 
> 
> I think this is another +1 for a rewrite. It seems for every bug we fix 
> another harder to fix one pops up to take its place.
> 
> Andrew
> 

Right, probably.
But well, it at least requires a temporary fix in the meantime.
I found where this part I don't understand was introduced.
Fortunately, it is a small commit. Maybe looking at the commit as the whole,
and the one line description can help understand it :
http://projects.archlinux.org/git/?p=pacman.git;a=commit;h=54008798efcc9646f622f6b052ecd83281d57cda




More information about the pacman-dev mailing list