From cb0d31fd811ce4c8c2f2be8fbcdc10332dd485e7 Mon Sep 17 00:00:00 2001 From: Daishan Peng Date: Mon, 2 Jul 2018 15:27:11 -0700 Subject: [PATCH] reuse transport connection --- core/storage/plugin_unix.go | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/core/storage/plugin_unix.go b/core/storage/plugin_unix.go index 2954d788..a24f80c1 100644 --- a/core/storage/plugin_unix.go +++ b/core/storage/plugin_unix.go @@ -8,7 +8,9 @@ import ( "fmt" "io/ioutil" "net/http" + "path/filepath" "strings" + "sync" "github.com/docker/go-connections/sockets" "github.com/pkg/errors" @@ -16,12 +18,39 @@ import ( "github.com/rancher/log" ) +var transportMap = &transportStore{ + clientMap: make(map[string]*http.Client), + lock: sync.RWMutex{}, +} + +type transportStore struct { + clientMap map[string]*http.Client + lock sync.RWMutex +} + +func (t *transportStore) add(driver string) { + t.lock.Lock() + defer t.lock.Unlock() + if _, ok := t.clientMap[driver]; !ok { + transport := new(http.Transport) + sockets.ConfigureTransport(transport, "unix", filepath.Join(rancherSockDir, driver+".sock")) + t.clientMap[driver] = &http.Client{ + Transport: transport, + } + } +} + +func (t *transportStore) get(driver string) *http.Client { + t.lock.RLock() + defer t.lock.RUnlock() + return t.clientMap[driver] +} + func CallRancherStorageVolumePlugin(volume model.Volume, action string, payload interface{}) (Response, error) { - transport := new(http.Transport) - sockets.ConfigureTransport(transport, "unix", rancherStorageSockPath(volume)) - client := &http.Client{ - Transport: transport, + if transportMap.get(volume.Data.Fields.Driver) == nil { + transportMap.add(volume.Data.Fields.Driver) } + client := transportMap.get(volume.Data.Fields.Driver) url := fmt.Sprintf("http://volume-plugin/VolumeDriver.%v", action) bs, err := json.Marshal(payload)