(w http.ResponseWriter, req *http.Request)
| 56 | } |
| 57 | |
| 58 | func (h *PartitionRingPageHandler) handleGetRequest(w http.ResponseWriter, req *http.Request) { |
| 59 | var ( |
| 60 | ring = h.reader.PartitionRing() |
| 61 | ringDesc = ring.desc |
| 62 | ) |
| 63 | ownedTokens := ringDesc.countTokens() |
| 64 | |
| 65 | // Prepare the data to render partitions in the page. |
| 66 | partitionsByID := make(map[int32]partitionPageData, len(ringDesc.Partitions)) |
| 67 | for id, partition := range ringDesc.Partitions { |
| 68 | owners := ring.PartitionOwnerIDsCopy(id) |
| 69 | slices.Sort(owners) |
| 70 | |
| 71 | partitionsByID[id] = partitionPageData{ |
| 72 | ID: id, |
| 73 | Corrupted: false, |
| 74 | State: partition.State, |
| 75 | StateTimestamp: partition.GetStateTime(), |
| 76 | StateChangeLocked: partition.StateChangeLocked, |
| 77 | OwnerIDs: owners, |
| 78 | Tokens: partition.Tokens, |
| 79 | NumTokens: len(partition.Tokens), |
| 80 | Ownership: distancePercentage(ownedTokens[id]), |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | // Look for owners of non-existing partitions. We want to provide visibility for such case |
| 85 | // and we report the partition in corrupted state. |
| 86 | for ownerID, owner := range ringDesc.Owners { |
| 87 | partition, exists := partitionsByID[owner.OwnedPartition] |
| 88 | |
| 89 | if !exists { |
| 90 | partition = partitionPageData{ |
| 91 | ID: owner.OwnedPartition, |
| 92 | Corrupted: true, |
| 93 | State: PartitionUnknown, |
| 94 | StateTimestamp: time.Time{}, |
| 95 | OwnerIDs: []string{ownerID}, |
| 96 | Tokens: partition.Tokens, |
| 97 | NumTokens: len(partition.Tokens), |
| 98 | Ownership: distancePercentage(ownedTokens[owner.OwnedPartition]), |
| 99 | } |
| 100 | |
| 101 | partitionsByID[owner.OwnedPartition] = partition |
| 102 | } |
| 103 | |
| 104 | if !slices.Contains(partition.OwnerIDs, ownerID) { |
| 105 | partition.OwnerIDs = append(partition.OwnerIDs, ownerID) |
| 106 | partitionsByID[owner.OwnedPartition] = partition |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | // Covert partitions to a list and sort it by ID. |
| 111 | partitions := make([]partitionPageData, 0, len(partitionsByID)) |
| 112 | |
| 113 | for _, partition := range partitionsByID { |
| 114 | partitions = append(partitions, partition) |
| 115 | } |
no test coverage detected