mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.0 KiB
77 lines
2.0 KiB
// Copyright 2022 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package mirror |
|
|
|
import ( |
|
"code.gitea.io/gitea/modules/graceful" |
|
"code.gitea.io/gitea/modules/log" |
|
"code.gitea.io/gitea/modules/queue" |
|
"code.gitea.io/gitea/modules/setting" |
|
) |
|
|
|
var mirrorQueue *queue.WorkerPoolQueue[*SyncRequest] |
|
|
|
// 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 for push mirror |
|
} |
|
|
|
func queueHandler(items ...*SyncRequest) []*SyncRequest { |
|
for _, req := range items { |
|
doMirrorSync(graceful.GetManager().ShutdownContext(), req) |
|
} |
|
return nil |
|
} |
|
|
|
// StartSyncMirrors starts a go routine to sync the mirrors |
|
func StartSyncMirrors() { |
|
if !setting.Mirror.Enabled { |
|
return |
|
} |
|
mirrorQueue = queue.CreateUniqueQueue(graceful.GetManager().ShutdownContext(), "mirror", queueHandler) |
|
if mirrorQueue == nil { |
|
log.Fatal("Unable to create mirror queue") |
|
} |
|
go graceful.GetManager().RunWithCancel(mirrorQueue) |
|
} |
|
|
|
// AddPullMirrorToQueue adds repoID to mirror queue |
|
func AddPullMirrorToQueue(repoID int64) { |
|
addMirrorToQueue(PullMirrorType, repoID) |
|
} |
|
|
|
// AddPushMirrorToQueue adds the push mirror to the queue |
|
func AddPushMirrorToQueue(mirrorID int64) { |
|
addMirrorToQueue(PushMirrorType, mirrorID) |
|
} |
|
|
|
func addMirrorToQueue(syncType SyncType, referenceID int64) { |
|
if !setting.Mirror.Enabled { |
|
return |
|
} |
|
go func() { |
|
if err := PushToQueue(syncType, referenceID); err != nil { |
|
log.Error("Unable to push sync request for to the queue for pull mirror repo[%d]. Error: %v", referenceID, err) |
|
} |
|
}() |
|
} |
|
|
|
// PushToQueue adds the sync request to the queue |
|
func PushToQueue(mirrorType SyncType, referenceID int64) error { |
|
return mirrorQueue.Push(&SyncRequest{ |
|
Type: mirrorType, |
|
ReferenceID: referenceID, |
|
}) |
|
}
|
|
|