瀏覽代碼

Merge pull request #6792 from gyuho/leasehttp

leasehttp: use graceful close, add tests, remove TODO
Gyu-Ho Lee 9 年之前
父節點
當前提交
4d2ec2fec1
共有 2 個文件被更改,包括 86 次插入6 次删除
  1. 8 6
      lease/leasehttp/http.go
  2. 78 0
      lease/leasehttp/http_test.go

+ 8 - 6
lease/leasehttp/http.go

@@ -135,11 +135,9 @@ func RenewHTTP(id lease.LeaseID, url string, rt http.RoundTripper, timeout time.
 	cc := &http.Client{Transport: rt, Timeout: timeout}
 	cc := &http.Client{Transport: rt, Timeout: timeout}
 	resp, err := cc.Post(url, "application/protobuf", bytes.NewReader(lreq))
 	resp, err := cc.Post(url, "application/protobuf", bytes.NewReader(lreq))
 	if err != nil {
 	if err != nil {
-		// TODO detect if leader failed and retry?
 		return -1, err
 		return -1, err
 	}
 	}
-	b, err := ioutil.ReadAll(resp.Body)
-	resp.Body.Close()
+	b, err := readResponse(resp)
 	if err != nil {
 	if err != nil {
 		return -1, err
 		return -1, err
 	}
 	}
@@ -182,14 +180,12 @@ func TimeToLiveHTTP(ctx context.Context, id lease.LeaseID, keys bool, url string
 	var b []byte
 	var b []byte
 	errc := make(chan error)
 	errc := make(chan error)
 	go func() {
 	go func() {
-		// TODO detect if leader failed and retry?
 		resp, err := cc.Do(req)
 		resp, err := cc.Do(req)
 		if err != nil {
 		if err != nil {
 			errc <- err
 			errc <- err
 			return
 			return
 		}
 		}
-		b, err = ioutil.ReadAll(resp.Body)
-		resp.Body.Close()
+		b, err = readResponse(resp)
 		if err != nil {
 		if err != nil {
 			errc <- err
 			errc <- err
 			return
 			return
@@ -223,3 +219,9 @@ func TimeToLiveHTTP(ctx context.Context, id lease.LeaseID, keys bool, url string
 	}
 	}
 	return lresp, nil
 	return lresp, nil
 }
 }
+
+func readResponse(resp *http.Response) (b []byte, err error) {
+	b, err = ioutil.ReadAll(resp.Body)
+	httputil.GracefulClose(resp)
+	return
+}

+ 78 - 0
lease/leasehttp/http_test.go

@@ -0,0 +1,78 @@
+// Copyright 2016 The etcd Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package leasehttp
+
+import (
+	"net/http"
+	"net/http/httptest"
+	"os"
+	"testing"
+	"time"
+
+	"github.com/coreos/etcd/lease"
+	"github.com/coreos/etcd/mvcc/backend"
+	"golang.org/x/net/context"
+)
+
+func TestRenewHTTP(t *testing.T) {
+	be, tmpPath := backend.NewTmpBackend(time.Hour, 10000)
+	defer os.Remove(tmpPath)
+	defer be.Close()
+
+	le := lease.NewLessor(be, int64(5))
+	le.Promote(time.Second)
+	l, err := le.Grant(1, int64(5))
+	if err != nil {
+		t.Fatalf("failed to create lease: %v", err)
+	}
+
+	ts := httptest.NewServer(NewHandler(le))
+	defer ts.Close()
+
+	ttl, err := RenewHTTP(l.ID, ts.URL+LeasePrefix, http.DefaultTransport, time.Second)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if ttl != 5 {
+		t.Fatalf("ttl expected 5, got %d", ttl)
+	}
+}
+
+func TestTimeToLiveHTTP(t *testing.T) {
+	be, tmpPath := backend.NewTmpBackend(time.Hour, 10000)
+	defer os.Remove(tmpPath)
+	defer be.Close()
+
+	le := lease.NewLessor(be, int64(5))
+	le.Promote(time.Second)
+	l, err := le.Grant(1, int64(5))
+	if err != nil {
+		t.Fatalf("failed to create lease: %v", err)
+	}
+
+	ts := httptest.NewServer(NewHandler(le))
+	defer ts.Close()
+
+	resp, err := TimeToLiveHTTP(context.TODO(), l.ID, true, ts.URL+LeaseInternalPrefix, http.DefaultTransport)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if resp.LeaseTimeToLiveResponse.ID != 1 {
+		t.Fatalf("lease id expected 1, got %d", resp.LeaseTimeToLiveResponse.ID)
+	}
+	if resp.LeaseTimeToLiveResponse.GrantedTTL != 5 {
+		t.Fatalf("granted TTL expected 5, got %d", resp.LeaseTimeToLiveResponse.GrantedTTL)
+	}
+}