diff --git a/pkg/api/quota/conn_limit.go b/pkg/api/quota/conn_limit.go index 98cfb8b97..913e2142a 100644 --- a/pkg/api/quota/conn_limit.go +++ b/pkg/api/quota/conn_limit.go @@ -20,6 +20,8 @@ import ( "net" "net/http" "sync" + + "github.com/minio-io/minio/pkg/utils/log" ) // requestLimitHandler @@ -30,6 +32,10 @@ type connLimit struct { limit int } +func (c *connLimit) GetUsed(ip uint32) int { + return c.connections[ip] +} + func (c *connLimit) TestAndAdd(ip uint32) bool { c.Lock() defer c.Unlock() @@ -58,12 +64,13 @@ func (c *connLimit) Remove(ip uint32) { func (c *connLimit) ServeHTTP(w http.ResponseWriter, req *http.Request) { host, _, _ := net.SplitHostPort(req.RemoteAddr) longIP := longIP{net.ParseIP(host)}.IptoUint32() - if c.TestAndAdd(longIP) { - defer c.Remove(longIP) - c.handler.ServeHTTP(w, req) - } else { - writeErrorResponse(w, req, ConnectionLimitExceeded, req.RequestURI) + if !c.TestAndAdd(longIP) { + hosts, _ := net.LookupAddr(uint32ToIP(longIP).String()) + log.Debug.Printf("Offending Host: %s, ConnectionsUSED: %d\n", hosts, c.GetUsed(longIP)) + writeErrorResponse(w, req, ConnectionLimitExceeded, req.URL.Path) } + defer c.Remove(longIP) + c.handler.ServeHTTP(w, req) } // ConnectionLimit limits the number of concurrent connections diff --git a/pkg/api/quota/errors.go b/pkg/api/quota/errors.go index 93e1d21ad..8fe91a965 100644 --- a/pkg/api/quota/errors.go +++ b/pkg/api/quota/errors.go @@ -46,8 +46,8 @@ const ( RequestTimeTooSkewed = iota BandWidthQuotaExceeded BandWidthInsufficientToProceed - SlowDown ConnectionLimitExceeded + SlowDown ) // Golang http doesn't implement these @@ -77,12 +77,17 @@ func writeErrorHeaders(w http.ResponseWriter) { var errorCodeResponse = map[int]Error{ BandWidthQuotaExceeded: { Code: "BandwidthQuotaExceeded", - Description: "Bandwidth Quota Exceeded", + Description: "Bandwidth Quota Exceeded.", HTTPStatusCode: StatusTooManyRequests, }, BandWidthInsufficientToProceed: { Code: "BandwidthQuotaWillBeExceeded", - Description: "Bandwidth quota will be exceeded with this request", + Description: "Bandwidth quota will be exceeded with this request.", + HTTPStatusCode: StatusTooManyRequests, + }, + ConnectionLimitExceeded: { + Code: "ConnectionLimitExceeded", + Description: "Connections Limit Exceeded.", HTTPStatusCode: StatusTooManyRequests, }, SlowDown: { @@ -90,11 +95,6 @@ var errorCodeResponse = map[int]Error{ Description: "Reduce your request rate.", HTTPStatusCode: StatusTooManyRequests, }, - ConnectionLimitExceeded: { - Code: "ConnectionLimit", - Description: "Connection Limit Met", - HTTPStatusCode: StatusTooManyRequests, - }, } // Write error response headers