diff --git a/ipam/allocator.go b/ipam/allocator.go index 28f7f6c7..25c789c5 100644 --- a/ipam/allocator.go +++ b/ipam/allocator.go @@ -456,7 +456,7 @@ func (alloc *Allocator) actorLoop(actionChan <-chan func()) { func (alloc *Allocator) string() string { var buf bytes.Buffer - fmt.Fprintf(&buf, "Allocator subnet %s+%d\n", alloc.subnetStart.String(), alloc.subnetSize) + fmt.Fprintf(&buf, "Allocator subnet %s/%d\n", alloc.subnetStart.String(), alloc.prefixLen) if alloc.ring.Empty() { fmt.Fprintf(&buf, "Paxos: %s", alloc.paxos.String()) @@ -467,16 +467,16 @@ func (alloc *Allocator) string() string { fmt.Fprintf(&buf, " Free IPs: ~%.1f%%, %d local, ~%d remote\n", percentFree, localFreeSpace, remoteFreeSpace) + fmt.Fprint(&buf, "Owned Ranges:") alloc.ring.FprintWithNicknames(&buf, alloc.nicknames) - fmt.Fprintf(&buf, alloc.space.String()) if len(alloc.pendingAllocates)+len(alloc.pendingClaims) > 0 { fmt.Fprintf(&buf, "\nPending requests for ") - } - for _, op := range alloc.pendingAllocates { - fmt.Fprintf(&buf, "%s, ", op.String()) - } - for _, op := range alloc.pendingClaims { - fmt.Fprintf(&buf, "%s, ", op.String()) + for _, op := range alloc.pendingAllocates { + fmt.Fprintf(&buf, "%s, ", op.String()) + } + for _, op := range alloc.pendingClaims { + fmt.Fprintf(&buf, "%s, ", op.String()) + } } } return buf.String() diff --git a/ipam/ring/ring.go b/ipam/ring/ring.go index e4780300..7590a3ce 100644 --- a/ipam/ring/ring.go +++ b/ipam/ring/ring.go @@ -347,20 +347,20 @@ func (r *Ring) ClaimItAll() { } func (r *Ring) FprintWithNicknames(w io.Writer, m map[router.PeerName]string) { - fmt.Fprintf(w, "Ring [%s, %s)\n", r.Start, r.End) for _, entry := range r.Entries { nickname, found := m[entry.Peer] if found { nickname = fmt.Sprintf(" (%s)", nickname) } - fmt.Fprintf(w, " %s -> %s%s (version: %d, free: %d)\n", entry.Token, - entry.Peer, nickname, entry.Version, entry.Free) + fmt.Fprintf(w, "\n %s -> %s%s (v%d)", entry.Token, + entry.Peer, nickname, entry.Version) } } func (r *Ring) String() string { var buffer bytes.Buffer + fmt.Fprintf(&buffer, "Ring [%s, %s)", r.Start, r.End) r.FprintWithNicknames(&buffer, make(map[router.PeerName]string)) return buffer.String() } diff --git a/site/ipam.md b/site/ipam.md index ba8a4cb4..e1ca81b9 100644 --- a/site/ipam.md +++ b/site/ipam.md @@ -115,3 +115,35 @@ brackets, like this: So, in our example, we could equivalently do: host1$ weave rmpeer ea:6c:21:09:cf:f0 + +## Troubleshooting + +The command + + weave status + +reports on the current status of the weave router and IP allocator: + +```` +weave router git-8f675f15c0b5 +... +Allocator subnet 10.2.1.0/24 + Free IPs: ~98.0%, 62 local, ~189 remote +Owned Ranges: + 10.2.1.1 -> 96:e9:e2:2e:2d:bc (host1) (v3) + 10.2.1.128 -> ea:84:25:9b:31:2e (host2) (v3) + 10.2.1.192 -> ea:6c:21:09:cf:f0 (host3) (v9) +```` + +The first section covers the router; see the [troubleshooting +guide](troubleshooting.html#status-report) for full details. + +The 'Allocator' section, which is only present if weave has been +started with the `-iprange` option, summarises the overall position and +lists which address ranges have been assigned to which peer. Each +range begins at the address shown and ends just before the next +address, or wraps around at the end of the subnet. The 'v' number +denotes how many times that entry has been updated. + +The 'Free IPs' information may be out of date with respect to changes +happening elsewhere in the network. diff --git a/site/troubleshooting.md b/site/troubleshooting.md index c12653a3..bca3fa28 100644 --- a/site/troubleshooting.md +++ b/site/troubleshooting.md @@ -126,6 +126,10 @@ not currently connected to. Each line contains some information about what went wrong the last time; whether it is attempting to connect or is waiting for a while before connecting again. +There may also be further sections for +[IP allocator](ipam.html#troubleshooting) and +[weaveDNS](weavedns.html#troubleshooting). + ### List attached containers weave ps