The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7562
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This changes the snapshot index retrieval to consider the storage pool as well. Previously, the behaviour would have been: ``` lxc storage create dir1 dir lxc storage create dir2 dir lxc storage volume create dir1 vol lxc storage volume create dir2 vol lxc storage volume snapshot dir1 vol # creates vol/snap0 lxc storage volume snapshot dir2 vol # creates vol/snap1 ``` Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
From df7cf0fea16a803f538b0cd0d54eb880d585fadc Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 22 Jun 2020 13:39:35 +0200 Subject: [PATCH] lxd: Fix snapshot index retrieval This changes the snapshot index retrieval to consider the storage pool as well. Previously, the behaviour would have been: ``` lxc storage create dir1 dir lxc storage create dir2 dir lxc storage volume create dir1 vol lxc storage volume create dir2 vol lxc storage volume snapshot dir1 vol # creates vol/snap0 lxc storage volume snapshot dir2 vol # creates vol/snap1 ``` Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/db/storage_pools_test.go | 10 +++++++++- lxd/db/storage_volumes.go | 6 ++++-- lxd/storage_volumes_snapshot.go | 6 +++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lxd/db/storage_pools_test.go b/lxd/db/storage_pools_test.go index 7aa75c1eec..b9438dc27d 100644 --- a/lxd/db/storage_pools_test.go +++ b/lxd/db/storage_pools_test.go @@ -220,15 +220,23 @@ func TestCreateStoragePoolVolume_Snapshot(t *testing.T) { poolID, err := cluster.CreateStoragePool("p1", "", "dir", nil) require.NoError(t, err) + poolID1, err := cluster.CreateStoragePool("p2", "", "dir", nil) + require.NoError(t, err) + config := map[string]string{"k": "v"} _, err = cluster.CreateStoragePoolVolume("default", "v1", "", 1, poolID, config) require.NoError(t, err) + _, err = cluster.CreateStoragePoolVolume("default", "v1", "", 1, poolID1, config) + require.NoError(t, err) + config = map[string]string{"k": "v"} _, err = cluster.CreateStorageVolumeSnapshot("default", "v1/snap0", "", 1, poolID, config, time.Time{}) require.NoError(t, err) - n := cluster.GetNextStorageVolumeSnapshotIndex("v1", 1, "snap%d") + n := cluster.GetNextStorageVolumeSnapshotIndex("p1", "v1", 1, "snap%d") assert.Equal(t, n, 1) + n = cluster.GetNextStorageVolumeSnapshotIndex("p2", "v1", 1, "snap%d") + assert.Equal(t, n, 0) } diff --git a/lxd/db/storage_volumes.go b/lxd/db/storage_volumes.go index af000ef4a6..856ae2a0de 100644 --- a/lxd/db/storage_volumes.go +++ b/lxd/db/storage_volumes.go @@ -662,15 +662,17 @@ func (c *Cluster) GetStorageVolumeDescription(volumeID int64) (string, error) { // // Note, the code below doesn't deal with snapshots of snapshots. // To do that, we'll need to weed out based on # slashes in names -func (c *Cluster) GetNextStorageVolumeSnapshotIndex(name string, typ int, pattern string) int { +func (c *Cluster) GetNextStorageVolumeSnapshotIndex(pool, name string, typ int, pattern string) int { q := fmt.Sprintf(` SELECT storage_volumes_snapshots.name FROM storage_volumes_snapshots JOIN storage_volumes ON storage_volumes_snapshots.storage_volume_id=storage_volumes.id + JOIN storage_pools ON storage_volumes.storage_pool_id=storage_pools.id WHERE storage_volumes.type=? AND storage_volumes.name=? + AND storage_pools.name=? `) var numstr string - inargs := []interface{}{typ, name} + inargs := []interface{}{typ, name, pool} outfmt := []interface{}{numstr} results, err := queryScan(c, q, inargs, outfmt) if err != nil { diff --git a/lxd/storage_volumes_snapshot.go b/lxd/storage_volumes_snapshot.go index 22aa0ab8ed..2d68abe51d 100644 --- a/lxd/storage_volumes_snapshot.go +++ b/lxd/storage_volumes_snapshot.go @@ -79,7 +79,7 @@ func storagePoolVolumeSnapshotsTypePost(d *Daemon, r *http.Request) response.Res // Get a snapshot name. if req.Name == "" { - i := d.cluster.GetNextStorageVolumeSnapshotIndex(volumeName, volumeType, "snap%d") + i := d.cluster.GetNextStorageVolumeSnapshotIndex(poolName, volumeName, volumeType, "snap%d") req.Name = fmt.Sprintf("snap%d", i) } @@ -766,7 +766,7 @@ func volumeDetermineNextSnapshotName(d *Daemon, volume db.StorageVolumeArgs, def if count > 1 { return "", fmt.Errorf("Snapshot pattern may contain '%%d' only once") } else if count == 1 { - i := d.cluster.GetNextStorageVolumeSnapshotIndex(volume.Name, db.StoragePoolVolumeTypeCustom, pattern) + i := d.cluster.GetNextStorageVolumeSnapshotIndex(volume.PoolName, volume.Name, db.StoragePoolVolumeTypeCustom, pattern) return strings.Replace(pattern, "%d", strconv.Itoa(i), 1), nil } @@ -814,7 +814,7 @@ func volumeDetermineNextSnapshotName(d *Daemon, volume db.StorageVolumeArgs, def } if snapshotExists { - i := d.cluster.GetNextStorageVolumeSnapshotIndex(volume.Name, db.StoragePoolVolumeTypeCustom, pattern) + i := d.cluster.GetNextStorageVolumeSnapshotIndex(volume.PoolName, volume.Name, db.StoragePoolVolumeTypeCustom, pattern) return strings.Replace(pattern, "%d", strconv.Itoa(i), 1), nil }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel