gitea源码

indexer.go 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package elasticsearch
  4. import (
  5. "context"
  6. "errors"
  7. "fmt"
  8. "code.gitea.io/gitea/modules/indexer/internal"
  9. "github.com/olivere/elastic/v7"
  10. )
  11. var _ internal.Indexer = &Indexer{}
  12. // Indexer represents a basic elasticsearch indexer implementation
  13. type Indexer struct {
  14. Client *elastic.Client
  15. url string
  16. indexName string
  17. version int
  18. mapping string
  19. }
  20. func NewIndexer(url, indexName string, version int, mapping string) *Indexer {
  21. return &Indexer{
  22. url: url,
  23. indexName: indexName,
  24. version: version,
  25. mapping: mapping,
  26. }
  27. }
  28. // Init initializes the indexer
  29. func (i *Indexer) Init(ctx context.Context) (bool, error) {
  30. if i == nil {
  31. return false, errors.New("cannot init nil indexer")
  32. }
  33. if i.Client != nil {
  34. return false, errors.New("indexer is already initialized")
  35. }
  36. client, err := i.initClient()
  37. if err != nil {
  38. return false, err
  39. }
  40. i.Client = client
  41. exists, err := i.Client.IndexExists(i.VersionedIndexName()).Do(ctx)
  42. if err != nil {
  43. return false, err
  44. }
  45. if exists {
  46. return true, nil
  47. }
  48. if err := i.createIndex(ctx); err != nil {
  49. return false, err
  50. }
  51. return exists, nil
  52. }
  53. // Ping checks if the indexer is available
  54. func (i *Indexer) Ping(ctx context.Context) error {
  55. if i == nil {
  56. return errors.New("cannot ping nil indexer")
  57. }
  58. if i.Client == nil {
  59. return errors.New("indexer is not initialized")
  60. }
  61. resp, err := i.Client.ClusterHealth().Do(ctx)
  62. if err != nil {
  63. return err
  64. }
  65. if resp.Status != "green" && resp.Status != "yellow" {
  66. // It's healthy if the status is green, and it's available if the status is yellow,
  67. // see https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html
  68. return fmt.Errorf("status of elasticsearch cluster is %s", resp.Status)
  69. }
  70. return nil
  71. }
  72. // Close closes the indexer
  73. func (i *Indexer) Close() {
  74. if i == nil {
  75. return
  76. }
  77. i.Client = nil
  78. }