2024-01-05 08:55:34 +08:00
|
|
|
package application
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"mayfly-go/internal/db/domain/entity"
|
|
|
|
|
"mayfly-go/internal/db/domain/repository"
|
|
|
|
|
"mayfly-go/pkg/logx"
|
|
|
|
|
"mayfly-go/pkg/utils/timex"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type DbBinlogApp struct {
|
|
|
|
|
binlogRepo repository.DbBinlog
|
|
|
|
|
binlogHistoryRepo repository.DbBinlogHistory
|
|
|
|
|
backupRepo repository.DbBackup
|
|
|
|
|
backupHistoryRepo repository.DbBackupHistory
|
|
|
|
|
dbApp Db
|
|
|
|
|
context context.Context
|
|
|
|
|
cancel context.CancelFunc
|
|
|
|
|
waitGroup sync.WaitGroup
|
2024-01-17 08:37:22 +00:00
|
|
|
scheduler *dbScheduler
|
2024-01-05 08:55:34 +08:00
|
|
|
}
|
|
|
|
|
|
2024-01-17 08:37:22 +00:00
|
|
|
func newDbBinlogApp(repositories *repository.Repositories, dbApp Db, scheduler *dbScheduler) (*DbBinlogApp, error) {
|
2024-01-05 08:55:34 +08:00
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
svc := &DbBinlogApp{
|
|
|
|
|
binlogRepo: repositories.Binlog,
|
|
|
|
|
binlogHistoryRepo: repositories.BinlogHistory,
|
|
|
|
|
backupRepo: repositories.Backup,
|
|
|
|
|
backupHistoryRepo: repositories.BackupHistory,
|
|
|
|
|
dbApp: dbApp,
|
2024-01-17 08:37:22 +00:00
|
|
|
scheduler: scheduler,
|
2024-01-05 08:55:34 +08:00
|
|
|
context: ctx,
|
|
|
|
|
cancel: cancel,
|
|
|
|
|
}
|
|
|
|
|
svc.waitGroup.Add(1)
|
|
|
|
|
go svc.run()
|
|
|
|
|
return svc, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (app *DbBinlogApp) run() {
|
|
|
|
|
defer app.waitGroup.Done()
|
|
|
|
|
|
2024-01-15 20:11:28 +08:00
|
|
|
// todo: 实现 binlog 并发下载
|
|
|
|
|
timex.SleepWithContext(app.context, time.Minute)
|
2024-01-05 08:55:34 +08:00
|
|
|
for !app.closed() {
|
2024-01-17 08:37:22 +00:00
|
|
|
jobs, err := app.loadJobs()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logx.Errorf("DbBinlogApp: 加载 BINLOG 同步任务失败: %s", err.Error())
|
|
|
|
|
timex.SleepWithContext(app.context, time.Minute)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if app.closed() {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
if err := app.scheduler.AddJob(app.context, false, entity.DbJobTypeBinlog, jobs); err != nil {
|
|
|
|
|
logx.Error("DbBinlogApp: 添加 BINLOG 同步任务失败: ", err.Error())
|
|
|
|
|
}
|
|
|
|
|
timex.SleepWithContext(app.context, entity.BinlogDownloadInterval)
|
2024-01-05 08:55:34 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-17 08:37:22 +00:00
|
|
|
func (app *DbBinlogApp) loadJobs() ([]*entity.DbBinlog, error) {
|
|
|
|
|
var instanceIds []uint64
|
|
|
|
|
if err := app.backupRepo.ListDbInstances(true, true, &instanceIds); err != nil {
|
|
|
|
|
return nil, err
|
2024-01-05 08:55:34 +08:00
|
|
|
}
|
2024-01-17 08:37:22 +00:00
|
|
|
jobs := make([]*entity.DbBinlog, 0, len(instanceIds))
|
|
|
|
|
for _, id := range instanceIds {
|
2024-01-05 08:55:34 +08:00
|
|
|
if app.closed() {
|
|
|
|
|
break
|
|
|
|
|
}
|
2024-01-17 08:37:22 +00:00
|
|
|
binlog := entity.NewDbBinlog(id)
|
|
|
|
|
if err := app.AddJobIfNotExists(app.context, binlog); err != nil {
|
|
|
|
|
return nil, err
|
2024-01-05 08:55:34 +08:00
|
|
|
}
|
2024-01-17 08:37:22 +00:00
|
|
|
jobs = append(jobs, binlog)
|
2024-01-05 08:55:34 +08:00
|
|
|
}
|
2024-01-17 08:37:22 +00:00
|
|
|
return jobs, nil
|
2024-01-05 08:55:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (app *DbBinlogApp) Close() {
|
|
|
|
|
app.cancel()
|
|
|
|
|
app.waitGroup.Wait()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (app *DbBinlogApp) closed() bool {
|
|
|
|
|
return app.context.Err() != nil
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-11 11:35:51 +08:00
|
|
|
func (app *DbBinlogApp) AddJobIfNotExists(ctx context.Context, job *entity.DbBinlog) error {
|
|
|
|
|
if err := app.binlogRepo.AddJobIfNotExists(ctx, job); err != nil {
|
2024-01-05 08:55:34 +08:00
|
|
|
return err
|
|
|
|
|
}
|
2024-01-11 11:35:51 +08:00
|
|
|
if job.Id == 0 {
|
2024-01-05 08:55:34 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-11 11:35:51 +08:00
|
|
|
func (app *DbBinlogApp) Delete(ctx context.Context, jobId uint64) error {
|
2024-01-05 08:55:34 +08:00
|
|
|
// todo: 删除 Binlog 历史文件
|
2024-01-11 11:35:51 +08:00
|
|
|
if err := app.binlogRepo.DeleteById(ctx, jobId); err != nil {
|
2024-01-05 08:55:34 +08:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|