ソースを参照

fix concurrent map writes

wenzuochao 6 年 前
コミット
7284577210
3 ファイル変更8 行追加7 行削除
  1. 5 4
      sdk/client.go
  2. 1 1
      sdk/client_test.go
  3. 2 2
      sdk/logger.go

+ 5 - 4
sdk/client.go

@@ -50,7 +50,6 @@ var Version = "0.0.1"
 var defaultConnectTimeout = 5 * time.Second
 var defaultConnectTimeout = 5 * time.Second
 var defaultReadTimeout = 10 * time.Second
 var defaultReadTimeout = 10 * time.Second
 
 
-var fieldMap = make(map[string]string)
 var DefaultUserAgent = fmt.Sprintf("AlibabaCloud (%s; %s) Golang/%s Core/%s", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), Version)
 var DefaultUserAgent = fmt.Sprintf("AlibabaCloud (%s; %s) Golang/%s Core/%s", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), Version)
 
 
 var hookDo = func(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) {
 var hookDo = func(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) {
@@ -453,10 +452,11 @@ func (client *Client) getHTTPSInsecure(request requests.AcsRequest) (insecure bo
 
 
 func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) {
 func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) {
 
 
+	fieldMap := make(map[string]string)
+	initLogMsg(fieldMap)
 	defer func() {
 	defer func() {
-		client.printLog(err)
+		client.printLog(fieldMap, err)
 	}()
 	}()
-	initLogMsg()
 	httpRequest, err := client.buildRequestWithSigner(request, signer)
 	httpRequest, err := client.buildRequestWithSigner(request, signer)
 	if err != nil {
 	if err != nil {
 		return
 		return
@@ -498,7 +498,8 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
 			}
 			}
 		}
 		}
 		if retryTimes > 0 {
 		if retryTimes > 0 {
-			client.printLog(err)
+			client.printLog(fieldMap, err)
+			initLogMsg(fieldMap)
 		}
 		}
 		debug("> %s %s %s", httpRequest.Method, httpRequest.URL.RequestURI(), httpRequest.Proto)
 		debug("> %s %s %s", httpRequest.Method, httpRequest.URL.RequestURI(), httpRequest.Proto)
 		debug("> Host: %s", httpRequest.Host)
 		debug("> Host: %s", httpRequest.Host)

+ 1 - 1
sdk/client_test.go

@@ -478,7 +478,7 @@ func Test_DoAction_WithLogger(t *testing.T) {
 	assert.Equal(t, 500, response.GetHttpStatus())
 	assert.Equal(t, 500, response.GetHttpStatus())
 	assert.Equal(t, true, log.isOpen)
 	assert.Equal(t, true, log.isOpen)
 	assert.Equal(t, "{channel}: \"{method} {code}", client.GetTemplate())
 	assert.Equal(t, "{channel}: \"{method} {code}", client.GetTemplate())
-	assert.Contains(t, client.GetLoggerMsg(), `Alibaba: "GET 500`)
+	assert.Equal(t, client.GetLoggerMsg(), `Alibaba: "GET 500`)
 	assert.Equal(t, "Server Internel Error", response.GetHttpContentString())
 	assert.Equal(t, "Server Internel Error", response.GetHttpContentString())
 }
 }
 
 

+ 2 - 2
sdk/logger.go

@@ -23,7 +23,7 @@ type Logger struct {
 var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
 var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
 var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_headers}", "{cost}"}
 var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_headers}", "{cost}"}
 
 
-func initLogMsg() {
+func initLogMsg(fieldMap map[string]string) {
 	for _, value := range loggerParam {
 	for _, value := range loggerParam {
 		fieldMap[value] = ""
 		fieldMap[value] = ""
 	}
 	}
@@ -96,7 +96,7 @@ func TransToString(object interface{}) string {
 	return string(byt)
 	return string(byt)
 }
 }
 
 
-func (client *Client) printLog(err error) {
+func (client *Client) printLog(fieldMap map[string]string, err error) {
 	if err != nil {
 	if err != nil {
 		fieldMap["{error}"] = err.Error()
 		fieldMap["{error}"] = err.Error()
 	}
 	}