This is an automated email from the ASF dual-hosted git repository.

asifdxtreme pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new ce5b2fc  SCB-155 SC panic when report metrics concurrently. (#239)
ce5b2fc is described below

commit ce5b2fc1fd31f4b8297562609990cdeb7c7b2d3f
Author: little-cui <[email protected]>
AuthorDate: Tue Jan 2 22:37:57 2018 +0800

    SCB-155 SC panic when report metrics concurrently. (#239)
    
    * SCB-155 SC panic when report metrics concurrently.
    
    * SCB-155 SC panic when report metrics concurrently.
---
 server/bootstrap/bootstrap.go                      |  4 +++
 server/handler/auth/{handler.go => auth.go}        |  0
 server/handler/{auth => metric}/handler.go         | 37 +++++++++++-----------
 .../{rest/metrics.go => handler/metric/metric.go}  |  2 +-
 server/rest/handler.go                             |  9 +++---
 5 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/server/bootstrap/bootstrap.go b/server/bootstrap/bootstrap.go
index f7d705c..c32acb4 100644
--- a/server/bootstrap/bootstrap.go
+++ b/server/bootstrap/bootstrap.go
@@ -48,6 +48,7 @@ import (
        
"github.com/apache/incubator-servicecomb-service-center/server/handler/auth"
        
"github.com/apache/incubator-servicecomb-service-center/server/handler/cache"
        
"github.com/apache/incubator-servicecomb-service-center/server/handler/context"
+       
"github.com/apache/incubator-servicecomb-service-center/server/handler/metric"
        
"github.com/apache/incubator-servicecomb-service-center/server/interceptor"
        
"github.com/apache/incubator-servicecomb-service-center/server/interceptor/access"
        
"github.com/apache/incubator-servicecomb-service-center/server/interceptor/cors"
@@ -57,10 +58,13 @@ import (
 func init() {
        util.Logger().Info("BootStrap ServiceComb.io Edition")
 
+       // intercept requests before routing.
        interceptor.RegisterInterceptFunc(access.Intercept)
        interceptor.RegisterInterceptFunc(ratelimiter.Intercept)
        interceptor.RegisterInterceptFunc(cors.Intercept)
 
+       // handle requests after routing.
+       metric.RegisterHandlers()
        auth.RegisterHandlers()
        context.RegisterHandlers()
        cache.RegisterHandlers()
diff --git a/server/handler/auth/handler.go b/server/handler/auth/auth.go
similarity index 100%
copy from server/handler/auth/handler.go
copy to server/handler/auth/auth.go
diff --git a/server/handler/auth/handler.go b/server/handler/metric/handler.go
similarity index 58%
rename from server/handler/auth/handler.go
rename to server/handler/metric/handler.go
index c01217d..5b54d2f 100644
--- a/server/handler/auth/handler.go
+++ b/server/handler/metric/handler.go
@@ -14,37 +14,36 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package auth
+package metric
 
 import (
        "github.com/apache/incubator-servicecomb-service-center/pkg/chain"
        "github.com/apache/incubator-servicecomb-service-center/pkg/rest"
        "github.com/apache/incubator-servicecomb-service-center/pkg/util"
-       scerr 
"github.com/apache/incubator-servicecomb-service-center/server/error"
-       "github.com/apache/incubator-servicecomb-service-center/server/plugin"
-       
"github.com/apache/incubator-servicecomb-service-center/server/rest/controller"
+       svr "github.com/apache/incubator-servicecomb-service-center/server/rest"
        "net/http"
+       "time"
 )
 
-type AuthRequest struct {
+type MetricsHandler struct {
 }
 
-func (h *AuthRequest) Handle(i *chain.Invocation) {
-       r := i.Context().Value(rest.CTX_REQUEST).(*http.Request)
-       err := plugin.Plugins().Auth().Identify(r)
-       if err == nil {
-               i.Next()
-               return
-       }
+func (h *MetricsHandler) Handle(i *chain.Invocation) {
+       w, r := i.Context().Value(rest.CTX_RESPONSE).(http.ResponseWriter),
+               i.Context().Value(rest.CTX_REQUEST).(*http.Request)
+       cb := i.Func
+       i.Invoke(func(ret chain.Result) {
+               cb(ret)
 
-       util.Logger().Errorf(err, "authenticate request failed, %s %s", 
r.Method, r.RequestURI)
-
-       w := i.Context().Value(rest.CTX_RESPONSE).(http.ResponseWriter)
-       controller.WriteError(w, scerr.ErrUnauthorized, err.Error())
-
-       i.Fail(nil)
+               start, ok := 
i.Context().Value(svr.CTX_START_TIMESTAMP).(time.Time)
+               if !ok {
+                       return
+               }
+               ReportRequestCompleted(w, r, start)
+               util.LogNilOrWarnf(start, "%s %s", r.Method, r.RequestURI)
+       })
 }
 
 func RegisterHandlers() {
-       chain.RegisterHandler(rest.SERVER_CHAIN_NAME, &AuthRequest{})
+       chain.RegisterHandler(rest.SERVER_CHAIN_NAME, &MetricsHandler{})
 }
diff --git a/server/rest/metrics.go b/server/handler/metric/metric.go
similarity index 99%
rename from server/rest/metrics.go
rename to server/handler/metric/metric.go
index 3cdd09f..ff46d32 100644
--- a/server/rest/metrics.go
+++ b/server/handler/metric/metric.go
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package rest
+package metric
 
 import (
        "fmt"
diff --git a/server/rest/handler.go b/server/rest/handler.go
index 19ccb12..154ee8f 100644
--- a/server/rest/handler.go
+++ b/server/rest/handler.go
@@ -25,6 +25,8 @@ import (
        "time"
 )
 
+const CTX_START_TIMESTAMP = "x-start-timestamp"
+
 func init() {
        // api
        http.Handle("/", &ServerHandler{})
@@ -34,7 +36,7 @@ type ServerHandler struct {
 }
 
 func (s *ServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-       start := time.Now()
+       util.SetRequestContext(r, CTX_START_TIMESTAMP, time.Now())
 
        err := interceptor.InvokeInterceptors(w, r)
        if err != nil {
@@ -43,7 +45,6 @@ func (s *ServerHandler) ServeHTTP(w http.ResponseWriter, r 
*http.Request) {
 
        roa.GetRouter().ServeHTTP(w, r)
 
-       ReportRequestCompleted(w, r, start)
-
-       util.LogNilOrWarnf(start, "%s %s", r.Method, r.RequestURI)
+       // CAUTION: There will be cause a concurrent problem,
+       // if here get/set the HTTP request headers.
 }

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to