Skip to content

Commit 35e7ab0

Browse files
committed
Detect elastic version
1 parent c378649 commit 35e7ab0

File tree

9 files changed

+138
-31
lines changed

9 files changed

+138
-31
lines changed

modules/indexer/code/elasticsearch/common.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,18 @@ package elasticsearch
55

66
import (
77
"code.gitea.io/gitea/modules/indexer/code/internal"
8+
inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch"
89
)
910

1011
// NewIndexer creates a new elasticsearch indexer
11-
func NewIndexer(url, indexerName string, version int) internal.Indexer {
12+
func NewIndexer(url, indexerName string) (internal.Indexer, error) {
13+
version, err := inner_elasticsearch.DetectVersion(url)
14+
if err != nil {
15+
return nil, err
16+
}
17+
1218
if version == 8 {
13-
return NewIndexerV8(url, indexerName)
19+
return NewIndexerV8(url, indexerName), nil
1420
}
15-
return NewIndexerV7(url, indexerName)
21+
return NewIndexerV7(url, indexerName), nil
1622
}

modules/indexer/code/indexer.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,13 @@ func Init() {
177177
}
178178
}()
179179

180-
rIndexer = elasticsearch.NewIndexer(setting.Indexer.RepoConnStr, setting.Indexer.RepoIndexerName, setting.Indexer.ElasticSearchVersion)
180+
rIndexer, err = elasticsearch.NewIndexer(setting.Indexer.RepoConnStr, setting.Indexer.RepoIndexerName)
181+
if err != nil {
182+
cancel()
183+
(*globalIndexer.Load()).Close()
184+
close(waitChannel)
185+
log.Fatal("PID: %d Unable to initialize the elasticsearch Repository Indexer connstr: %s Error: %v", os.Getpid(), setting.Indexer.RepoConnStr, err)
186+
}
181187
existed, err = rIndexer.Init(ctx)
182188
if err != nil {
183189
cancel()

modules/indexer/code/indexer_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,10 @@ func TestESIndexAndSearch(t *testing.T) {
124124
return
125125
}
126126

127-
version := 7
128-
if os.Getenv("TEST_ELASTICSEARCH_VERSION") == "8" {
129-
version = 8
127+
indexer, err := elasticsearch.NewIndexer(u, "gitea_codes")
128+
if err != nil {
129+
assert.FailNow(t, "Unable to create ES indexer Error: %v", err)
130130
}
131-
132-
indexer := elasticsearch.NewIndexer(u, "gitea_codes", version)
133131
if _, err := indexer.Init(context.Background()); err != nil {
134132
if indexer != nil {
135133
indexer.Close()
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package elasticsearch
5+
6+
import (
7+
"errors"
8+
"io"
9+
"net/http"
10+
"strings"
11+
"time"
12+
13+
"code.gitea.io/gitea/modules/json"
14+
)
15+
16+
// elasticRootResponse contains a subset of the response usable for version detection.
17+
type elasticRootResponse struct {
18+
Version struct {
19+
Number string `json:"number"`
20+
}
21+
}
22+
23+
// DetectVersion detects the major version of the elasticsearch server.
24+
// Currently only supports version 7 and 8.
25+
func DetectVersion(url string) (int, error) {
26+
client := &http.Client{
27+
Timeout: 5 * time.Second,
28+
}
29+
resp, err := client.Get(url)
30+
if err != nil {
31+
return 0, err
32+
}
33+
defer resp.Body.Close()
34+
return parseElasticVersion(resp.Body)
35+
}
36+
37+
func parseElasticVersion(body io.Reader) (int, error) {
38+
var root elasticRootResponse
39+
if err := json.NewDecoder(body).Decode(&root); err != nil {
40+
return 0, err
41+
}
42+
43+
majorStr, _, ok := strings.Cut(root.Version.Number, ".")
44+
if !ok {
45+
return 0, errors.New("invalid version number")
46+
}
47+
48+
if majorStr == "8" {
49+
return 8, nil
50+
} else if majorStr == "7" {
51+
return 7, nil
52+
}
53+
return 0, errors.New("unsupported ElasticSearch version")
54+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package elasticsearch
5+
6+
import (
7+
"strings"
8+
"testing"
9+
)
10+
11+
func TestParseElasticVersion(t *testing.T) {
12+
tests := []struct {
13+
content string
14+
version int
15+
hasError bool
16+
}{
17+
{
18+
content: `{"name":"instance-0000000000","cluster_name":"my_test_cluster","version":{"number":"7.0.0"}}`,
19+
version: 7,
20+
},
21+
{
22+
content: `{"version":{"number":"8.12.1"}}`,
23+
version: 8,
24+
},
25+
{
26+
content: `{"version":{"number":"6.0.0"}}`,
27+
version: 0,
28+
hasError: true,
29+
},
30+
{
31+
content: ``,
32+
version: 0,
33+
hasError: true,
34+
},
35+
}
36+
37+
for _, test := range tests {
38+
version, err := parseElasticVersion(strings.NewReader(test.content))
39+
if test.hasError && err == nil {
40+
t.Errorf("Expected error but got nil")
41+
}
42+
if !test.hasError && err != nil {
43+
t.Errorf("Expected no error but got %v", err)
44+
}
45+
if version != test.version {
46+
t.Errorf("Expected version %d but got %d", test.version, version)
47+
}
48+
}
49+
}

modules/indexer/issues/elasticsearch/common.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@
44
package elasticsearch
55

66
import (
7+
inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch"
78
"code.gitea.io/gitea/modules/indexer/issues/internal"
89
)
910

1011
// NewIndexer creates a new elasticsearch indexer
11-
func NewIndexer(url, indexerName string, version int) internal.Indexer {
12+
func NewIndexer(url, indexerName string) (internal.Indexer, error) {
13+
version, err := inner_elasticsearch.DetectVersion(url)
14+
if err != nil {
15+
return nil, err
16+
}
17+
1218
if version == 8 {
13-
return NewIndexerV8(url, indexerName)
19+
return NewIndexerV8(url, indexerName), nil
1420
}
15-
return NewIndexerV7(url, indexerName)
21+
return NewIndexerV7(url, indexerName), nil
1622
}

modules/indexer/issues/elasticsearch/elasticsearch_test.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"testing"
1111
"time"
1212

13-
"code.gitea.io/gitea/modules/indexer/issues/internal"
1413
"code.gitea.io/gitea/modules/indexer/issues/internal/tests"
1514
)
1615

@@ -27,11 +26,6 @@ func TestElasticsearchIndexer(t *testing.T) {
2726
}
2827
}
2928

30-
version := 7
31-
if os.Getenv("TEST_ELASTICSEARCH_VERSION") == "8" {
32-
version = 8
33-
}
34-
3529
ok := false
3630
for i := 0; i < 60; i++ {
3731
resp, err := http.Get(url)
@@ -47,14 +41,9 @@ func TestElasticsearchIndexer(t *testing.T) {
4741
return
4842
}
4943

50-
var indexer internal.Indexer
51-
switch version {
52-
case 7:
53-
indexer = NewIndexerV7(url, fmt.Sprintf("test_elasticsearch_indexer_%d", time.Now().Unix()))
54-
case 8:
55-
indexer = NewIndexerV8(url, fmt.Sprintf("test_elasticsearch_indexer_%d", time.Now().Unix()))
56-
default:
57-
t.Fatalf("Unsupported version %d", version)
44+
indexer, err := NewIndexer(url, fmt.Sprintf("test_elasticsearch_indexer_%d", time.Now().Unix()))
45+
if err != nil {
46+
t.Fatalf("Failed to create indexer: %v", err)
5847
}
5948
defer indexer.Close()
6049

modules/indexer/issues/indexer.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ func InitIssueIndexer(syncReindex bool) {
9696
log.Fatal("Unable to initialize Bleve Issue Indexer at path: %s Error: %v", setting.Indexer.IssuePath, err)
9797
}
9898
case "elasticsearch":
99-
issueIndexer = elasticsearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueIndexerName, setting.Indexer.ElasticSearchVersion)
99+
issueIndexer, err = elasticsearch.NewIndexer(setting.Indexer.IssueConnStr, setting.Indexer.IssueIndexerName)
100+
if err != nil {
101+
log.Fatal("Unable to initialize ElasticSearch issue indexer at connection %s Error: %v", setting.Indexer.IssueConnStr, err)
102+
}
100103
existed, err = issueIndexer.Init(ctx)
101104
if err != nil {
102105
log.Fatal("Unable to issueIndexer.Init with connection %s Error: %v", setting.Indexer.IssueConnStr, err)

modules/setting/indexer.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ var Indexer = struct {
2121
IssueIndexerName string
2222
StartupTimeout time.Duration
2323

24-
ElasticSearchVersion int
25-
2624
RepoIndexerEnabled bool
2725
RepoIndexerRepoTypes []string
2826
RepoType string
@@ -90,8 +88,6 @@ func loadIndexerFrom(rootCfg ConfigProvider) {
9088
Indexer.ExcludeVendored = sec.Key("REPO_INDEXER_EXCLUDE_VENDORED").MustBool(true)
9189
Indexer.MaxIndexerFileSize = sec.Key("MAX_FILE_SIZE").MustInt64(1024 * 1024)
9290
Indexer.StartupTimeout = sec.Key("STARTUP_TIMEOUT").MustDuration(30 * time.Second)
93-
94-
Indexer.ElasticSearchVersion = sec.Key("ELASTICSEARCH_VERSION").MustInt(7)
9591
}
9692

9793
// IndexerGlobFromString parses a comma separated list of patterns and returns a glob.Glob slice suited for repo indexing

0 commit comments

Comments
 (0)