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

Reply via email to