gitea源码

indexer.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package bleve
  4. import (
  5. "context"
  6. "errors"
  7. "code.gitea.io/gitea/modules/indexer/internal"
  8. "code.gitea.io/gitea/modules/log"
  9. "github.com/blevesearch/bleve/v2"
  10. "github.com/blevesearch/bleve/v2/mapping"
  11. "github.com/ethantkoenig/rupture"
  12. )
  13. var _ internal.Indexer = &Indexer{}
  14. // Indexer represents a basic bleve indexer implementation
  15. type Indexer struct {
  16. Indexer bleve.Index
  17. indexDir string
  18. version int
  19. mappingGetter MappingGetter
  20. }
  21. type MappingGetter func() (mapping.IndexMapping, error)
  22. func NewIndexer(indexDir string, version int, mappingGetter func() (mapping.IndexMapping, error)) *Indexer {
  23. return &Indexer{
  24. indexDir: indexDir,
  25. version: version,
  26. mappingGetter: mappingGetter,
  27. }
  28. }
  29. // Init initializes the indexer
  30. func (i *Indexer) Init(_ context.Context) (bool, error) {
  31. if i == nil {
  32. return false, errors.New("cannot init nil indexer")
  33. }
  34. if i.Indexer != nil {
  35. return false, errors.New("indexer is already initialized")
  36. }
  37. indexer, version, err := openIndexer(i.indexDir, i.version)
  38. if err != nil {
  39. return false, err
  40. }
  41. if indexer != nil {
  42. i.Indexer = indexer
  43. return true, nil
  44. }
  45. if version != 0 {
  46. log.Warn("Found older bleve index with version %d, Gitea will remove it and rebuild", version)
  47. }
  48. indexMapping, err := i.mappingGetter()
  49. if err != nil {
  50. return false, err
  51. }
  52. indexer, err = bleve.New(i.indexDir, indexMapping)
  53. if err != nil {
  54. return false, err
  55. }
  56. if err = rupture.WriteIndexMetadata(i.indexDir, &rupture.IndexMetadata{
  57. Version: i.version,
  58. }); err != nil {
  59. return false, err
  60. }
  61. i.Indexer = indexer
  62. return false, nil
  63. }
  64. // Ping checks if the indexer is available
  65. func (i *Indexer) Ping(_ context.Context) error {
  66. if i == nil {
  67. return errors.New("cannot ping nil indexer")
  68. }
  69. if i.Indexer == nil {
  70. return errors.New("indexer is not initialized")
  71. }
  72. return nil
  73. }
  74. func (i *Indexer) Close() {
  75. if i == nil || i.Indexer == nil {
  76. return
  77. }
  78. if err := i.Indexer.Close(); err != nil {
  79. log.Error("Failed to close bleve indexer in %q: %v", i.indexDir, err)
  80. }
  81. i.Indexer = nil
  82. }