Skip to content

Commit 361221c

Browse files
GiteaBotbsofiato
andauthored
Fixed race condition when deleting documents by repoId in ElasticSearch (#32185) (#32188)
Backport #32185 by @bsofiato Resolves #32184 Signed-off-by: Bruno Sofiato <[email protected]> Co-authored-by: Bruno Sofiato <[email protected]>
1 parent d86433c commit 361221c

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

modules/indexer/code/elasticsearch/elasticsearch.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
indexer_internal "code.gitea.io/gitea/modules/indexer/internal"
2121
inner_elasticsearch "code.gitea.io/gitea/modules/indexer/internal/elasticsearch"
2222
"code.gitea.io/gitea/modules/json"
23+
"code.gitea.io/gitea/modules/log"
2324
"code.gitea.io/gitea/modules/setting"
2425
"code.gitea.io/gitea/modules/timeutil"
2526
"code.gitea.io/gitea/modules/typesniffer"
@@ -197,8 +198,33 @@ func (b *Indexer) Index(ctx context.Context, repo *repo_model.Repository, sha st
197198
return nil
198199
}
199200

200-
// Delete deletes indexes by ids
201+
// Delete entries by repoId
201202
func (b *Indexer) Delete(ctx context.Context, repoID int64) error {
203+
if err := b.doDelete(ctx, repoID); err != nil {
204+
// Maybe there is a conflict during the delete operation, so we should retry after a refresh
205+
log.Warn("Deletion of entries of repo %v within index %v was erroneus. Trying to refresh index before trying again", repoID, b.inner.VersionedIndexName(), err)
206+
if err := b.refreshIndex(ctx); err != nil {
207+
return err
208+
}
209+
if err := b.doDelete(ctx, repoID); err != nil {
210+
log.Error("Could not delete entries of repo %v within index %v", repoID, b.inner.VersionedIndexName())
211+
return err
212+
}
213+
}
214+
return nil
215+
}
216+
217+
func (b *Indexer) refreshIndex(ctx context.Context) error {
218+
if _, err := b.inner.Client.Refresh(b.inner.VersionedIndexName()).Do(ctx); err != nil {
219+
log.Error("Error while trying to refresh index %v", b.inner.VersionedIndexName(), err)
220+
return err
221+
}
222+
223+
return nil
224+
}
225+
226+
// Delete entries by repoId
227+
func (b *Indexer) doDelete(ctx context.Context, repoID int64) error {
202228
_, err := b.inner.Client.DeleteByQuery(b.inner.VersionedIndexName()).
203229
Query(elastic.NewTermsQuery("repo_id", repoID)).
204230
Do(ctx)

0 commit comments

Comments
 (0)