You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by zr...@apache.org on 2022/04/21 01:37:16 UTC
[trafficcontrol] branch master updated: When updating server status, only queue updates on children in same CDN (#6765)
This is an automated email from the ASF dual-hosted git repository.
zrhoffman 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 5d06e3874b When updating server status, only queue updates on children in same CDN (#6765)
5d06e3874b is described below
commit 5d06e3874b004f04f1e035f41301dbdbc6ece1bb
Author: Rawlin Peters <ra...@apache.org>
AuthorDate: Wed Apr 20 19:37:12 2022 -0600
When updating server status, only queue updates on children in same CDN (#6765)
---
CHANGELOG.md | 1 +
.../testing/api/v4/serverupdatestatus_test.go | 84 ++++++++++++++--------
.../traffic_ops_golang/server/put_status.go | 8 +--
3 files changed, 60 insertions(+), 33 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 269a30baa5..9ac6841b14 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -39,6 +39,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
- Only `operations` and `admin` roles should have the `DELIVERY-SERVICE:UPDATE` permission.
- [#6369](https://github.com/apache/trafficcontrol/pull/6369) Fixed `/acme_accounts` endpoint to validate email and URL fields
- Fixed searching of the ds parameter merge_parent_groups slice.
+- Fixed TO API `PUT /servers/:id/status` to only queue updates on the same CDN as the updated server
- t3c-generate fix for combining remapconfig and cachekeyconfig parameters for MakeRemapDotConfig call.
### Removed
diff --git a/traffic_ops/testing/api/v4/serverupdatestatus_test.go b/traffic_ops/testing/api/v4/serverupdatestatus_test.go
index 8d7b42689a..e4dc57ffd5 100644
--- a/traffic_ops/testing/api/v4/serverupdatestatus_test.go
+++ b/traffic_ops/testing/api/v4/serverupdatestatus_test.go
@@ -468,7 +468,7 @@ func TestSetTopologiesServerUpdateStatuses(t *testing.T) {
midCacheGroup = "topology-mid-cg-04"
)
cacheGroupNames := []string{edgeCacheGroup, otherEdgeCacheGroup, midCacheGroup}
- cachesByCacheGroup := map[string]tc.ServerV40{}
+ cachesByCDNCacheGroup := make(map[string]map[string][]tc.ServerV4)
updateStatusByCacheGroup := map[string]tc.ServerUpdateStatusV40{}
opts := client.NewRequestOptions()
@@ -511,11 +511,25 @@ func TestSetTopologiesServerUpdateStatuses(t *testing.T) {
if len(srvs.Response) < 1 {
t.Fatalf("Expected at least one server in Cache Group #%d - found none", *cacheGroup.ID)
}
- cachesByCacheGroup[cacheGroupName] = srvs.Response[0]
+ for _, s := range srvs.Response {
+ if _, ok := cachesByCDNCacheGroup[*s.CDNName]; !ok {
+ cachesByCDNCacheGroup[*s.CDNName] = make(map[string][]tc.ServerV4)
+ }
+ cachesByCDNCacheGroup[*s.CDNName][cacheGroupName] = append(cachesByCDNCacheGroup[*s.CDNName][cacheGroupName], s)
+ }
+ }
+ cdnNames := make([]string, 0, len(cachesByCDNCacheGroup))
+ for cdn := range cachesByCDNCacheGroup {
+ cdnNames = append(cdnNames, cdn)
+ }
+ if len(cdnNames) < 2 {
+ t.Fatalf("expected servers in at least two CDNs, actual number of CDNs: %d", len(cdnNames))
}
+ cdn1 := cdnNames[0]
+ cdn2 := cdnNames[1]
// update status of MID server to OFFLINE
- resp, _, err := TOSession.UpdateServerStatus(*cachesByCacheGroup[midCacheGroup].ID, tc.ServerPutStatus{
+ resp, _, err := TOSession.UpdateServerStatus(*cachesByCDNCacheGroup[cdn1][midCacheGroup][0].ID, tc.ServerPutStatus{
Status: util.JSONNameOrIDStr{Name: util.StrPtr("OFFLINE")},
OfflineReason: util.StrPtr("testing")}, client.RequestOptions{})
if err != nil {
@@ -524,7 +538,7 @@ func TestSetTopologiesServerUpdateStatuses(t *testing.T) {
opts = client.NewRequestOptions()
for _, cacheGroupName := range cacheGroupNames {
- cgID := *cachesByCacheGroup[cacheGroupName].CachegroupID
+ cgID := *cachesByCDNCacheGroup[cdn1][cacheGroupName][0].CachegroupID
opts.QueryParameters.Set("cachegroup", strconv.Itoa(cgID))
srvs, _, err := TOSession.GetServers(opts)
if err != nil {
@@ -533,52 +547,64 @@ func TestSetTopologiesServerUpdateStatuses(t *testing.T) {
if len(srvs.Response) < 1 {
t.Fatalf("Expected at least one Server in Cache Group #%d, found none", cgID)
}
- srv := srvs.Response[0]
- if srv.HostName == nil || srv.UpdPending == nil || srv.ID == nil {
- t.Fatal("Traffic Ops returned a representation of a server with null or undefined Host Name and/or ID and/or Update Pending flag")
+ for _, s := range srvs.Response {
+ if s.HostName == nil || s.UpdPending == nil || s.ID == nil {
+ t.Fatal("Traffic Ops returned a representation of a server with null or undefined Host Name and/or ID and/or Update Pending flag")
+ }
+ if len(cachesByCDNCacheGroup[*s.CDNName][cacheGroupName]) > 0 {
+ cachesByCDNCacheGroup[*s.CDNName][cacheGroupName] = []tc.ServerV4{}
+ }
+ cachesByCDNCacheGroup[*s.CDNName][cacheGroupName] = append(cachesByCDNCacheGroup[*s.CDNName][cacheGroupName], s)
}
- cachesByCacheGroup[cacheGroupName] = srvs.Response[0]
}
for _, cacheGroupName := range cacheGroupNames {
- updResp, _, err := TOSession.GetServerUpdateStatus(*cachesByCacheGroup[cacheGroupName].HostName, client.RequestOptions{})
+ updResp, _, err := TOSession.GetServerUpdateStatus(*cachesByCDNCacheGroup[cdn1][cacheGroupName][0].HostName, client.RequestOptions{})
if err != nil {
t.Fatalf("unable to get update status for a server from Cache Group '%s': %v - alerts: %+v", cacheGroupName, err, updResp.Alerts)
}
if len(updResp.Response) < 1 {
- t.Fatalf("Expected at least one server with Host Name '%s' to have an update status", *cachesByCacheGroup[cacheGroupName].HostName)
+ t.Fatalf("Expected at least one server with Host Name '%s' to have an update status", *cachesByCDNCacheGroup[cdn1][cacheGroupName][0].HostName)
}
updateStatusByCacheGroup[cacheGroupName] = updResp.Response[0]
}
- // updating the server status does not queue updates within the same cachegroup
- if *cachesByCacheGroup[midCacheGroup].UpdPending {
- t.Fatalf("expected UpdPending: %t, actual: %t", false, *cachesByCacheGroup[midCacheGroup].UpdPending)
+ // updating the server status does not queue updates within the same cachegroup in same CDN
+ if *cachesByCDNCacheGroup[cdn1][midCacheGroup][0].UpdPending {
+ t.Fatalf("expected UpdPending: %t, actual: %t", false, *cachesByCDNCacheGroup[cdn1][midCacheGroup][0].UpdPending)
+ }
+ // updating the server status does not queue updates within the same cachegroup in different CDN
+ if *cachesByCDNCacheGroup[cdn2][midCacheGroup][0].UpdPending {
+ t.Fatalf("expected UpdPending: %t, actual: %t", false, *cachesByCDNCacheGroup[cdn2][midCacheGroup][0].UpdPending)
}
// edgeCacheGroup is a descendant of midCacheGroup
- if !*cachesByCacheGroup[edgeCacheGroup].UpdPending {
- t.Fatalf("expected UpdPending: %t, actual: %t", true, *cachesByCacheGroup[edgeCacheGroup].UpdPending)
+ if !*cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].UpdPending {
+ t.Fatalf("expected UpdPending: %t, actual: %t", true, *cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].UpdPending)
+ }
+ // descendant of midCacheGroup in different CDN should not be queued
+ if *cachesByCDNCacheGroup[cdn2][edgeCacheGroup][0].UpdPending {
+ t.Fatalf("expected UpdPending: %t, actual: %t", false, *cachesByCDNCacheGroup[cdn2][edgeCacheGroup][0].UpdPending)
}
if !updateStatusByCacheGroup[edgeCacheGroup].UpdatePending {
t.Fatalf("expected UpdPending: %t, actual: %t", true, updateStatusByCacheGroup[edgeCacheGroup].UpdatePending)
}
// otherEdgeCacheGroup is not a descendant of midCacheGroup but is still in the same topology
- if *cachesByCacheGroup[otherEdgeCacheGroup].UpdPending {
- t.Fatalf("expected UpdPending: %t, actual: %t", false, *cachesByCacheGroup[otherEdgeCacheGroup].UpdPending)
+ if *cachesByCDNCacheGroup[cdn1][otherEdgeCacheGroup][0].UpdPending {
+ t.Fatalf("expected UpdPending: %t, actual: %t", false, *cachesByCDNCacheGroup[cdn1][otherEdgeCacheGroup][0].UpdPending)
}
if updateStatusByCacheGroup[otherEdgeCacheGroup].UpdatePending {
t.Fatalf("expected UpdPending: %t, actual: %t", false, updateStatusByCacheGroup[otherEdgeCacheGroup].UpdatePending)
}
- squResp, _, err := TOSession.SetServerQueueUpdate(*cachesByCacheGroup[midCacheGroup].ID, true, client.RequestOptions{})
+ squResp, _, err := TOSession.SetServerQueueUpdate(*cachesByCDNCacheGroup[cdn1][midCacheGroup][0].ID, true, client.RequestOptions{})
if err != nil {
- t.Fatalf("cannot update server status on %s: %v - alerts: %+v", *cachesByCacheGroup[midCacheGroup].HostName, err, squResp.Alerts)
+ t.Fatalf("cannot update server status on %s: %v - alerts: %+v", *cachesByCDNCacheGroup[cdn1][midCacheGroup][0].HostName, err, squResp.Alerts)
}
for _, cacheGroupName := range cacheGroupNames {
- updResp, _, err := TOSession.GetServerUpdateStatus(*cachesByCacheGroup[cacheGroupName].HostName, client.RequestOptions{})
+ updResp, _, err := TOSession.GetServerUpdateStatus(*cachesByCDNCacheGroup[cdn1][cacheGroupName][0].HostName, client.RequestOptions{})
if err != nil {
t.Fatalf("unable to get an update status for a server from Cache Group '%s': %v - alerts: %+v", cacheGroupName, err, updResp.Alerts)
}
if len(updResp.Response) < 1 {
- t.Fatalf("Expected at least one server with Host Name '%s' to have an update status", *cachesByCacheGroup[cacheGroupName].HostName)
+ t.Fatalf("Expected at least one server with Host Name '%s' to have an update status", *cachesByCDNCacheGroup[cdn1][cacheGroupName][0].HostName)
}
updateStatusByCacheGroup[cacheGroupName] = updResp.Response[0]
}
@@ -592,20 +618,20 @@ func TestSetTopologiesServerUpdateStatuses(t *testing.T) {
t.Fatalf("expected UpdPending: %t, actual: %t", false, updateStatusByCacheGroup[otherEdgeCacheGroup].ParentPending)
}
- edgeHostName := *cachesByCacheGroup[edgeCacheGroup].HostName
- *cachesByCacheGroup[edgeCacheGroup].HostName = *cachesByCacheGroup[midCacheGroup].HostName
- _, _, err = TOSession.UpdateServer(*cachesByCacheGroup[edgeCacheGroup].ID, cachesByCacheGroup[edgeCacheGroup], client.RequestOptions{})
+ edgeHostName := *cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].HostName
+ *cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].HostName = *cachesByCDNCacheGroup[cdn1][midCacheGroup][0].HostName
+ _, _, err = TOSession.UpdateServer(*cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].ID, cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0], client.RequestOptions{})
if err != nil {
- t.Fatalf("unable to update %s's hostname to %s: %s", edgeHostName, *cachesByCacheGroup[midCacheGroup].HostName, err)
+ t.Fatalf("unable to update %s's hostname to %s: %s", edgeHostName, *cachesByCDNCacheGroup[cdn1][midCacheGroup][0].HostName, err)
}
- updResp, _, err := TOSession.GetServerUpdateStatus(*cachesByCacheGroup[midCacheGroup].HostName, client.RequestOptions{})
+ updResp, _, err := TOSession.GetServerUpdateStatus(*cachesByCDNCacheGroup[cdn1][midCacheGroup][0].HostName, client.RequestOptions{})
if err != nil {
- t.Fatalf("expected no error getting server updates for a non-unique hostname %s, got: %v - alerts: %+v", *cachesByCacheGroup[midCacheGroup].HostName, err, updResp.Alerts)
+ t.Fatalf("expected no error getting server updates for a non-unique hostname %s, got: %v - alerts: %+v", *cachesByCDNCacheGroup[cdn1][midCacheGroup][0].HostName, err, updResp.Alerts)
}
- *cachesByCacheGroup[edgeCacheGroup].HostName = edgeHostName
- _, _, err = TOSession.UpdateServer(*cachesByCacheGroup[edgeCacheGroup].ID, cachesByCacheGroup[edgeCacheGroup], client.RequestOptions{})
+ *cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].HostName = edgeHostName
+ _, _, err = TOSession.UpdateServer(*cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0].ID, cachesByCDNCacheGroup[cdn1][edgeCacheGroup][0], client.RequestOptions{})
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 80ba9b0b5c..d66060a49f 100644
--- a/traffic_ops/traffic_ops_golang/server/put_status.go
+++ b/traffic_ops/traffic_ops_golang/server/put_status.go
@@ -199,14 +199,14 @@ JOIN topology_descendants td ON c."name" = td.cachegroup
)
UPDATE public.server
SET config_update_time = now()
-WHERE (server.cdn_id = $1
- AND server.cachegroup IN (
+WHERE server.cdn_id = $1
+ AND (server.cachegroup IN (
SELECT id
FROM cachegroup
WHERE parent_cachegroup_id = $2
OR secondary_parent_cachegroup_id = $2
- ))
- OR server.cachegroup IN (SELECT stc.id FROM server_topology_descendants stc);
+ )
+ OR server.cachegroup IN (SELECT stc.id FROM server_topology_descendants stc));
`
if _, err := tx.Exec(q, cdnID, parentCachegroupID); err != nil {
return errors.New("queueing updates on child caches: " + err.Error())