This is an automated email from the ASF dual-hosted git repository.

mitchell852 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new d04111c  Update status: Support more than 1 server for a given 
hostname (#4936)
d04111c is described below

commit d04111c107485f663a21ffaa1d262e633235b5ba
Author: Zach Hoffman <[email protected]>
AuthorDate: Thu Aug 6 22:03:56 2020 +0000

    Update status: Support more than 1 server for a given hostname (#4936)
    
    * Use null cachegroup names in recursive CTE base queries to avoid the
    need to filter out those cachegroups later
    
    * Show status pending statuses of ancestors based on the original server's
    ID, which supports accurate results when servers share a hostname
---
 docs/source/api/v3/servers_hostname_update_status.rst  |  2 +-
 traffic_ops/testing/api/v3/serverupdatestatus_test.go  | 18 ++++++++++++++++++
 traffic_ops/traffic_ops_golang/server/put_status.go    |  4 +---
 .../traffic_ops_golang/server/servers_update_status.go | 14 ++++++--------
 4 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/docs/source/api/v3/servers_hostname_update_status.rst 
b/docs/source/api/v3/servers_hostname_update_status.rst
index 767d3f7..022ad2c 100644
--- a/docs/source/api/v3/servers_hostname_update_status.rst
+++ b/docs/source/api/v3/servers_hostname_update_status.rst
@@ -92,4 +92,4 @@ Each object in the returned array\ [1]_ will contain the 
following fields:
                "parent_reval_pending": false
        }]
 
-.. [1] Despite that the returned object is an array, exactly one server's 
information is requested and thus returned. That is to say, the array should 
always have a length of exactly one.
+.. [1] The returned object is an array, and there is no guarantee that one 
server exists for a given hostname. However, for each server in the array, that 
server's update status will be accurate for the server with that particular 
server ID.
diff --git a/traffic_ops/testing/api/v3/serverupdatestatus_test.go 
b/traffic_ops/testing/api/v3/serverupdatestatus_test.go
index 8c00de9..6238c98 100644
--- a/traffic_ops/testing/api/v3/serverupdatestatus_test.go
+++ b/traffic_ops/testing/api/v3/serverupdatestatus_test.go
@@ -482,5 +482,23 @@ func TestSetTopologiesServerUpdateStatuses(t *testing.T) {
                if updateStatusByCacheGroup[otherEdgeCacheGroup].ParentPending {
                        t.Fatalf("expected UpdPending: %t, actual: %t", false, 
updateStatusByCacheGroup[otherEdgeCacheGroup].ParentPending)
                }
+
+               edgeHostName := *cachesByCacheGroup[edgeCacheGroup].HostName
+               *cachesByCacheGroup[edgeCacheGroup].HostName = 
*cachesByCacheGroup[midCacheGroup].HostName
+               _, _, err = 
TOSession.UpdateServerByID(*cachesByCacheGroup[edgeCacheGroup].ID, 
cachesByCacheGroup[edgeCacheGroup])
+               if err != nil {
+                       t.Fatalf("unable to update %s's hostname to %s: %s", 
edgeHostName, *cachesByCacheGroup[midCacheGroup].HostName, err)
+               }
+
+               _, _, err = 
TOSession.GetServerUpdateStatus(*cachesByCacheGroup[midCacheGroup].HostName, 
nil)
+               if err != nil {
+                       t.Fatalf("expected no error getting server updates for 
a non-unique hostname %s, got %s", *cachesByCacheGroup[midCacheGroup].HostName, 
err)
+               }
+
+               *cachesByCacheGroup[edgeCacheGroup].HostName = edgeHostName
+               _, _, err = 
TOSession.UpdateServerByID(*cachesByCacheGroup[edgeCacheGroup].ID, 
cachesByCacheGroup[edgeCacheGroup])
+               if err != nil {
+                       t.Fatalf("unable to revert %s's hostname back to %s: 
%s", edgeHostName, edgeHostName, err)
+               }
        })
 }
diff --git a/traffic_ops/traffic_ops_golang/server/put_status.go 
b/traffic_ops/traffic_ops_golang/server/put_status.go
index fa8f2a2..14c7c00 100644
--- a/traffic_ops/traffic_ops_golang/server/put_status.go
+++ b/traffic_ops/traffic_ops_golang/server/put_status.go
@@ -115,7 +115,7 @@ WITH RECURSIVE topology_descendants AS (
 /* This is the base case of the recursive CTE, the topology node for the
  * cachegroup containing cachegroup $2.
  */
-       SELECT tcp.parent child, tc.cachegroup
+       SELECT tcp.parent child, NULL cachegroup
        FROM cachegroup c
        JOIN topology_cachegroup tc ON c."name" = tc.cachegroup
        JOIN topology_cachegroup_parents tcp ON tc.id = tcp.parent
@@ -133,8 +133,6 @@ UNION ALL
 SELECT c.id
 FROM cachegroup c
 JOIN topology_descendants td ON c."name" = td.cachegroup
-/* Filter out cachegroup id $2 */
-WHERE c.id != $2
 )
 UPDATE server
 SET upd_pending = TRUE
diff --git a/traffic_ops/traffic_ops_golang/server/servers_update_status.go 
b/traffic_ops/traffic_ops_golang/server/servers_update_status.go
index 6372d51..392d997 100644
--- a/traffic_ops/traffic_ops_golang/server/servers_update_status.go
+++ b/traffic_ops/traffic_ops_golang/server/servers_update_status.go
@@ -57,7 +57,7 @@ WITH RECURSIVE topology_ancestors AS (
 /* This is the base case of the recursive CTE, the topology node for the
  * cachegroup containing server $4.
  */
-       SELECT tcp.child parent, tc.cachegroup
+       SELECT tcp.child parent, NULL cachegroup, s.id base_server_id
        FROM "server" s
        JOIN cachegroup c ON s.cachegroup = c.id
        JOIN topology_cachegroup tc ON c."name" = tc.cachegroup
@@ -65,7 +65,7 @@ WITH RECURSIVE topology_ancestors AS (
        WHERE s.host_name = $4
 UNION ALL
 /* Find all direct topology parent nodes tc of a given topology ancestor ta. */
-       SELECT tcp.parent, tc.cachegroup
+       SELECT tcp.parent, tc.cachegroup, ta.base_server_id
        FROM topology_ancestors ta, topology_cachegroup_parents tcp
        JOIN topology_cachegroup tc ON tcp.parent = tc.id
        WHERE ta.parent = tcp.child
@@ -73,12 +73,10 @@ UNION ALL
  * ancestor topology node found by topology_ancestors.
  */
 ), server_topology_ancestors AS (
-SELECT s.id, s.cachegroup, s.cdn_id, s.upd_pending, s.reval_pending, s.status
+SELECT s.id, s.cachegroup, s.cdn_id, s.upd_pending, s.reval_pending, s.status, 
ta.base_server_id
 FROM server s
 JOIN cachegroup c ON s.cachegroup = c.id
 JOIN topology_ancestors ta ON c."name" = ta.cachegroup
-/* Filter out cachegroup of host_name $4 */
-WHERE s.cachegroup != (SELECT s.cachegroup FROM server s WHERE s.host_name = 
$4)
 ), parentservers AS (
        SELECT ps.id, ps.cachegroup, ps.cdn_id, ps.upd_pending, 
ps.reval_pending, ps.status
                FROM server ps
@@ -101,12 +99,12 @@ SELECT
        status.name AS status,
                /* True if the cachegroup parent or any ancestor topology node 
has pending updates. */
                TRUE IN (
-                       SELECT sta.upd_pending FROM server_topology_ancestors 
sta
+                       SELECT sta.upd_pending FROM server_topology_ancestors 
sta WHERE sta.base_server_id = s.id
                        UNION SELECT COALESCE(BOOL_OR(ps.upd_pending), FALSE)
                ) AS parent_upd_pending,
                /* True if the cachegroup parent or any ancestor topology node 
has pending revalidation. */
                TRUE IN (
-                       SELECT sta.reval_pending FROM server_topology_ancestors 
sta
+                       SELECT sta.reval_pending FROM server_topology_ancestors 
sta WHERE sta.base_server_id = s.id
                        UNION SELECT COALESCE(BOOL_OR(ps.reval_pending), FALSE)
                ) AS parent_reval_pending
        FROM use_reval_pending,
@@ -206,7 +204,7 @@ ORDER BY s.id
        var rows *sql.Rows
        var err error
        if hostName == "all" {
-               rows, err = tx.Query(baseSelectStatement + groupBy, 
tc.CacheStatusOffline, tc.UseRevalPendingParameterName, tc.GlobalConfigFileName)
+               rows, err = tx.Query(baseSelectStatement+groupBy, 
tc.CacheStatusOffline, tc.UseRevalPendingParameterName, tc.GlobalConfigFileName)
                if err != nil {
                        log.Errorf("could not execute select server update 
status query: %s\n", err)
                        return nil, tc.DBError

Reply via email to