diff --git a/appview/indexer/issues/indexer.go b/appview/indexer/issues/indexer.go --- a/appview/indexer/issues/indexer.go +++ b/appview/indexer/issues/indexer.go @@ -29,6 +29,9 @@ issueIndexerDocType = "issueIndexerDocType" unicodeNormalizeName = "uicodeNormalize" + + // Bump this when the index mapping changes to trigger a rebuild. + issueIndexerVersion = 2 ) type Indexer struct { @@ -118,7 +121,7 @@ return false, errors.New("indexer is already initialized") } - indexer, err := openIndexer(ctx, ix.path) + indexer, err := openIndexer(ctx, ix.path, issueIndexerVersion) if err != nil { return false, err } @@ -135,13 +138,14 @@ if err != nil { return false, err } + indexer.SetInternal([]byte("mapping_version"), []byte{byte(issueIndexerVersion)}) ix.indexer = indexer return false, nil } -func openIndexer(ctx context.Context, path string) (bleve.Index, error) { +func openIndexer(ctx context.Context, path string, version int) (bleve.Index, error) { l := tlog.FromContext(ctx) indexer, err := bleve.Open(path) if err != nil { @@ -151,6 +155,14 @@ } return nil, nil } + + storedVersion, _ := indexer.GetInternal([]byte("mapping_version")) + if storedVersion == nil || int(storedVersion[0]) != version { + l.Info("Indexer mapping version changed, deleting and rebuilding") + indexer.Close() + return nil, os.RemoveAll(path) + } + return indexer, nil } diff --git a/appview/indexer/pulls/indexer.go b/appview/indexer/pulls/indexer.go --- a/appview/indexer/pulls/indexer.go +++ b/appview/indexer/pulls/indexer.go @@ -28,6 +28,9 @@ pullIndexerDocType = "pullIndexerDocType" unicodeNormalizeName = "uicodeNormalize" + + // Bump this when the index mapping changes to trigger a rebuild. + pullIndexerVersion = 2 ) type Indexer struct { @@ -113,7 +116,7 @@ return false, errors.New("indexer is already initialized") } - indexer, err := openIndexer(ctx, ix.path) + indexer, err := openIndexer(ctx, ix.path, pullIndexerVersion) if err != nil { return false, err } @@ -130,13 +133,14 @@ if err != nil { return false, err } + indexer.SetInternal([]byte("mapping_version"), []byte{byte(pullIndexerVersion)}) ix.indexer = indexer return false, nil } -func openIndexer(ctx context.Context, path string) (bleve.Index, error) { +func openIndexer(ctx context.Context, path string, version int) (bleve.Index, error) { l := tlog.FromContext(ctx) indexer, err := bleve.Open(path) if err != nil { @@ -146,6 +150,14 @@ } return nil, nil } + + storedVersion, _ := indexer.GetInternal([]byte("mapping_version")) + if storedVersion == nil || int(storedVersion[0]) != version { + l.Info("Indexer mapping version changed, deleting and rebuilding") + indexer.Close() + return nil, os.RemoveAll(path) + } + return indexer, nil }