()
| 250 | } |
| 251 | |
| 252 | func (shard *Shard) ToSlotsString() (string, error) { |
| 253 | var builder strings.Builder |
| 254 | masterNodeIndex := -1 |
| 255 | for i, node := range shard.Nodes { |
| 256 | if node.IsMaster() { |
| 257 | masterNodeIndex = i |
| 258 | break |
| 259 | } |
| 260 | } |
| 261 | if masterNodeIndex == -1 { |
| 262 | return "", errors.New("missing master node") |
| 263 | } |
| 264 | |
| 265 | for i, node := range shard.Nodes { |
| 266 | builder.WriteString(node.ID()) |
| 267 | builder.WriteByte(' ') |
| 268 | builder.WriteString(strings.Replace(node.Addr(), ":", " ", 1)) |
| 269 | builder.WriteByte(' ') |
| 270 | if i == masterNodeIndex { |
| 271 | builder.WriteString(RoleMaster) |
| 272 | builder.WriteByte(' ') |
| 273 | builder.WriteByte('-') |
| 274 | builder.WriteByte(' ') |
| 275 | for j, slotRange := range shard.SlotRanges { |
| 276 | builder.WriteString(slotRange.String()) |
| 277 | if j != len(shard.SlotRanges)-1 { |
| 278 | builder.WriteByte(' ') |
| 279 | } |
| 280 | } |
| 281 | } else { |
| 282 | builder.WriteString(RoleSlave) |
| 283 | builder.WriteByte(' ') |
| 284 | builder.WriteString(shard.Nodes[masterNodeIndex].ID()) |
| 285 | } |
| 286 | builder.WriteByte('\n') |
| 287 | } |
| 288 | return builder.String(), nil |
| 289 | } |
| 290 | |
| 291 | // UnmarshalJSON unmarshal a Shard from JSON bytes, |
| 292 | // it's required since Shard.Nodes is an interface slice. |
no test coverage detected