node_delete_cleanup_test.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package service
  2. import (
  3. "strings"
  4. "testing"
  5. "time"
  6. "github.com/mhsanaei/3x-ui/v3/internal/database"
  7. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  8. )
  9. // Deleting a node dropped only its cpu and mem series, while the heartbeat also
  10. // records netUp and netDown, so each deleted node leaked two histories for good.
  11. func TestDeleteNodeDropsEveryMetricSeries(t *testing.T) {
  12. setupConflictDB(t)
  13. node := &model.Node{Id: 9101, Name: "gone", Address: "127.0.0.1", Port: 2096, ApiToken: "tok", Enable: true, Status: "online"}
  14. if err := database.GetDB().Create(node).Error; err != nil {
  15. t.Fatalf("create node: %v", err)
  16. }
  17. ns := NodeService{}
  18. if err := ns.UpdateHeartbeat(node.Id, HeartbeatPatch{
  19. Status: "online", LastHeartbeat: time.Now().Unix(), CpuPct: 1, MemPct: 2, NetUp: 3, NetDown: 4,
  20. }); err != nil {
  21. t.Fatalf("UpdateHeartbeat: %v", err)
  22. }
  23. if err := ns.Delete(node.Id); err != nil {
  24. t.Fatalf("Delete: %v", err)
  25. }
  26. prefix := nodeMetricKey(node.Id, "")
  27. var left []string
  28. nodeMetrics.mu.Lock()
  29. for key := range nodeMetrics.series {
  30. if strings.HasPrefix(key, prefix) {
  31. left = append(left, key)
  32. }
  33. }
  34. nodeMetrics.mu.Unlock()
  35. if len(left) != 0 {
  36. t.Fatalf("metric series left after deleting the node: %v", left)
  37. }
  38. }