diff options
| author | 胡正阳 <huzhengyang@gridsum.com> | 2021-07-16 09:43:41 +0800 |
|---|---|---|
| committer | 胡正阳 <huzhengyang@gridsum.com> | 2021-08-11 14:50:08 +0800 |
| commit | aef4ac3714d7874035aae84c8ceb92245ac0a3fa (patch) | |
| tree | 74c7280861a6fd340b2e0dc94dbb1c15783bd884 | |
| parent | Merge pull request #2997 from blackdobb/master (diff) | |
| download | kubeedge-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.go | 26 | ||||
| -rw-r--r-- | edge/pkg/metamanager/metaserver/server.go | 2 |
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 { |
