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