mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-05-31 11:52:10 +00:00
Implement sync push mirror on commit (#19411)
Support synchronizing with the push mirrors whenever new commits are pushed or synced from pull mirror. Related Issues: #18220 Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
496b8e3990
commit
49f9d43afe
12 changed files with 208 additions and 98 deletions
|
@ -11,38 +11,21 @@ import (
|
|||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
"code.gitea.io/gitea/modules/graceful"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
mirror_module "code.gitea.io/gitea/modules/mirror"
|
||||
"code.gitea.io/gitea/modules/queue"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
)
|
||||
|
||||
var mirrorQueue queue.UniqueQueue
|
||||
|
||||
// SyncType type of sync request
|
||||
type SyncType int
|
||||
|
||||
const (
|
||||
// PullMirrorType for pull mirrors
|
||||
PullMirrorType SyncType = iota
|
||||
// PushMirrorType for push mirrors
|
||||
PushMirrorType
|
||||
)
|
||||
|
||||
// SyncRequest for the mirror queue
|
||||
type SyncRequest struct {
|
||||
Type SyncType
|
||||
ReferenceID int64 // RepoID for pull mirror, MirrorID fro push mirror
|
||||
}
|
||||
|
||||
// doMirrorSync causes this request to mirror itself
|
||||
func doMirrorSync(ctx context.Context, req *SyncRequest) {
|
||||
func doMirrorSync(ctx context.Context, req *mirror_module.SyncRequest) {
|
||||
if req.ReferenceID == 0 {
|
||||
log.Warn("Skipping mirror sync request, no mirror ID was specified")
|
||||
return
|
||||
}
|
||||
switch req.Type {
|
||||
case PushMirrorType:
|
||||
case mirror_module.PushMirrorType:
|
||||
_ = SyncPushMirror(ctx, req.ReferenceID)
|
||||
case PullMirrorType:
|
||||
case mirror_module.PullMirrorType:
|
||||
_ = SyncPullMirror(ctx, req.ReferenceID)
|
||||
default:
|
||||
log.Error("Unknown Request type in queue: %v for MirrorID[%d]", req.Type, req.ReferenceID)
|
||||
|
@ -60,28 +43,26 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error {
|
|||
log.Trace("Doing: Update")
|
||||
|
||||
handler := func(idx int, bean interface{}) error {
|
||||
var item SyncRequest
|
||||
var repo *repo_model.Repository
|
||||
var mirrorType mirror_module.SyncType
|
||||
var referenceID int64
|
||||
|
||||
if m, ok := bean.(*repo_model.Mirror); ok {
|
||||
if m.GetRepository() == nil {
|
||||
log.Error("Disconnected mirror found: %d", m.ID)
|
||||
return nil
|
||||
}
|
||||
repo = m.Repo
|
||||
item = SyncRequest{
|
||||
Type: PullMirrorType,
|
||||
ReferenceID: m.RepoID,
|
||||
}
|
||||
mirrorType = mirror_module.PullMirrorType
|
||||
referenceID = m.RepoID
|
||||
} else if m, ok := bean.(*repo_model.PushMirror); ok {
|
||||
if m.GetRepository() == nil {
|
||||
log.Error("Disconnected push-mirror found: %d", m.ID)
|
||||
return nil
|
||||
}
|
||||
repo = m.Repo
|
||||
item = SyncRequest{
|
||||
Type: PushMirrorType,
|
||||
ReferenceID: m.ID,
|
||||
}
|
||||
mirrorType = mirror_module.PushMirrorType
|
||||
referenceID = m.ID
|
||||
} else {
|
||||
log.Error("Unknown bean: %v", bean)
|
||||
return nil
|
||||
|
@ -95,9 +76,9 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error {
|
|||
}
|
||||
|
||||
// Push to the Queue
|
||||
if err := mirrorQueue.Push(&item); err != nil {
|
||||
if err := mirror_module.PushToQueue(mirrorType, referenceID); err != nil {
|
||||
if err == queue.ErrAlreadyInQueue {
|
||||
if item.Type == PushMirrorType {
|
||||
if mirrorType == mirror_module.PushMirrorType {
|
||||
log.Trace("PushMirrors for %-v already queued for sync", repo)
|
||||
} else {
|
||||
log.Trace("PullMirrors for %-v already queued for sync", repo)
|
||||
|
@ -142,7 +123,7 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error {
|
|||
|
||||
func queueHandle(data ...queue.Data) []queue.Data {
|
||||
for _, datum := range data {
|
||||
req := datum.(*SyncRequest)
|
||||
req := datum.(*mirror_module.SyncRequest)
|
||||
doMirrorSync(graceful.GetManager().ShutdownContext(), req)
|
||||
}
|
||||
return nil
|
||||
|
@ -150,43 +131,5 @@ func queueHandle(data ...queue.Data) []queue.Data {
|
|||
|
||||
// InitSyncMirrors initializes a go routine to sync the mirrors
|
||||
func InitSyncMirrors() {
|
||||
if !setting.Mirror.Enabled {
|
||||
return
|
||||
}
|
||||
mirrorQueue = queue.CreateUniqueQueue("mirror", queueHandle, new(SyncRequest))
|
||||
|
||||
go graceful.GetManager().RunWithShutdownFns(mirrorQueue.Run)
|
||||
}
|
||||
|
||||
// StartToMirror adds repoID to mirror queue
|
||||
func StartToMirror(repoID int64) {
|
||||
if !setting.Mirror.Enabled {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
err := mirrorQueue.Push(&SyncRequest{
|
||||
Type: PullMirrorType,
|
||||
ReferenceID: repoID,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error("Unable to push sync request for to the queue for pull mirror repo[%d]: Error: %v", repoID, err)
|
||||
return
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// AddPushMirrorToQueue adds the push mirror to the queue
|
||||
func AddPushMirrorToQueue(mirrorID int64) {
|
||||
if !setting.Mirror.Enabled {
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
err := mirrorQueue.Push(&SyncRequest{
|
||||
Type: PushMirrorType,
|
||||
ReferenceID: mirrorID,
|
||||
})
|
||||
if err != nil {
|
||||
log.Error("Unable to push sync request to the queue for pull mirror repo[%d]: Error: %v", mirrorID, err)
|
||||
}
|
||||
}()
|
||||
mirror_module.StartSyncMirrors(queueHandle)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue