The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5537
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) ===
From 509cd4a146b3e9003df1320e19058ec734760163 Mon Sep 17 00:00:00 2001 From: gary-wzl77 <[email protected]> Date: Fri, 1 Mar 2019 11:08:50 +0800 Subject: [PATCH 1/4] tests: avoid needless wait times during image synchronization when clustering. Signed-off-by: gary-wzl77 <[email protected]> --- test/suites/clustering.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/suites/clustering.sh b/test/suites/clustering.sh index bee2480296..9dc641f32d 100644 --- a/test/suites/clustering.sh +++ b/test/suites/clustering.sh @@ -1179,8 +1179,20 @@ test_clustering_image_replication() { spawn_lxd_and_join_cluster "${ns3}" "${bridge}" "${cert}" 3 1 "${LXD_THREE_DIR}" # Wait for the test image to be synced into the joined node on the background - sleep 5 - [ -f "${LXD_THREE_DIR}/images/${fingerprint}" ] || false + retries=10 + while [ "${retries}" != "0" ]; do + if [ ! -f "${LXD_THREE_DIR}/images/${fingerprint}" ]; then + sleep 0.5 + retries=$((retries-1)) + continue + fi + break + done + + if [ "${retries}" -eq 0 ]; then + echo "Images failed to synced into the joined node" + return 1 + fi # Delete the imported image LXD_DIR="${LXD_ONE_DIR}" lxc image delete testimage From 1f609a4a1fd2190b7f12a1d3b65c670aec94d2e8 Mon Sep 17 00:00:00 2001 From: gary-wzl77 <[email protected]> Date: Fri, 1 Mar 2019 11:19:50 +0800 Subject: [PATCH 2/4] Only show the image auto-sync log when clustering. Signed-off-by: gary-wzl77 <[email protected]> --- lxd/images.go | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/lxd/images.go b/lxd/images.go index c5a2a8b7ad..8f7b36e2c2 100644 --- a/lxd/images.go +++ b/lxd/images.go @@ -1998,6 +1998,23 @@ func imageRefresh(d *Daemon, r *http.Request) Response { func autoSyncImagesTask(d *Daemon) (task.Func, task.Schedule) { f := func(ctx context.Context) { + // In order to only have one task operation executed per image when syncing the images + // across the cluster, only leader node can launch the task, no others. + localAddress, err := node.ClusterAddress(d.db) + if err != nil { + logger.Errorf("Failed to get current node address: %v", err) + return + } + leader, err := d.gateway.LeaderAddress() + if err != nil { + logger.Errorf("Failed to get leader node address: %v", err) + return + } + if localAddress != leader { + logger.Debug("Skipping image synchronization task since we're not leader") + return + } + opRun := func(op *operation) error { return autoSyncImages(ctx, d) } @@ -2021,21 +2038,6 @@ func autoSyncImagesTask(d *Daemon) (task.Func, task.Schedule) { } func autoSyncImages(ctx context.Context, d *Daemon) error { - // In order to only have one task operation executed per image when syncing the images - // across the cluster, only leader node can launch the task, no others. - localAddress, err := node.ClusterAddress(d.db) - if err != nil { - return err - } - leader, err := d.gateway.LeaderAddress() - if err != nil { - return err - } - if localAddress != leader { - logger.Debug("Skipping image synchronization since we're not leader") - return nil - } - // Check how many images the current node owns and automatically sync all // available images to other nodes which don't have yet. fingerprints, err := d.cluster.ImagesGetOnCurrentNode() From f2ee2a242da9b59b6a32105589e56a67fb33ca4a Mon Sep 17 00:00:00 2001 From: gary-wzl77 <[email protected]> Date: Fri, 1 Mar 2019 12:03:33 +0800 Subject: [PATCH 3/4] Support to fetch all projects name that the image associated with. Signed-off-by: gary-wzl77 <[email protected]> --- lxd/db/images.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lxd/db/images.go b/lxd/db/images.go index ef23d1d5d7..accf3a6064 100644 --- a/lxd/db/images.go +++ b/lxd/db/images.go @@ -912,6 +912,22 @@ func (c *Cluster) ImagesGetByNodeID(id int64) ([]string, error) { return addresses, err } +// ImagesGetProjectsWithImage returns all projects name that the image associated with the given fingerprint. +func (c *Cluster) ImagesGetProjectsWithImage(fingerprint string) ([]string, error) { + var projects []string + err := c.Transaction(func(tx *ClusterTx) error { + var err error + stmt := ` + SELECT projects.name FROM projects + LEFT JOIN images ON images.project_id = projects.id + WHERE images.fingerprint = ? + ` + projects, err = query.SelectStrings(tx.tx, stmt, fingerprint) + return err + }) + return projects, err +} + // ImageGetNodesWithImage returns the addresses of online nodes which already have the image. func (c *Cluster) ImageGetNodesWithImage(fingerprint string) ([]string, error) { q := ` From e1f99d2cbcb2872903c5d6dc71e49158d7b62018 Mon Sep 17 00:00:00 2001 From: gary-wzl77 <[email protected]> Date: Fri, 1 Mar 2019 12:09:09 +0800 Subject: [PATCH 4/4] Associate image with the right project on the joined node. Signed-off-by: gary-wzl77 <[email protected]> --- lxd/api_cluster.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lxd/api_cluster.go b/lxd/api_cluster.go index 914c4781e2..0cd3069bcd 100644 --- a/lxd/api_cluster.go +++ b/lxd/api_cluster.go @@ -553,8 +553,17 @@ func clusterPutJoin(d *Daemon, req api.ClusterPut) Response { return err } - project := "default" - return d.cluster.ImageAssociateNode(project, fingerprint) + projects, err := d.cluster.ImagesGetProjectsWithImage(fingerprint) + if err != nil { + return err + } + for _, project := range projects { + err := d.cluster.ImageAssociateNode(project, fingerprint) + if err != nil { + return err + } + } + return nil } for _, f := range fingerprints {
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
