5
5
package code
6
6
7
7
import (
8
- "context"
9
8
"fmt"
10
9
"os"
11
10
"strconv"
12
11
"strings"
13
- "sync"
14
12
15
13
"code.gitea.io/gitea/models"
16
14
"code.gitea.io/gitea/modules/base"
17
15
"code.gitea.io/gitea/modules/charset"
18
16
"code.gitea.io/gitea/modules/git"
19
- "code.gitea.io/gitea/modules/graceful"
20
17
"code.gitea.io/gitea/modules/log"
21
18
"code.gitea.io/gitea/modules/setting"
22
19
@@ -59,7 +56,7 @@ func addUnicodeNormalizeTokenFilter(m *mapping.IndexMappingImpl) error {
59
56
// updates and bleve version updates. If index needs to be created (or
60
57
// re-created), returns (nil, nil)
61
58
func openIndexer (path string , latestVersion int ) (bleve.Index , error ) {
62
- _ , err := os .Stat (setting . Indexer . IssuePath )
59
+ _ , err := os .Stat (path )
63
60
if err != nil && os .IsNotExist (err ) {
64
61
return nil , nil
65
62
} else if err != nil {
@@ -137,34 +134,6 @@ const (
137
134
repoIndexerLatestVersion = 4
138
135
)
139
136
140
- type bleveIndexerHolder struct {
141
- index bleve.Index
142
- mutex sync.RWMutex
143
- cond * sync.Cond
144
- }
145
-
146
- func newBleveIndexerHolder () * bleveIndexerHolder {
147
- b := & bleveIndexerHolder {}
148
- b .cond = sync .NewCond (b .mutex .RLocker ())
149
- return b
150
- }
151
-
152
- func (r * bleveIndexerHolder ) set (index bleve.Index ) {
153
- r .mutex .Lock ()
154
- defer r .mutex .Unlock ()
155
- r .index = index
156
- r .cond .Broadcast ()
157
- }
158
-
159
- func (r * bleveIndexerHolder ) get () bleve.Index {
160
- r .mutex .RLock ()
161
- defer r .mutex .RUnlock ()
162
- if r .index == nil {
163
- r .cond .Wait ()
164
- }
165
- return r .index
166
- }
167
-
168
137
// createRepoIndexer create a repo indexer if one does not already exist
169
138
func createRepoIndexer (path string , latestVersion int ) (bleve.Index , error ) {
170
139
docMapping := bleve .NewDocumentMapping ()
@@ -222,51 +191,47 @@ var (
222
191
223
192
// BleveIndexer represents a bleve indexer implementation
224
193
type BleveIndexer struct {
225
- indexDir string
226
- indexerHolder * bleveIndexerHolder
194
+ indexDir string
195
+ indexer bleve. Index
227
196
}
228
197
229
198
// NewBleveIndexer creates a new bleve local indexer
230
- func NewBleveIndexer (indexDir string ) * BleveIndexer {
231
- return & BleveIndexer {
232
- indexDir : indexDir ,
233
- indexerHolder : newBleveIndexerHolder (),
199
+ func NewBleveIndexer (indexDir string ) (* BleveIndexer , bool , error ) {
200
+ indexer := & BleveIndexer {
201
+ indexDir : indexDir ,
234
202
}
203
+ created , err := indexer .init ()
204
+ return indexer , created , err
235
205
}
236
206
237
207
// Init init the indexer
238
- func (b * BleveIndexer ) Init () (bool , error ) {
239
- indexer , err := openIndexer (b .indexDir , repoIndexerLatestVersion )
208
+ func (b * BleveIndexer ) init () (bool , error ) {
209
+ var err error
210
+ b .indexer , err = openIndexer (b .indexDir , repoIndexerLatestVersion )
240
211
if err != nil {
241
- log . Fatal ( "openIndexer: %v" , err )
212
+ return false , err
242
213
}
243
- if indexer != nil {
244
- b .indexerHolder .set (indexer )
245
- b .closeAtTerminate ()
214
+ if b .indexer != nil {
246
215
return false , nil
247
216
}
248
217
249
- indexer , err = createRepoIndexer (setting . Indexer . RepoPath , repoIndexerLatestVersion )
218
+ b . indexer , err = createRepoIndexer (b . indexDir , repoIndexerLatestVersion )
250
219
if err != nil {
251
220
return false , err
252
221
}
253
- b .indexerHolder .set (indexer )
254
- b .closeAtTerminate ()
222
+
255
223
return true , nil
256
224
}
257
225
258
- func (b * BleveIndexer ) closeAtTerminate () {
259
- graceful .GetManager ().RunAtTerminate (context .Background (), func () {
260
- log .Debug ("Closing repo indexer" )
261
- indexer := b .indexerHolder .get ()
262
- if indexer != nil {
263
- err := indexer .Close ()
264
- if err != nil {
265
- log .Error ("Error whilst closing the repository indexer: %v" , err )
266
- }
226
+ func (b * BleveIndexer ) Close () {
227
+ log .Debug ("Closing repo indexer" )
228
+ if b .indexer != nil {
229
+ err := b .indexer .Close ()
230
+ if err != nil {
231
+ log .Error ("Error whilst closing the repository indexer: %v" , err )
267
232
}
268
- log . Info ( "PID: %d Repository Indexer closed" , os . Getpid ())
269
- } )
233
+ }
234
+ log . Info ( "PID: %d Repository Indexer closed" , os . Getpid () )
270
235
}
271
236
272
237
// Index indexes the data
@@ -287,7 +252,7 @@ func (b *BleveIndexer) Index(repoID int64) error {
287
252
return nil
288
253
}
289
254
290
- batch := rupture .NewFlushingBatch (b .indexerHolder . get () , maxBatchSize )
255
+ batch := rupture .NewFlushingBatch (b .indexer , maxBatchSize )
291
256
for _ , update := range changes .Updates {
292
257
if err := addUpdate (update , repo , batch ); err != nil {
293
258
return err
@@ -308,11 +273,11 @@ func (b *BleveIndexer) Index(repoID int64) error {
308
273
func (b * BleveIndexer ) Delete (repoID int64 ) error {
309
274
query := numericEqualityQuery (repoID , "RepoID" )
310
275
searchRequest := bleve .NewSearchRequestOptions (query , 2147483647 , 0 , false )
311
- result , err := b .indexerHolder . get () .Search (searchRequest )
276
+ result , err := b .indexer .Search (searchRequest )
312
277
if err != nil {
313
278
return err
314
279
}
315
- batch := rupture .NewFlushingBatch (b .indexerHolder . get () , maxBatchSize )
280
+ batch := rupture .NewFlushingBatch (b .indexer , maxBatchSize )
316
281
for _ , hit := range result .Hits {
317
282
if err = batch .Delete (hit .ID ); err != nil {
318
283
return err
@@ -348,7 +313,7 @@ func (b *BleveIndexer) Search(repoIDs []int64, keyword string, page, pageSize in
348
313
searchRequest .Fields = []string {"Content" , "RepoID" }
349
314
searchRequest .IncludeLocations = true
350
315
351
- result , err := b .indexerHolder . get () .Search (searchRequest )
316
+ result , err := b .indexer .Search (searchRequest )
352
317
if err != nil {
353
318
return 0 , nil , err
354
319
}
0 commit comments