[VOL-5540]:ONT configure/remove flows optimisation
Change-Id: I0d28cec4fe8b78c7d572a2049269c45b82f0c518
Signed-off-by: balaji.nagarajan <balaji.nagarajan@radisys.com>
diff --git a/VERSION b/VERSION
index 5c6b98f..d3acad0 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.6.7
+4.6.8
diff --git a/internal/pkg/core/openolt_flowmgr.go b/internal/pkg/core/openolt_flowmgr.go
index ca1b904..2ffc7a6 100644
--- a/internal/pkg/core/openolt_flowmgr.go
+++ b/internal/pkg/core/openolt_flowmgr.go
@@ -415,7 +415,7 @@
if meterInfo != nil && meterInfo.MeterID == sq.meterID {
logger.Infow(ctx, "scheduler-already-created-for-direction",
log.Fields{"device-id": f.deviceHandler.device.Id, "direction": direction, "meter-id": sq.meterID})
- if err = f.resourceMgr.HandleMeterInfoRefCntUpdate(ctx, direction, sq.onuID, sq.uniID, sq.tpID, true); err != nil {
+ if err = f.resourceMgr.HandleMeterInfoRefCntUpdate(ctx, meterInfo, direction, sq.onuID, sq.uniID, sq.tpID, true); err != nil {
return err
}
@@ -982,10 +982,8 @@
}
logger.Infow(ctx, "stored-tconts-and-gem-into-kv-store-successfully", log.Fields{"device-id": f.deviceHandler.device.Id})
- for _, gemPort := range gemPortIDs {
- if err := f.resourceMgr.AddGemToOnuGemInfo(ctx, onuID, gemPort); err != nil {
- logger.Errorw(ctx, "error-while-uploading-onugeminfos-to-kv-store", log.Fields{"device-id": f.deviceHandler.device.Id, "onuID": onuID, "gemPort": gemPort})
- }
+ if err := f.resourceMgr.AddGemToOnuGemInfo(ctx, onuID, gemPortIDs); err != nil {
+ logger.Errorw(ctx, "error-while-uploading-onugeminfos-to-kv-store", log.Fields{"device-id": f.deviceHandler.device.Id, "onuID": onuID, "gemPort": gemPortIDs})
}
}
@@ -2206,7 +2204,7 @@
}
// Decrement reference count for the meter associated with the given <(pon_id, onu_id, uni_id)>/<tp_id>/meter_id/<direction>
- if err := f.resourceMgr.HandleMeterInfoRefCntUpdate(ctx, flowDirection, uint32(onuID), uint32(uniID), tpID, false); err != nil {
+ if err := f.resourceMgr.HandleMeterInfoRefCntUpdate(ctx, nil, flowDirection, uint32(onuID), uint32(uniID), tpID, false); err != nil {
return err
}
return nil
diff --git a/internal/pkg/resourcemanager/resourcemanager.go b/internal/pkg/resourcemanager/resourcemanager.go
index 6d50348..f5b3f12 100644
--- a/internal/pkg/resourcemanager/resourcemanager.go
+++ b/internal/pkg/resourcemanager/resourcemanager.go
@@ -848,9 +848,12 @@
// HandleMeterInfoRefCntUpdate increments or decrements the reference counter for a given meter.
// When reference count becomes 0, it clears the meter information from the kv store
-func (rsrcMgr *OpenOltResourceMgr) HandleMeterInfoRefCntUpdate(ctx context.Context, Direction string,
+func (rsrcMgr *OpenOltResourceMgr) HandleMeterInfoRefCntUpdate(ctx context.Context, meterInfo *MeterInfo, Direction string,
onuID uint32, uniID uint32, tpID uint32, increment bool) error {
- meterInfo, err := rsrcMgr.GetMeterInfoForOnu(ctx, Direction, onuID, uniID, tpID)
+ var err error
+ if meterInfo == nil {
+ meterInfo, err = rsrcMgr.GetMeterInfoForOnu(ctx, Direction, onuID, uniID, tpID)
+ }
if err != nil {
return err
} else if meterInfo == nil {
@@ -895,21 +898,25 @@
}
// AddGemToOnuGemInfo adds gemport to onugem info kvstore and also local cache
-func (rsrcMgr *OpenOltResourceMgr) AddGemToOnuGemInfo(ctx context.Context, onuID uint32, gemPort uint32) error {
+func (rsrcMgr *OpenOltResourceMgr) AddGemToOnuGemInfo(ctx context.Context, onuID uint32, gemPorts []uint32) error {
onugem, err := rsrcMgr.GetOnuGemInfo(ctx, onuID)
if err != nil || onugem == nil || onugem.SerialNumber == "" {
logger.Errorf(ctx, "failed to get onuifo for intfid %d", rsrcMgr.PonIntfID)
return err
}
+ dbGemPortMap := make(map[uint32]bool)
+ for _, gem := range onugem.GemPorts {
+ dbGemPortMap[gem] = true
+ }
if onugem.OnuID == onuID {
- for _, gem := range onugem.GemPorts {
- if gem == gemPort {
- logger.Debugw(ctx, "Gem already present in onugem info, skpping addition", log.Fields{"gem": gem})
- return nil
+ for _, gemPort := range gemPorts {
+ if _, exists := dbGemPortMap[gemPort]; exists {
+ logger.Debugw(ctx, "Gem already present in onugem info, skpping addition", log.Fields{"gem": gemPort})
+ continue
}
+ logger.Debugw(ctx, "Added gem to onugem info", log.Fields{"gem": gemPort})
+ onugem.GemPorts = append(onugem.GemPorts, gemPort)
}
- logger.Debugw(ctx, "Added gem to onugem info", log.Fields{"gem": gemPort})
- onugem.GemPorts = append(onugem.GemPorts, gemPort)
} else {
logger.Errorw(ctx, "onu id in OnuGemInfo does not match", log.Fields{"onuID": onuID, "ponIf": rsrcMgr.PonIntfID, "onuGemInfoOnuID": onugem.OnuID})
return fmt.Errorf("onu-id-in-OnuGemInfo-does-not-match-%v", onuID)
diff --git a/internal/pkg/resourcemanager/resourcemanager_test.go b/internal/pkg/resourcemanager/resourcemanager_test.go
index 2e408ae..4763a31 100644
--- a/internal/pkg/resourcemanager/resourcemanager_test.go
+++ b/internal/pkg/resourcemanager/resourcemanager_test.go
@@ -532,10 +532,8 @@
if err := RsrcMgr.AddNewOnuGemInfoToCacheAndKvStore(ctx, tt.args.onuID, tt.args.serialNum); err != nil {
t.Errorf("failed to add onu")
}
- for _, gemPort := range tt.args.gemPortIDs {
- if err := RsrcMgr.AddGemToOnuGemInfo(ctx, tt.args.onuID, gemPort); err != nil {
- t.Errorf("failed to add gem to onu")
- }
+ if err := RsrcMgr.AddGemToOnuGemInfo(ctx, tt.args.onuID, tt.args.gemPortIDs); err != nil {
+ t.Errorf("failed to add gem to onu")
}
for _, gemPortDeleted := range tt.args.gemPortIDsToBeDeleted {
if err := RsrcMgr.RemoveGemFromOnuGemInfo(ctx, tt.args.onuID, gemPortDeleted); err != nil {
@@ -623,10 +621,8 @@
if err := RsrcMgr.AddNewOnuGemInfoToCacheAndKvStore(ctx, tt.args.onuID, tt.args.serialNum); err != nil {
t.Errorf("failed to add onu")
}
- for _, gemPort := range tt.args.gemPortIDs {
- if err := RsrcMgr.AddGemToOnuGemInfo(ctx, tt.args.onuID, gemPort); err != nil {
- t.Errorf("failed to add gem to onu")
- }
+ if err := RsrcMgr.AddGemToOnuGemInfo(ctx, tt.args.onuID, tt.args.gemPortIDs); err != nil {
+ t.Errorf("failed to add gem to onu")
}
lenofGemPorts := 0