VOL-3419: OpenOLT adapter at scale constantly takes more that 10 seconds to react to flows
The patch addresses the following
- Create OpenOltFlowMgr per PON port (instead of one instance for the whole OLT device earlier)
- Create a separate OpenOltGroupMgr - currently one instance for the whole OLT device
- Remove redundant global lock around getting ONU-ID in DeviceHandler module as there exists a
separate per-pon-port lock in ResourceManager module which suffices the required synchronization
- Remove redundant locks in OpenOltFlowMgr module to serialize FlowDelete before FlowAdd
- Rename divideAndAddFlow to processAddFlow. "divideAndAddFlow" was used in 1.x voltha days and
had a different meaning and the name seems to have been blindly ported to 2.x adapter
and does not make sense anymore
Change-Id: I99827963cf242f1db0c27943c97bd05b749ae129
diff --git a/internal/pkg/core/device_handler_test.go b/internal/pkg/core/device_handler_test.go
index 855f42c..1a11b92 100644
--- a/internal/pkg/core/device_handler_test.go
+++ b/internal/pkg/core/device_handler_test.go
@@ -43,6 +43,18 @@
"github.com/opencord/voltha-protos/v3/go/voltha"
)
+const (
+ NumPonPorts = 2
+ OnuIDStart = 1
+ OnuIDEnd = 32
+ AllocIDStart = 1
+ AllocIDEnd = 10
+ GemIDStart = 1
+ GemIDEnd = 10
+ FlowIDStart = 1
+ FlowIDEnd = 10
+)
+
func newMockCoreProxy() *mocks.MockCoreProxy {
mcp := mocks.MockCoreProxy{
Devices: make(map[string]*voltha.Device),
@@ -153,7 +165,7 @@
Pools: []*oop.DeviceInfo_DeviceResourceRanges_Pool{{}},
}}
- deviceInf := &oop.DeviceInfo{Vendor: "openolt", Ranges: oopRanges, Model: "openolt", DeviceId: dh.device.Id, PonPorts: 2}
+ deviceInf := &oop.DeviceInfo{Vendor: "openolt", Ranges: oopRanges, Model: "openolt", DeviceId: dh.device.Id, PonPorts: NumPonPorts}
rsrMgr := resourcemanager.OpenOltResourceMgr{DeviceID: dh.device.Id, DeviceType: dh.device.Type, DevInfo: deviceInf,
KVStore: &db.Backend{
Client: &mocks.MockKVClient{},
@@ -192,7 +204,15 @@
dh.resourceMgr.ResourceMgrs[1] = ponmgr
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
- dh.flowMgr = NewFlowManager(ctx, dh, dh.resourceMgr)
+ dh.groupMgr = NewGroupManager(ctx, dh, dh.resourceMgr)
+ dh.totalPonPorts = NumPonPorts
+ dh.flowMgr = make([]*OpenOltFlowMgr, dh.totalPonPorts)
+ for i := 0; i < int(dh.totalPonPorts); i++ {
+ // Instantiate flow manager
+ if dh.flowMgr[i] = NewFlowManager(ctx, dh, dh.resourceMgr, dh.groupMgr); dh.flowMgr[i] == nil {
+ return nil
+ }
+ }
dh.Client = &mocks.MockOpenoltClient{}
dh.eventMgr = &OpenOltEventMgr{eventProxy: &mocks.MockEventProxy{}, handler: dh}
dh.transitionMap = &TransitionMap{}