diff options
Diffstat (limited to 'modules/indexer/code/indexer.go')
-rw-r--r-- | modules/indexer/code/indexer.go | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/modules/indexer/code/indexer.go b/modules/indexer/code/indexer.go index 9ae3abff60..d897fcccd5 100644 --- a/modules/indexer/code/indexer.go +++ b/modules/indexer/code/indexer.go @@ -42,9 +42,11 @@ type SearchResultLanguages struct { // Indexer defines an interface to index and search code contents type Indexer interface { + Ping() bool + SetAvailabilityChangeCallback(callback func(bool)) Index(ctx context.Context, repo *repo_model.Repository, sha string, changes *repoChanges) error Delete(repoID int64) error - Search(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error) + Search(ctx context.Context, repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error) Close() } @@ -140,6 +142,7 @@ func Init() { return data } + unhandled := make([]queue.Data, 0, len(data)) for _, datum := range data { indexerData, ok := datum.(*IndexerData) if !ok { @@ -150,10 +153,14 @@ func Init() { if err := index(ctx, indexer, indexerData.RepoID); err != nil { log.Error("index: %v", err) - continue + if indexer.Ping() { + continue + } + // Add back to queue + unhandled = append(unhandled, datum) } } - return nil + return unhandled } indexerQueue = queue.CreateUniqueQueue("code_indexer", handler, &IndexerData{}) @@ -212,6 +219,18 @@ func Init() { indexer.set(rIndexer) + if queue, ok := indexerQueue.(queue.Pausable); ok { + rIndexer.SetAvailabilityChangeCallback(func(available bool) { + if !available { + log.Info("Code index queue paused") + queue.Pause() + } else { + log.Info("Code index queue resumed") + queue.Resume() + } + }) + } + // Start processing the queue go graceful.GetManager().RunWithShutdownFns(indexerQueue.Run) @@ -262,6 +281,17 @@ func UpdateRepoIndexer(repo *repo_model.Repository) { } } +// IsAvailable checks if issue indexer is available +func IsAvailable() bool { + idx, err := indexer.get() + if err != nil { + log.Error("IsAvailable(): unable to get indexer: %v", err) + return false + } + + return idx.Ping() +} + // populateRepoIndexer populate the repo indexer with pre-existing data. This // should only be run when the indexer is created for the first time. func populateRepoIndexer(ctx context.Context) { |