From a5e4e5a670bfef8eece7713123268965e65c7639 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 6 Jan 2022 20:12:19 +0200 Subject: [PATCH] move resource from protocol to service when a service for a stream is set --- rcmgr.go | 14 +++++++++----- rcmgr_test.go | 12 ++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/rcmgr.go b/rcmgr.go index ed03a97..6615162 100644 --- a/rcmgr.go +++ b/rcmgr.go @@ -406,26 +406,30 @@ func (s *streamScope) SetService(svc string) error { s.Lock() defer s.Unlock() - if s.proto == nil { - return fmt.Errorf("stream scope not attached to a protocol") - } if s.svc != nil { return fmt.Errorf("stream scope already attached to a service") } + if s.proto == nil { + return fmt.Errorf("stream scope not attached to a protocol") + } s.svc = s.rcmgr.getServiceScope(svc) // reserve resources in service - if err := s.svc.ReserveForChild(s.resourceScope.rc.stat()); err != nil { + stat := s.resourceScope.rc.stat() + if err := s.svc.ReserveForChild(stat); err != nil { s.svc.DecRef() s.svc = nil return err } + // remove resources from the protocol + s.proto.ReleaseForChild(stat) + s.proto.DecRef() // removed from constraints + // update constraints constraints := []*resourceScope{ s.peer.resourceScope, - s.proto.resourceScope, s.svc.resourceScope, s.rcmgr.system.resourceScope, } diff --git a/rcmgr_test.go b/rcmgr_test.go index 601ca01..ccb2098 100644 --- a/rcmgr_test.go +++ b/rcmgr_test.go @@ -522,8 +522,8 @@ func TestResourceManager(t *testing.T) { checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 1}) }) checkProtocol(protoA, func(s *resourceScope) { - checkRefCnt(s, 3) - checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 2}) + checkRefCnt(s, 2) + checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 1}) }) checkProtocol(protoB, func(s *resourceScope) { checkRefCnt(s, 2) @@ -555,8 +555,8 @@ func TestResourceManager(t *testing.T) { checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 2}) }) checkProtocol(protoA, func(s *resourceScope) { - checkRefCnt(s, 3) - checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 2}) + checkRefCnt(s, 1) + checkResources(t, &s.rc, network.ScopeStat{}) }) checkProtocol(protoB, func(s *resourceScope) { checkRefCnt(s, 2) @@ -588,8 +588,8 @@ func TestResourceManager(t *testing.T) { checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 2}) }) checkProtocol(protoA, func(s *resourceScope) { - checkRefCnt(s, 3) - checkResources(t, &s.rc, network.ScopeStat{NumStreamsInbound: 2}) + checkRefCnt(s, 1) + checkResources(t, &s.rc, network.ScopeStat{}) }) checkProtocol(protoB, func(s *resourceScope) { checkRefCnt(s, 2)