Add transaction rollback in database filter 69/190669/4
authorAlexander Mazuruk <a.mazuruk@samsung.com>
Thu, 4 Oct 2018 13:07:33 +0000 (15:07 +0200)
committerAlexander Mazuruk <a.mazuruk@samsung.com>
Thu, 4 Oct 2018 13:41:09 +0000 (15:41 +0200)
When error ocurred, transactions where not rolled back which caused
one error to render whole artifacts module unusable.

Thanks @Michal for catching this.

Change-Id: I434e9c24819e01d703e304765f841a6b55f65385
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
artifacts/database/database.go

index 82a9184..16b47b7 100644 (file)
@@ -190,6 +190,15 @@ func (aDB *ArtifactDB) Filter(filter weles.ArtifactFilter, sorter weles.Artifact
        if err != nil {
                return nil, weles.ListInfo{}, errors.New(whileFilter + dbTransOpenFail + err.Error())
        }
+       defer func() {
+               if err != nil {
+                       // err should be logged when it occurs.
+                       if err2 := trans.Rollback(); err2 != nil {
+                               log.Printf("%v occurred when filtering, trying to rollback transaction failed: %v",
+                                       err, err2)
+                       }
+               }
+       }()
        queryForTotal, argsForTotal := prepareQuery(filter, sorter, paginator, true, false, 0)
        queryForRemaining, argsForRemaining := prepareQuery(filter, sorter, paginator, false, true, 0)
        var offset int64
@@ -205,7 +214,10 @@ func (aDB *ArtifactDB) Filter(filter weles.ArtifactFilter, sorter weles.Artifact
        }
 
        if tr == 0 {
-               return []weles.ArtifactInfo{}, weles.ListInfo{}, weles.ErrArtifactNotFound
+               // err needs to be updated for deferred 'if err!=nil' to catch it and roll back the
+               // not committed transaction
+               err = weles.ErrArtifactNotFound
+               return []weles.ArtifactInfo{}, weles.ListInfo{}, err
        }
 
        if !paginator.Forward {