[lvm-devel] LVM command-line interface for shared snapshots

Mikulas Patocka mpatocka at redhat.com
Tue May 19 20:43:12 UTC 2009


Hi

Here I'm submitting the proposed interface.

The code is at 
http://people.redhat.com/mpatocka/patches/userspace/new-snapshots/preview/ 
--- it is in a very early stage of development, it can currently only 
create the shared store, activate/deactivate it and delete it. It can't 
create or attach the individual snapshots.

BTW. regarding the snapshot merging, the man page for merging non-shared 
snapshots is here:
http://people.redhat.com/mpatocka/patches/userspace/new-snapshots/preview/lvm-merge-man-lvconvert.patch

Mikulas

---

lvcreate -s --sharedstore mikulas -L 192M -c 64k vg1/lv1
lvcreate -s --sharedstore fujita-daniel -L 192M -c 16k vg1/lv1
--- creates shared store vg1/lv1-shared with specified size and chunk size

lvcreate -s -n snapshot_name vg1/lv1
--- creates snapshot in the shared store

The last two command could be combined into one that performs both actions:
lvcreate -s --sharedstore mikulas -L 192M -n snapshot_name vg1/lv1

lvresize -L 256M vg1/lv1-shared
--- resize the shared snapshot store

lvresize -L 1G vg1/snapshot_name
--- resize the filesystem in the snapshot (seems more reasonable than resizing
the common storage)

lvremove vg1/snapshot_name
--- delete the snapshot in the snapshot store (but leave the snapshot
store there)

lvremove vg1/lv1-shared
--- delete the shared store with all the snapshots

The lvs command output should look something like this:
  LV         VG   Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  lv1        vg1  owi-a-  56,00M
  lv1-shared vg1  swi---  12,00M lv1     12%
  snapshot   vg1  swi-a-         lv1
  snapshot2  vg1  swi-a-         lv1
  snapshot3  vg1  swi-a-         lv1

--- it contains the line for the shared volume (so that the admin knows
that there is a shared volume), and will contain each separate line for
each snapshot.


Reasons:

Suppose that there is some web-based or gui interface for management of
virtual machines. The interface has buttons [CREATE VM], [DELETE VM] and
[RESIZE STORE].

The code for the buttons should be same for the situations when there
are zero machines or non-zero machines. So I presume that the shared
store will be create when the package is installed (with command
lvcreate -s --sharedstore mikulas -L 1G vg1/lv_vm)

Then, [CREATE VM] button will execute lvcreate -s -n vm_name vg1/lv_vm
[DELETE VM] will execute lvremove vg1/vm_name
[RESIZE STORE] will execute lvresize -L 2G vg1/lv_vm-shared

Note that the [RESIZE STORE] button must work even in situation when
there are zero virtual machines, that's why we need a separate logical
volume vg1/lv_vm-shared

For admin's convenience (so that he doesn't have to type two commands),
we will implement a command that creates both the store and the first
snapshot:
lvcreate -s --sharedstore mikulas -L 192M -n snapshot_name vg1/lv1



Open questions:

* Should lvremove vg1/snapshot_name remove the whole shared store if the
last snapshot was removed?

For the needs of scripts, it definitely must not. But for admin's
convenience? Add a parameter, like "lvremove -r vg1/snapshot" that will
remove the whole store if this is the last snapshot? Say what you think
about it.


* Regarding --- what would happen if someone specifies "-L sizeM" and
there's already shared store allocated?

Solution 1: ignore the -L parameter. Old scripts (written before
snapshot shared store) will continue to run, the admin just must
estimate the total size and create a shared volume of that size prior to
running the script.

Solution 2: increase the shared-store size by the parameter of -L. In
order to prevent the store from growing forever, we store the increased
size in the snapshot's metadata. When we delete the snapshot, we can
either decrease size of the store (when it'll be implemented ... it
isn't). Or, if we can't decrease the size, we can add the size to the
"credit" variable of the shared store. When further snapshots are
created, their size is subtracted from the "credit" and the shared store
is extended only when the "credit" reches zero.

Initialize shared_store:
shared_store->credit = 0;

Create a snapshot with size L:
snapshot->size = L;
if (L <= shared_shore->credit)
	shared_store->credit -= L;
else {
	extend shared store by (L - shared_store->credit)
	shared_store->credit = 0;
}

Delete a snapshot:
shared_store->credit += snapshot

"credit" and "size" variables are stored in metadata.

This is complicated, but it will keep old scripts written without
shared-store consideration running, reallocating the store as needed and
not overflowing it. The downside is that it is complicated and
non-intuitive, the upside is that all these complications will happen
ONLY if someone specifies the "L" parameter when creating a snapshot in
a shared store, all the other commands will be unaffected by this.

What do you think? Is solution 2 unreasonable overkill? Or not? Would
solution 1 would be sufficient?




More information about the lvm-devel mailing list