diff --git a/nameserver/entry.go b/nameserver/entry.go index d1c8f830..6d6ba08c 100644 --- a/nameserver/entry.go +++ b/nameserver/entry.go @@ -131,6 +131,7 @@ func (es *Entries) merge(incoming Entries) Entries { return newEntries } +// f returning true means keep the entry. func (es *Entries) tombstone(ourname router.PeerName, f func(*Entry) bool) Entries { es.checkAndPanic() defer es.checkAndPanic() diff --git a/nameserver/http.go b/nameserver/http.go index d85b9970..7b3eb352 100644 --- a/nameserver/http.go +++ b/nameserver/http.go @@ -1,6 +1,7 @@ package nameserver import ( + "encoding/json" "fmt" "net/http" @@ -82,4 +83,12 @@ func (n *Nameserver) HandleHTTP(router *mux.Router) { router.Methods("DELETE").Path("/name/{container}/{ip}").HandlerFunc(deleteHandler) router.Methods("DELETE").Path("/name/{container}").HandlerFunc(deleteHandler) router.Methods("DELETE").Path("/name").HandlerFunc(deleteHandler) + + router.Methods("GET").Path("/name").Headers("Accept", "application/json").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + n.RLock() + defer n.RUnlock() + if err := json.NewEncoder(w).Encode(n.entries); err != nil { + badRequest(w, fmt.Errorf("Error marshalling response: %v", err)) + } + }) } diff --git a/nameserver/nameserver.go b/nameserver/nameserver.go index be4c4987..b56b1dfd 100644 --- a/nameserver/nameserver.go +++ b/nameserver/nameserver.go @@ -176,7 +176,7 @@ func (n *Nameserver) deleteTombstones() { defer n.Unlock() now := time.Now().Unix() n.entries.filter(func(e *Entry) bool { - return now-e.Tombstone <= int64(tombstoneTimeout/time.Second) + return e.Tombstone == 0 || now-e.Tombstone <= int64(tombstoneTimeout/time.Second) }) } diff --git a/nameserver/nameserver_test.go b/nameserver/nameserver_test.go index f0a71ba0..d8884959 100644 --- a/nameserver/nameserver_test.go +++ b/nameserver/nameserver_test.go @@ -230,6 +230,9 @@ func TestTombstoneDeletion(t *testing.T) { require.Nil(t, err) require.Equal(t, []address.Address{0}, nameserver.Lookup("hostname")) + nameserver.deleteTombstones() + require.Equal(t, []address.Address{0}, nameserver.Lookup("hostname")) + err = nameserver.Delete("hostname", "containerid", "", address.Address(0)) require.Nil(t, err) require.Equal(t, []address.Address{}, nameserver.Lookup("hostname")) diff --git a/net/address/address.go b/net/address/address.go index b5ffb265..291a3227 100644 --- a/net/address/address.go +++ b/net/address/address.go @@ -90,6 +90,10 @@ func (addr Address) IP4() (r net.IP) { return } +func (addr Address) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf("%q", addr.String())), nil +} + func (addr Address) String() string { return addr.IP4().String() }