@@ -2,6 +2,7 @@ package v3iohttp
22
33import (
44 "bytes"
5+ goctx "context"
56 "crypto/tls"
67 "encoding/base64"
78 "encoding/json"
@@ -26,17 +27,19 @@ import (
2627 "github.com/nuclio/errors"
2728 "github.com/nuclio/logger"
2829 "github.com/valyala/fasthttp"
30+ "golang.org/x/sync/semaphore"
2931 "zombiezen.com/go/capnproto2"
3032)
3133
3234// TODO: Request should have a global pool
3335var requestID uint64
3436
3537type context struct {
36- logger logger.Logger
37- requestChan chan * v3io.Request
38- httpClient * fasthttp.Client
39- numWorkers int
38+ logger logger.Logger
39+ requestChan chan * v3io.Request
40+ httpClient * fasthttp.Client
41+ numWorkers int
42+ connSemaphore * semaphore.Weighted
4043}
4144
4245type NewClientInput struct {
@@ -89,6 +92,10 @@ func NewContext(parentLogger logger.Logger, newContextInput *NewContextInput) (v
8992 numWorkers : numWorkers ,
9093 }
9194
95+ if newContextInput .MaxConns > 0 {
96+ newContext .connSemaphore = semaphore .NewWeighted (int64 (newContextInput .MaxConns ))
97+ }
98+
9299 for workerIndex := 0 ; workerIndex < numWorkers ; workerIndex ++ {
93100 go newContext .workerEntry (workerIndex )
94101 }
@@ -997,11 +1004,17 @@ func (c *context) sendRequest(dataPlaneInput *v3io.DataPlaneInput,
9971004 "method" , method ,
9981005 "body-length" , len (body ))
9991006
1007+ if c .connSemaphore != nil {
1008+ c .connSemaphore .Acquire (goctx .TODO (), 1 )
1009+ }
10001010 if dataPlaneInput .Timeout <= 0 {
10011011 err = c .httpClient .Do (request , response .HTTPResponse )
10021012 } else {
10031013 err = c .httpClient .DoTimeout (request , response .HTTPResponse , dataPlaneInput .Timeout )
10041014 }
1015+ if c .connSemaphore != nil {
1016+ c .connSemaphore .Release (1 )
1017+ }
10051018
10061019 if err != nil {
10071020 goto cleanup
0 commit comments