ソースを参照

remove transactions from db to prevent locking

Alexander Belanger 4 年 前
コミット
62f11d96b7
1 ファイル変更58 行追加70 行削除
  1. 58 70
      internal/repository/gorm/event.go

+ 58 - 70
internal/repository/gorm/event.go

@@ -84,54 +84,50 @@ func NewKubeEventRepository(db *gorm.DB, key *[32]byte) repository.KubeEventRepo
 func (repo *KubeEventRepository) CreateEvent(
 	event *models.KubeEvent,
 ) (*models.KubeEvent, error) {
-	err := repo.db.Transaction(func(tx *gorm.DB) error {
-		// read the count of the events in the DB
-		query := tx.Debug().Where("project_id = ? AND cluster_id = ?", event.ProjectID, event.ClusterID)
+	// read the count of the events in the DB
+	query := repo.db.Debug().Where("project_id = ? AND cluster_id = ?", event.ProjectID, event.ClusterID)
 
-		var count int64
-
-		if err := query.Model([]*models.KubeEvent{}).Count(&count).Error; err != nil {
-			return err
-		}
-
-		fmt.Println("COUNT IS", event.Name, count)
-
-		// if the count is greater than 500, remove the lowest-order event to implement a
-		// basic fixed-length buffer
-		if count >= 500 {
-			// first, delete the matching sub events
-			err := tx.Debug().Exec(`
-			  DELETE FROM kube_sub_events 
-			  WHERE kube_event_id NOT IN (
-				SELECT id FROM kube_events k2 WHERE (k2.project_id = ? AND k2.cluster_id = ?) ORDER BY updated_at desc, id desc LIMIT 499
-			  )
-			`, event.ProjectID, event.ClusterID).Error
-
-			if err != nil {
-				return err
-			}
+	var count int64
 
-			// then, delete the matching events
-			err = tx.Debug().Exec(`
-			  DELETE FROM kube_events 
-			  WHERE (project_id = ? AND cluster_id = ?) AND id NOT IN (
-				SELECT id FROM kube_events k2 WHERE (k2.project_id = ? AND k2.cluster_id = ?) ORDER BY updated_at desc, id desc LIMIT 499
-			  )
-			`, event.ProjectID, event.ClusterID, event.ProjectID, event.ClusterID).Error
+	if err := query.Model([]*models.KubeEvent{}).Count(&count).Error; err != nil {
+		return nil, err
+	}
 
-			if err != nil {
-				return err
-			}
+	fmt.Println("COUNT IS", event.Name, count)
+
+	// if the count is greater than 500, remove the lowest-order event to implement a
+	// basic fixed-length buffer
+	if count >= 500 {
+		// first, delete the matching sub events
+		err := repo.db.Debug().Exec(`
+		  DELETE FROM kube_sub_events 
+		  WHERE kube_event_id NOT IN (
+			SELECT id FROM kube_events k2 WHERE (k2.project_id = ? AND k2.cluster_id = ?) ORDER BY updated_at desc, id desc LIMIT 499
+		  )
+		`, event.ProjectID, event.ClusterID).Error
+
+		if err != nil {
+			return nil, err
 		}
 
-		if err := tx.Debug().Create(event).Error; err != nil {
-			return err
+		// then, delete the matching events
+		err = repo.db.Debug().Exec(`
+		  DELETE FROM kube_events 
+		  WHERE (project_id = ? AND cluster_id = ?) AND id NOT IN (
+			SELECT id FROM kube_events k2 WHERE (k2.project_id = ? AND k2.cluster_id = ?) ORDER BY updated_at desc, id desc LIMIT 499
+		  )
+		`, event.ProjectID, event.ClusterID, event.ProjectID, event.ClusterID).Error
+
+		if err != nil {
+			return nil, err
 		}
+	}
 
-		return nil
-	})
+	if err := repo.db.Debug().Create(event).Error; err != nil {
+		return nil, err
+	}
 
-	return event, err
+	return event, nil
 }
 
 // ReadEvent finds an event by id
@@ -235,21 +231,20 @@ func (repo *KubeEventRepository) ListEventsByProjectID(
 func (repo *KubeEventRepository) AppendSubEvent(event *models.KubeEvent, subEvent *models.KubeSubEvent) error {
 	subEvent.KubeEventID = event.ID
 
-	return repo.db.Debug().Transaction(func(tx *gorm.DB) error {
-		var count int64
+	var count int64
 
-		query := tx.Debug().Where("kube_event_id = ?", event.ID)
+	query := repo.db.Debug().Where("kube_event_id = ?", event.ID)
 
-		if err := query.Model([]*models.KubeSubEvent{}).Count(&count).Error; err != nil {
-			return err
-		}
+	if err := query.Model([]*models.KubeSubEvent{}).Count(&count).Error; err != nil {
+		return err
+	}
 
-		fmt.Println("COUNT IS", event.Name, count)
+	fmt.Println("COUNT IS", event.Name, count)
 
-		// if the count is greater than 20, remove the lowest-order events to implement a
-		// basic fixed-length buffer
-		if count >= 20 {
-			err := tx.Debug().Exec(`
+	// if the count is greater than 20, remove the lowest-order events to implement a
+	// basic fixed-length buffer
+	if count >= 20 {
+		err := repo.db.Debug().Exec(`
 			  DELETE FROM kube_sub_events 
 			  WHERE kube_event_id = ? AND 
 			  id NOT IN (
@@ -257,39 +252,32 @@ func (repo *KubeEventRepository) AppendSubEvent(event *models.KubeEvent, subEven
 			  )
 			`, event.ID, event.ID).Error
 
-			if err != nil {
-				return err
-			}
-		}
-
-		// if err := tx.Debug().Create(subEvent).Error; err != nil {
-		// 	return err
-		// }
-
-		if err := tx.Debug().Model(event).Association("SubEvents").Append(subEvent); err != nil {
+		if err != nil {
 			return err
 		}
+	}
+
+	if err := repo.db.Debug().Model(event).Association("SubEvents").Append(subEvent); err != nil {
+		return err
+	}
 
-		// only update the updated_at field for the event
-		return tx.Debug().Model(event).Update("updated_at", time.Now()).Error
-	})
+	// only update the updated_at field for the event
+	return repo.db.Debug().Model(event).Update("updated_at", time.Now()).Error
 }
 
 // DeleteEvent deletes an event by ID
 func (repo *KubeEventRepository) DeleteEvent(
 	id uint,
 ) error {
-	return repo.db.Transaction(func(tx *gorm.DB) error {
-		return deleteEventPermanently(id, tx)
-	})
+	return deleteEventPermanently(id, repo.db)
 }
 
-func deleteEventPermanently(id uint, tx *gorm.DB) error {
+func deleteEventPermanently(id uint, db *gorm.DB) error {
 	// delete all subevents first
-	if err := tx.Debug().Unscoped().Where("kube_event_id = ?", id).Delete(&models.KubeSubEvent{}).Error; err != nil {
+	if err := db.Debug().Unscoped().Where("kube_event_id = ?", id).Delete(&models.KubeSubEvent{}).Error; err != nil {
 		return err
 	}
 
 	// delete event
-	return tx.Debug().Preload("SubEvents").Unscoped().Where("id = ?", id).Delete(&models.KubeEvent{}).Error
+	return db.Debug().Preload("SubEvents").Unscoped().Where("id = ?", id).Delete(&models.KubeEvent{}).Error
 }