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.

indexer.go 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package stats
  4. import (
  5. "code.gitea.io/gitea/models/db"
  6. repo_model "code.gitea.io/gitea/models/repo"
  7. "code.gitea.io/gitea/modules/graceful"
  8. "code.gitea.io/gitea/modules/log"
  9. )
  10. // Indexer defines an interface to index repository stats
  11. // TODO: this indexer is quite different from the others, maybe this package should be moved out from module/indexer
  12. type Indexer interface {
  13. Index(id int64) error
  14. Close()
  15. }
  16. // indexer represents a indexer instance
  17. var indexer Indexer
  18. // Init initialize the repo indexer
  19. func Init() error {
  20. indexer = &DBIndexer{}
  21. if err := initStatsQueue(); err != nil {
  22. return err
  23. }
  24. go populateRepoIndexer()
  25. return nil
  26. }
  27. // populateRepoIndexer populate the repo indexer with pre-existing data. This
  28. // should only be run when the indexer is created for the first time.
  29. func populateRepoIndexer() {
  30. log.Info("Populating the repo stats indexer with existing repositories")
  31. isShutdown := graceful.GetManager().IsShutdown()
  32. exist, err := db.IsTableNotEmpty("repository")
  33. if err != nil {
  34. log.Fatal("System error: %v", err)
  35. } else if !exist {
  36. return
  37. }
  38. var maxRepoID int64
  39. if maxRepoID, err = db.GetMaxID("repository"); err != nil {
  40. log.Fatal("System error: %v", err)
  41. }
  42. // start with the maximum existing repo ID and work backwards, so that we
  43. // don't include repos that are created after gitea starts; such repos will
  44. // already be added to the indexer, and we don't need to add them again.
  45. for maxRepoID > 0 {
  46. select {
  47. case <-isShutdown:
  48. log.Info("Repository Stats Indexer population shutdown before completion")
  49. return
  50. default:
  51. }
  52. ids, err := repo_model.GetUnindexedRepos(repo_model.RepoIndexerTypeStats, maxRepoID, 0, 50)
  53. if err != nil {
  54. log.Error("populateRepoIndexer: %v", err)
  55. return
  56. } else if len(ids) == 0 {
  57. break
  58. }
  59. for _, id := range ids {
  60. select {
  61. case <-isShutdown:
  62. log.Info("Repository Stats Indexer population shutdown before completion")
  63. return
  64. default:
  65. }
  66. if err := statsQueue.Push(id); err != nil {
  67. log.Error("statsQueue.Push: %v", err)
  68. }
  69. maxRepoID = id - 1
  70. }
  71. }
  72. log.Info("Done (re)populating the repo stats indexer with existing repositories")
  73. }