[VOL-5548] Handle ONU SW download and upgrade during context cancellation or timeout
Change-Id: I3a901833e2e69c52911f9ffc13e7dd5dc1abcea6
Signed-off-by: bseeniva <balaji.seenivasan@radisys.com>
diff --git a/internal/pkg/core/device_handler.go b/internal/pkg/core/device_handler.go
index e981fd8..2c5a58f 100755
--- a/internal/pkg/core/device_handler.go
+++ b/internal/pkg/core/device_handler.go
@@ -1706,7 +1706,7 @@
// onuSwUpgradeAfterDownload initiates the SW download transfer to the ONU with activate and commit options
// after the OnuImage has been downloaded to the adapter, called in background
func (dh *deviceHandler) onuSwUpgradeAfterDownload(ctx context.Context, apImageRequest *voltha.DeviceImageDownloadRequest,
- apDownloadManager *swupg.FileDownloadManager, aImageIdentifier string) {
+ apDownloadManager *swupg.FileDownloadManager, aImageIdentifier string, aCancel context.CancelFunc) {
var err error
pDevEntry := dh.GetOnuDeviceEntry(ctx, false)
@@ -1767,6 +1767,32 @@
logger.Errorw(ctx, "onu upgrade fsm could not be created", log.Fields{
"device-id": dh.DeviceID, "error": err})
}
+ go func() {
+ onuDlChn := dh.pOnuUpradeFsm.GetOnuDLChannel()
+ select {
+ case <-ctx.Done():
+ logger.Errorw(ctx, "context Deadline Exceeded aborting ONU SW upgrade", log.Fields{"device-id": dh.DeviceID, "err": ctx.Err()})
+ dh.lockUpgradeFsm.Lock()
+ if dh.pOnuUpradeFsm != nil {
+ dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_REQUEST)
+ }
+ dh.lockUpgradeFsm.Unlock()
+ return
+ case <-dh.deviceDeleteCommChan:
+ logger.Errorw(ctx, "device deleted aborting ONU SW upgrade", log.Fields{"device-id": dh.DeviceID, "err": ctx.Err()})
+ dh.lockUpgradeFsm.Lock()
+ if dh.pOnuUpradeFsm != nil {
+ dh.pOnuUpradeFsm.CancelProcessing(ctx, true, voltha.ImageState_CANCELLED_ON_REQUEST)
+ }
+ dh.lockUpgradeFsm.Unlock()
+ return
+ case success := <-onuDlChn:
+ logger.Infow(ctx, "onu SW upgrade download completed", log.Fields{"isSuccess": success, "device-id": dh.DeviceID})
+ aCancel()
+ return
+
+ }
+ }()
return
}
logger.Errorw(ctx, "start Onu SW upgrade rejected: no inactive image", log.Fields{
@@ -3405,7 +3431,8 @@
logger.Errorw(ctx, "no valid OnuDevice or omciCC - abort", log.Fields{"device-id": dh.DeviceID})
return fmt.Errorf("no valid omciCC - abort for device-id: %s", dh.device.Id)
}
- dh.pOnuUpradeFsm = swupg.NewOnuUpgradeFsm(ctx, dh, apDevEntry, apDevEntry.GetOnuDB(), aDevEvent,
+ fsmCtx := log.WithSpanFromContext(context.Background(), ctx)
+ dh.pOnuUpradeFsm = swupg.NewOnuUpgradeFsm(fsmCtx, dh, apDevEntry, apDevEntry.GetOnuDB(), aDevEvent,
sFsmName, chUpgradeFsm)
if dh.pOnuUpradeFsm != nil {
pUpgradeStatemachine := dh.pOnuUpradeFsm.PAdaptFsm.PFsm