diff --git a/pkg/services/sqlstore/migrator/migrator.go b/pkg/services/sqlstore/migrator/migrator.go index e704826bed3..23da442def6 100644 --- a/pkg/services/sqlstore/migrator/migrator.go +++ b/pkg/services/sqlstore/migrator/migrator.go @@ -92,42 +92,48 @@ func (mg *Migrator) Start() error { mg.Logger.Debug("Executing", "sql", sql) - if err := mg.exec(m); err != nil { - mg.Logger.Error("Exec failed", "error", err, "sql", sql) - record.Error = err.Error() - mg.x.Insert(&record) + err := mg.inTransaction(func(sess *xorm.Session) error { + + if err := mg.exec(m, sess); err != nil { + mg.Logger.Error("Exec failed", "error", err, "sql", sql) + record.Error = err.Error() + sess.Insert(&record) + return err + } else { + record.Success = true + sess.Insert(&record) + } + + return nil + }) + + if err != nil { return err - } else { - record.Success = true - mg.x.Insert(&record) } } return nil } -func (mg *Migrator) exec(m Migration) error { +func (mg *Migrator) exec(m Migration, sess *xorm.Session) error { mg.Logger.Info("Executing migration", "id", m.Id()) - err := mg.inTransaction(func(sess *xorm.Session) error { - - condition := m.GetCondition() - if condition != nil { - sql, args := condition.Sql(mg.dialect) - results, err := sess.Query(sql, args...) - if err != nil || len(results) == 0 { - mg.Logger.Info("Skipping migration condition not fulfilled", "id", m.Id()) - return sess.Rollback() - } + condition := m.GetCondition() + if condition != nil { + sql, args := condition.Sql(mg.dialect) + results, err := sess.Query(sql, args...) + if err != nil || len(results) == 0 { + mg.Logger.Info("Skipping migration condition not fulfilled", "id", m.Id()) + return sess.Rollback() } + } - _, err := sess.Exec(m.Sql(mg.dialect)) - if err != nil { - mg.Logger.Error("Executing migration failed", "id", m.Id(), "error", err) - return err - } - return nil - }) + _, err := sess.Exec(m.Sql(mg.dialect)) + if err != nil { + mg.Logger.Error("Executing migration failed", "id", m.Id(), "error", err) + return err + } + return nil if err != nil { return err