public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC] btrfs: strategy to perform a rollback at boot time
@ 2020-07-21 20:33 Goffredo Baroncelli
  2020-07-21 20:33 ` [PATCH] btrfs: allow more subvol= option Goffredo Baroncelli
                   ` (4 more replies)
  0 siblings, 5 replies; 16+ messages in thread
From: Goffredo Baroncelli @ 2020-07-21 20:33 UTC (permalink / raw)
  To: linux-btrfs


Hi all,

this is an RFC to discuss a my idea to allow a simple rollback of the
root filesystem at boot time.

The problem that I want to solve is the following: DPKG is very slow on
a BTRFS filesystem. The reason is that DPKG massively uses
sync()/fsync() to guarantee that the filesystem is always coherent even
in case of sudden shutdown.

The same can be useful even to the RPM Linux based distribution (which however
suffer less than DPKG).

A way to avoid the sync()/fsync() calls without loosing the DPKG
guarantees, is:
1) perform a snapshot of the root filesystem (the rollback one)
2) upgrade the filesystem without using sync/fsync
3) final (global) sync
4) destroy the rollback snapshot

If an unclean shutdown happens between 1) and 4), two subvolume exists:
the 'main' one and the 'rollback' one (which is the snapshot before the
update). In this case the system at boot time should mount the "rollback"
subvolume instead of the "main" one. Otherwise in case of a "clean" boot, the
"rollback" subvolume doesn't exist and only the "main" one can be
mounted.

In [1] I discussed a way to implement the steps 1 to 4. (ok, I missed
the point 3) ).

The part that was missed until now, is an automatic way to mount the rollback
subvolume at boot time when it is present.

My idea is to allow more 'subvol=' option. In this case BTRFS tries all the
passed subvolumes until the first succeed. So invoking the kernel as:

  linux root=UUID=xxxx rootflags=subvol=rollback,subvol=main ro 

First, the kernel tries to mount the 'rollback' subvolume. If the rollback
subvolume doesn't exist then it mounts the 'main' subvolume.

Of course after the mount, the system should perform a cleanup of the
subvolumes: i.e. if a rollback subvolume exists, the system should destroy
the "main" one (which contains garbage) and rename "rollback" to "main".
To be more precise:

	if test -d "rollback"; then
		if test -d "old"; then
			btrfs sub del "old"
		fi
		if test -d "main"; then
			mv "main" "old"
		fi
		mv "rollback" "main"
		btrfs sub del "old"
	fi

Comments are welcome
BR
G.Baroncelli

[1] http://lore.kernel.org/linux-btrfs/69396573-b5b3-b349-06f5-f5b74eb9720d@libero.it/

P.S.
I am guessing if an idea like this can be applied to a file. E.g. a sqlite
database that instead of reling to sync/fsync, creates a reflink file as
"rollback" if something goes wrong.... The ordering is preserved. Not the
duration.


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2020-07-27 17:34 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-07-21 20:33 [RFC] btrfs: strategy to perform a rollback at boot time Goffredo Baroncelli
2020-07-21 20:33 ` [PATCH] btrfs: allow more subvol= option Goffredo Baroncelli
2020-07-21 20:50   ` Steven Davies
2020-07-22  1:12   ` kernel test robot
2020-07-21 20:55 ` [RFC] btrfs: strategy to perform a rollback at boot time Steven Davies
2020-07-23 19:52   ` Goffredo Baroncelli
2020-07-21 21:09 ` Chris Murphy
2020-07-22  0:21 ` Nicholas D Steeves
2020-07-23 20:02   ` Goffredo Baroncelli
2020-07-23 21:53 ` Zygo Blaxell
2020-07-24 11:56   ` Goffredo Baroncelli
2020-07-24 22:08     ` Chris Murphy
2020-07-25  2:37     ` Zygo Blaxell
2020-07-27 12:26     ` David Sterba
2020-07-27 17:25       ` Goffredo Baroncelli
2020-07-27 17:34         ` Goffredo Baroncelli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox