summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author胡正阳 <huzhengyang@gridsum.com>2021-07-16 09:43:41 +0800
committer胡正阳 <huzhengyang@gridsum.com>2021-08-11 14:50:08 +0800
commitaef4ac3714d7874035aae84c8ceb92245ac0a3fa (patch)
tree74c7280861a6fd340b2e0dc94dbb1c15783bd884
parentMerge pull request #2997 from blackdobb/master (diff)
downloadkubeedge-aef4ac3714d7874035aae84c8ceb92245ac0a3fa.tar.gz
Solve the concurrent map write for metaserver handler.go
update the metamanager server port for test of fluent-bit, reduce lock of the handlers, cancel pointer of the sync.RWMutex Signed-off-by: 胡正阳 <huzhengyang@gridsum.com>
-rw-r--r--edge/pkg/metamanager/metaserver/handlerfactory/handler.go26
-rw-r--r--edge/pkg/metamanager/metaserver/server.go2
2 files changed, 22 insertions, 6 deletions
diff --git a/edge/pkg/metamanager/metaserver/handlerfactory/handler.go b/edge/pkg/metamanager/metaserver/handlerfactory/handler.go
index 66144fb48..74651b5be 100644
--- a/edge/pkg/metamanager/metaserver/handlerfactory/handler.go
+++ b/edge/pkg/metamanager/metaserver/handlerfactory/handler.go
@@ -7,6 +7,7 @@ import (
"io/ioutil"
"net/http"
"strings"
+ "sync"
"time"
"k8s.io/apimachinery/pkg/api/errors"
@@ -33,9 +34,10 @@ type Factory struct {
scope *handlers.RequestScope
MinRequestTimeout time.Duration
handlers map[string]http.Handler
+ lock sync.RWMutex
}
-func NewFactory() Factory {
+func NewFactory() *Factory {
s, err := storage.NewREST()
utilruntime.Must(err)
f := Factory{
@@ -43,23 +45,28 @@ func NewFactory() Factory {
scope: scope.NewRequestScope(),
MinRequestTimeout: 1800 * time.Second,
handlers: make(map[string]http.Handler),
+ lock: sync.RWMutex{},
}
- return f
+ return &f
}
func (f *Factory) Get() http.Handler {
- if h, ok := f.handlers["get"]; ok {
+ if h, ok := f.getHandler("get"); ok {
return h
}
+ f.lock.Lock()
+ defer f.lock.Unlock()
h := handlers.GetResource(f.storage, f.storage, f.scope)
f.handlers["get"] = h
return h
}
func (f *Factory) List() http.Handler {
- if h, ok := f.handlers["list"]; ok {
+ if h, ok := f.getHandler("list"); ok {
return h
}
+ f.lock.Lock()
+ defer f.lock.Unlock()
h := handlers.ListResource(f.storage, f.storage, f.scope, false, f.MinRequestTimeout)
f.handlers["list"] = h
return h
@@ -77,14 +84,23 @@ func (f *Factory) Create(req *request.RequestInfo) http.Handler {
}
func (f *Factory) Delete() http.Handler {
- if h, ok := f.handlers["delete"]; ok {
+ if h, ok := f.getHandler("delete"); ok {
return h
}
+ f.lock.Lock()
+ defer f.lock.Unlock()
h := handlers.DeleteResource(f.storage, false, f.scope, fakers.NewAlwaysAdmit())
f.handlers["delete"] = h
return h
}
+func (f *Factory) getHandler(key string) (http.Handler, bool) {
+ f.lock.RLock()
+ defer f.lock.RUnlock()
+ h, ok := f.handlers[key]
+ return h, ok
+}
+
func (f *Factory) Update(req *request.RequestInfo) http.Handler {
s := scope.NewRequestScope()
s.Kind = schema.GroupVersionKind{
diff --git a/edge/pkg/metamanager/metaserver/server.go b/edge/pkg/metamanager/metaserver/server.go
index e8aa50a67..1f4ba1823 100644
--- a/edge/pkg/metamanager/metaserver/server.go
+++ b/edge/pkg/metamanager/metaserver/server.go
@@ -34,7 +34,7 @@ type MetaServer struct {
RequestTimeout time.Duration
Handler http.Handler
NegotiatedSerializer runtime.NegotiatedSerializer
- Factory handlerfactory.Factory
+ Factory *handlerfactory.Factory
}
func NewMetaServer() *MetaServer {