浏览代码

Remove publisher if no one is listening

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
Michael Crosby 10 年之前
父节点
当前提交
217a2bd1b6
共有 3 个文件被更改,包括 13 次插入2 次删除
  1. 3 0
      daemon/stats_collector.go
  2. 2 2
      integration-cli/docker_api_containers_test.go
  3. 8 0
      pkg/pubsub/publisher.go

+ 3 - 0
daemon/stats_collector.go

@@ -68,6 +68,9 @@ func (s *statsCollector) unsubscribe(c *Container, ch chan interface{}) {
 	publisher := s.publishers[c]
 	if publisher != nil {
 		publisher.Evict(ch)
+		if publisher.Len() == 0 {
+			delete(s.publishers, c)
+		}
 	}
 	s.m.Unlock()
 }

+ 2 - 2
integration-cli/docker_api_containers_test.go

@@ -274,10 +274,10 @@ func TestGetContainerStats(t *testing.T) {
 		t.Fatalf("GET containers/stats sockRequest failed: %v", err)
 	}
 
+	dec := json.NewDecoder(bytes.NewBuffer(body))
 	var s *stats.Stats
-	if err := json.Unmarshal(body, &s); err != nil {
+	if err := dec.Decode(&s); err != nil {
 		t.Fatal(err)
 	}
-
 	logDone("container REST API - check GET containers/stats")
 }

+ 8 - 0
pkg/pubsub/publisher.go

@@ -26,6 +26,14 @@ type Publisher struct {
 	subscribers map[subscriber]struct{}
 }
 
+// Len returns the number of subscribers for the publisher
+func (p *Publisher) Len() int {
+	p.m.RLock()
+	i := len(p.subscribers)
+	p.m.RUnlock()
+	return i
+}
+
 // Subscribe adds a new subscriber to the publisher returning the channel.
 func (p *Publisher) Subscribe() chan interface{} {
 	ch := make(chan interface{}, p.buffer)