You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by ma...@apache.org on 2022/09/21 08:49:57 UTC

[incubator-devlake] branch main updated: fix: fix migrator bug (#3135)

This is an automated email from the ASF dual-hosted git repository.

mappjzc pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new 9dd7046a fix: fix migrator bug (#3135)
9dd7046a is described below

commit 9dd7046ae5082ad45a9db7b27eff42c29dd07e76
Author: mappjzc <zh...@merico.dev>
AuthorDate: Wed Sep 21 16:49:53 2022 +0800

    fix: fix migrator bug (#3135)
    
    * fix: fix migrator bug
    
    Add Re Executability to addCommitFilePathLength.
    Fix a type error on modifyJenkinsBuild.
    Add error message on migrator execute.
    
    Nddtfjiang <zh...@merico.dev>
    
    * refactor: ignorerecovery for errorscripts
    
    Ignore providing recovery for error execution scripts.
    Use defer to rollback the fail db request.
    
    Nddtfjiang <zh...@merico.dev>
---
 migration/migrator.go                              |  7 +--
 .../20220913_commitfile_add_length.go              | 59 ++++++++++++++++++++--
 .../20220916_modify_jenkins_build.go               |  9 ++--
 3 files changed, 63 insertions(+), 12 deletions(-)

diff --git a/migration/migrator.go b/migration/migrator.go
index 72434a6d..ca899298 100644
--- a/migration/migrator.go
+++ b/migration/migrator.go
@@ -20,10 +20,11 @@ package migration
 import (
 	"context"
 	"fmt"
-	"github.com/apache/incubator-devlake/errors"
 	"sort"
 	"sync"
 
+	"github.com/apache/incubator-devlake/errors"
+
 	"gorm.io/gorm"
 )
 
@@ -82,11 +83,11 @@ func (m *migrator) execute(ctx context.Context) errors.Error {
 	for _, script := range m.pending {
 		err := script.Up(ctx, m.db)
 		if err != nil {
-			return err
+			return errors.Default.Wrap(err, fmt.Sprintf("error Up() on script [%s]", script.Name()))
 		}
 		err = m.bookKeep(script)
 		if err != nil {
-			return err
+			return errors.Default.Wrap(err, fmt.Sprintf("error bookKeep() on script [%s]", script.Name()))
 		}
 	}
 	return nil
diff --git a/models/migrationscripts/20220913_commitfile_add_length.go b/models/migrationscripts/20220913_commitfile_add_length.go
index 9b5a5cb0..a65937d4 100644
--- a/models/migrationscripts/20220913_commitfile_add_length.go
+++ b/models/migrationscripts/20220913_commitfile_add_length.go
@@ -21,6 +21,7 @@ import (
 	"context"
 	"crypto/sha256"
 	"encoding/hex"
+	"fmt"
 	"reflect"
 	"strings"
 
@@ -67,17 +68,41 @@ func (CommitFileComponentBak) TableName() string {
 
 type addCommitFilePathLength struct{}
 
-func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) errors.Error {
-	err := db.Migrator().RenameTable(&CommitFile{}, &CommitFileAddLengthBak{})
+func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) (errs errors.Error) {
+	var err error
+
+	// rename the commit_file_bak to cache old table
+	err = db.Migrator().RenameTable(&CommitFile{}, &CommitFileAddLengthBak{})
 	if err != nil {
 		return errors.Default.Wrap(err, "error no rename commit_file to commit_files_bak")
 	}
 
+	// rollback for rename back
+	defer func() {
+		if errs != nil {
+			err = db.Migrator().RenameTable(&CommitFileAddLengthBak{}, &CommitFile{})
+			if err != nil {
+				errs = errors.Default.Wrap(err, fmt.Sprintf("fail to rollback table commit_file_bak , you must to rollback by yourself. %s", err.Error()))
+			}
+		}
+	}()
+
+	// create new commit_files table
 	err = db.Migrator().AutoMigrate(&CommitFileAddLength{})
 	if err != nil {
 		return errors.Default.Wrap(err, "error on auto migrate commit_file")
 	}
 
+	// rollback for create new table
+	defer func() {
+		if errs != nil {
+			err = db.Migrator().DropTable(&CommitFile{})
+			if err != nil {
+				errs = errors.Default.Wrap(err, fmt.Sprintf("fail to rollback table CommitFile , you must to rollback by yourself. %s", err.Error()))
+			}
+		}
+	}()
+
 	// update old id to new id and write to the new table
 	cursor, err := db.Model(&CommitFileAddLengthBak{}).Rows()
 	if err != nil {
@@ -85,6 +110,7 @@ func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) errors.Erro
 	}
 	defer cursor.Close()
 
+	// caculate and save the data to new table
 	batch, err := helper.NewBatchSave(api.BasicRes, reflect.TypeOf(&CommitFileAddLength{}), 200)
 	if err != nil {
 		return errors.Default.Wrap(err, "error getting batch from table commit_file")
@@ -108,20 +134,42 @@ func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) errors.Erro
 
 		err = batch.Add(&cf)
 		if err != nil {
-			return errors.Default.Wrap(err, "error on batch add")
+			return errors.Default.Wrap(err, "error on commit_files batch add")
 		}
 	}
 
+	// rename the commit_file_components_bak
 	err = db.Migrator().RenameTable(&CommitFileComponent{}, &CommitFileComponentBak{})
 	if err != nil {
 		return errors.Default.Wrap(err, "error no rename commit_file_components to commit_file_components_bak")
 	}
 
+	// rollback for rename back
+	defer func() {
+		if errs != nil {
+			err = db.Migrator().RenameTable(&CommitFileComponentBak{}, &CommitFileComponent{})
+			if err != nil {
+				errs = errors.Default.Wrap(err, fmt.Sprintf("fail to rollback table commit_file_components_bak , you must to rollback by yourself. %s", err.Error()))
+			}
+		}
+	}()
+
+	// create new commit_file_components table
 	err = db.Migrator().AutoMigrate(&CommitFileComponent{})
 	if err != nil {
 		return errors.Default.Wrap(err, "error on auto migrate commit_file")
 	}
 
+	// rollback for create new table
+	defer func() {
+		if errs != nil {
+			err = db.Migrator().DropTable(&CommitFileComponent{})
+			if err != nil {
+				errs = errors.Default.Wrap(err, fmt.Sprintf("fail to rollback table commit_file_components , you must to rollback by yourself. %s", err.Error()))
+			}
+		}
+	}()
+
 	// update old id to new id and write to the new table
 	cursor2, err := db.Model(&CommitFileComponentBak{}).Rows()
 	if err != nil {
@@ -129,6 +177,7 @@ func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) errors.Erro
 	}
 	defer cursor2.Close()
 
+	// caculate and save the data to new table
 	batch2, err := helper.NewBatchSave(api.BasicRes, reflect.TypeOf(&CommitFileComponent{}), 500)
 	if err != nil {
 		return errors.Default.Wrap(err, "error getting batch from table commit_file_components")
@@ -169,7 +218,7 @@ func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) errors.Erro
 
 		err = batch2.Add(&cfc)
 		if err != nil {
-			return errors.Default.Wrap(err, "error on batch add")
+			return errors.Default.Wrap(err, "error on commit_file_components batch add")
 		}
 	}
 
@@ -180,7 +229,7 @@ func (*addCommitFilePathLength) Up(ctx context.Context, db *gorm.DB) errors.Erro
 	}
 	err = db.Migrator().DropTable(&CommitFileComponentBak{})
 	if err != nil {
-		return errors.Default.Wrap(err, "error no drop commit_files_bak")
+		return errors.Default.Wrap(err, "error no drop commit_file_components_bak")
 	}
 
 	return nil
diff --git a/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go b/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go
index 94294332..b912ad18 100644
--- a/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go
+++ b/plugins/jenkins/models/migrationscripts/20220916_modify_jenkins_build.go
@@ -20,14 +20,15 @@ package migrationscripts
 import (
 	"context"
 	"fmt"
+	"reflect"
+	"strings"
+	"time"
+
 	"github.com/apache/incubator-devlake/errors"
 	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
 	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/apache/incubator-devlake/plugins/jenkins/api"
 	"gorm.io/gorm"
-	"reflect"
-	"strings"
-	"time"
 )
 
 type modifyJenkinsBuild struct{}
@@ -136,7 +137,7 @@ func (*modifyJenkinsBuild) Up(ctx context.Context, db *gorm.DB) errors.Error {
 		} else {
 			newBuild.FullDisplayName = fmt.Sprintf("%s %s", build.JobName, build.DisplayName)
 		}
-		err = batch.Add(&newBuild)
+		err = batch.Add(newBuild)
 		if err != nil {
 			return errors.Convert(err)
 		}