[Yum-devel] [PATCH] add the btrfs-snapshot plugin to yum-utils
Josef Bacik
josef at toxicpanda.com
Thu Dec 10 14:14:33 UTC 2009
On Thu, Dec 10, 2009 at 12:37 AM, James Antill <james at fedoraproject.org> wrote:
> On Wed, 2009-12-09 at 17:14 -0500, Josef Bacik wrote:
>> Hello,
>>
>> This is my first yum plugin and maybe my second time writing python,
>> so any comments would be greatly appreciated. This plugin simply
>> takes any directory that a package is going to mess with that belongs
>> to a btrfs filesystem while updating/removing the package and takes a
>> snapshot of that btrfs filesystem. The idea here is that if something
>> catastrophic goes wrong, we can always boot into an older snapshot and
>> try and pick up the pieces. I've tested this plugin on my box with a
>> simple package removal and the resulting snapshot is clean, the rpmdb
>> is good and everything is kosher. Thanks,
>
> Mostly cosmetic stuff:
>
>
> 1. Don't do init stuff in init_hook :). Because your plugin only ever
> needs to do anything when we run a transaction, delay everything until
> at least pretrans_hook time.
>
> 2. In python:
>
> dirlist = dirlist + [mntpnt]
>
> ...is done as:
>
> dirlist.append(mntpnt)
>
> 3. Why do you only care about update/erase packages? Install packages
> will run scriplets etc. ... and TS_OBSOLETING is a synonym for TS_UPDATE
> (and most everything else :) dito. TS_OBSOLETED vs. TS_ERASE.
> Also in _probably rare_ cases TS_UPDATED packages could have files in
> very different places than their TS_UPDATING counterparts.
>
The idea was that installing a new application isn't going to cause
anything else to regress, but I forgot about scriptlets, I will change
this.
> 4. Accessing ts.po.dirlist for a "remote" package means the user needs
> to download the filelist MD. This isn't easy to fix :(.
>
I guess the same thing goes for po.filelist and such right?
> 5. You don't take bind() mounts into account
>
Somebody always has to bring up bind() mounts ;). I will see what can
be done about this.
> 6. Opt: Presort dirlist by len(), then you can break on the first match.
>
> 7. snaplist.index(); del == snaplist.remove() (or even better, use a
> set() and do snaplist.del()).
>
> 8. I can see why you're doing the scan, and only snapshoting "what will
> change", but I think this can only lead to madness:
>
> i. Lots of other stuff goes on, Eg. yum history, yumdb, rpmdb.
> ii. Even if you account for all of that ... scriplets can (and
> do) do anything, anywhere.
>
> ...you want this to be a non-default option, I think, and just snapshot
> all of snaplist by default. But that's IMHO.
>
So the idea here is if the user setup a different subvolume for /home
that they don't necessarily want /home snapshotted every time they do
an update. Packages shouldn't be touching users home directory right?
I guess it wouldn't be terrible to do everything, and it would
certainly make things simpler, I'll have to think about it.
> 9. Does it output anything on the error path?
>
Hmm no, I wanted to be as not verbose as possible so users wouldn't
freak out if they saw errors right before their transaction ran, but I
guess we should indicate if there was a failure.
> 10. Call it something generic like "fs-snapshot" or something, even if
> it only works for btrfs atm.
>
Agreed.
>
> 99. Man pages FTW ;) -- esp. if you create a config. option.
>
Sounds good. Thanks for the feedback. Unfortunately my testbox is
also my main workstation, which is having other issues at the moment.
I will hopefully have this all fixed up and re-sent tomorrow. Thank
you,
Josef
More information about the Yum-devel
mailing list