diff --git a/src/store/db/indexes/full_text_index.go b/src/store/db/indexes/full_text_index.go index 6cc6a65eaf..d3b2c3968a 100644 --- a/src/store/db/indexes/full_text_index.go +++ b/src/store/db/indexes/full_text_index.go @@ -51,8 +51,50 @@ const ( fullTextMaxBatches = 100 fullTextPartitionSize = 100 fullTextBackfillBatchSize = 1_000 + + defaultFullTextMaxSegmentFileSize int64 = 256 << 20 + defaultFullTextSegmentsPerMergeTask = 5 ) +type bleveMergePlanOptions struct { + MaxSegmentFileSize int64 + SegmentsPerMergeTask int +} + +func (c FullTextIndexConfig) normalizedBleveMergePlanOptions() bleveMergePlanOptions { + maxSegmentFileSize := c.MaxSegmentFileSize + if maxSegmentFileSize == 0 { + maxSegmentFileSize = defaultFullTextMaxSegmentFileSize + } + segmentsPerMergeTask := c.SegmentsPerMergeTask + if segmentsPerMergeTask == 0 { + segmentsPerMergeTask = defaultFullTextSegmentsPerMergeTask + } + return bleveMergePlanOptions{ + MaxSegmentFileSize: maxSegmentFileSize, + SegmentsPerMergeTask: segmentsPerMergeTask, + } +} + +func (o bleveMergePlanOptions) validate() error { + if o.MaxSegmentFileSize < 1 { + return fmt.Errorf("max_segment_file_size must be positive, got %d", o.MaxSegmentFileSize) + } + if o.SegmentsPerMergeTask < 2 { + return fmt.Errorf("segments_per_merge_task must be at least 2, got %d", o.SegmentsPerMergeTask) + } + return nil +} + +func (o bleveMergePlanOptions) runtimeConfig() map[string]any { + return map[string]any{ + "scorchMergePlanOptions": map[string]any{ + "maxSegmentFileSize": o.MaxSegmentFileSize, + "segmentsPerMergeTask": o.SegmentsPerMergeTask, + }, + } +} + var fullTextRateLimiter *rate.Limiter = rate.NewLimiter( 10_000, fullTextMaxBatches*fullTextPartitionSize, @@ -298,6 +340,10 @@ func NewBleveIndexV2( return nil, fmt.Errorf("parsing config: %w", err) } } + mergePlanOptions := c.normalizedBleveMergePlanOptions() + if err := mergePlanOptions.validate(); err != nil { + return nil, fmt.Errorf("validating Bleve merge plan options: %w", err) + } indexPath := filepath.Join(dir, name) bi := &BleveIndexV2{ logger: logger, @@ -324,6 +370,10 @@ func (bi *BleveIndexV2) Type() IndexType { return IndexTypeFullText } +func (bi *BleveIndexV2) bleveRuntimeConfig() map[string]any { + return bi.conf.normalizedBleveMergePlanOptions().runtimeConfig() +} + // Open initializes or opens the Bleve index. func (bi *BleveIndexV2) Open( rebuild bool, @@ -372,12 +422,17 @@ func (bi *BleveIndexV2) Open( return fmt.Errorf("creating WALBuffer: %w", err) } if !bi.conf.MemOnly { + mergePlanOptions := bi.conf.normalizedBleveMergePlanOptions() + bi.logger.Info("Using Bleve merge plan options", + zap.Int64("max_segment_file_size", mergePlanOptions.MaxSegmentFileSize), + zap.Int("segments_per_merge_task", mergePlanOptions.SegmentsPerMergeTask)) + foundExisting := false bleveIndexPath := bi.indexPath + "/bleve" _, statErr := os.Stat(bleveIndexPath) if statErr == nil { // Directory exists and not rebuilding, open existing index - bi.bidx, err = bleve.Open(bleveIndexPath) + bi.bidx, err = bleve.OpenUsing(bleveIndexPath, bi.bleveRuntimeConfig()) if err == nil { bi.logger.Info("Opened existing Bleve index", zap.String("path", bleveIndexPath)) // No need to rebuild if we successfully opened existing index @@ -422,7 +477,13 @@ func (bi *BleveIndexV2) Open( bi.logger.Debug("Creating Bleve index with schema and mapping", zap.Any("schema", tableSchema), zap.Any("indexMapping", indexMapping)) - bi.bidx, err = bleve.New(bleveIndexPath, indexMapping) + bi.bidx, err = bleve.NewUsing( + bleveIndexPath, + indexMapping, + bleve.Config.DefaultIndexType, + bleve.Config.DefaultKVStore, + bi.bleveRuntimeConfig(), + ) if err != nil { return fmt.Errorf("creating bleve index at %s: %w", bleveIndexPath, err) } @@ -1087,12 +1148,12 @@ func (bi *BleveIndexV2) reloadMapping(newSchema *schema.TableSchema) error { // Reopen with updated mapping bleveIndexPath := bi.indexPath + "/bleve" - bi.bidx, err = bleve.OpenUsing(bleveIndexPath, map[string]any{ - "updated_mapping": string(mappingBytes), - }) + runtimeConfig := bi.bleveRuntimeConfig() + runtimeConfig["updated_mapping"] = string(mappingBytes) + bi.bidx, err = bleve.OpenUsing(bleveIndexPath, runtimeConfig) if err != nil { // Attempt to reopen without update on failure - bi.bidx, _ = bleve.Open(bleveIndexPath) + bi.bidx, _ = bleve.OpenUsing(bleveIndexPath, bi.bleveRuntimeConfig()) return fmt.Errorf("reopening index with updated mapping: %w", err) } diff --git a/src/store/db/indexes/full_text_index_test.go b/src/store/db/indexes/full_text_index_test.go index 876d82f1a3..352c9bdf97 100644 --- a/src/store/db/indexes/full_text_index_test.go +++ b/src/store/db/indexes/full_text_index_test.go @@ -54,6 +54,120 @@ func setupTestDB(t *testing.T) (*pebble.DB, string, func()) { return db, tempDir, cleanup } +func TestBleveMergePlanOptions(t *testing.T) { + tests := []struct { + name string + config FullTextIndexConfig + want bleveMergePlanOptions + wantErr string + }{ + { + name: "defaults", + config: FullTextIndexConfig{}, + want: bleveMergePlanOptions{ + MaxSegmentFileSize: defaultFullTextMaxSegmentFileSize, + SegmentsPerMergeTask: defaultFullTextSegmentsPerMergeTask, + }, + }, + { + name: "custom", + config: FullTextIndexConfig{ + MaxSegmentFileSize: 512 << 20, + SegmentsPerMergeTask: 7, + }, + want: bleveMergePlanOptions{ + MaxSegmentFileSize: 512 << 20, + SegmentsPerMergeTask: 7, + }, + }, + { + name: "negative max segment file size", + config: FullTextIndexConfig{ + MaxSegmentFileSize: -1, + }, + wantErr: "max_segment_file_size must be positive", + }, + { + name: "single segment merge task", + config: FullTextIndexConfig{ + SegmentsPerMergeTask: 1, + }, + wantErr: "segments_per_merge_task must be at least 2", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.config.normalizedBleveMergePlanOptions() + err := got.validate() + if tt.wantErr != "" { + require.ErrorContains(t, err, tt.wantErr) + return + } + require.NoError(t, err) + require.Equal(t, tt.want, got) + + runtimeConfig := got.runtimeConfig() + scorchOptions, ok := runtimeConfig["scorchMergePlanOptions"].(map[string]any) + require.True(t, ok) + require.Equal(t, got.MaxSegmentFileSize, scorchOptions["maxSegmentFileSize"]) + require.Equal(t, got.SegmentsPerMergeTask, scorchOptions["segmentsPerMergeTask"]) + }) + } +} + +func TestFullTextIndexConfigEqualNormalizesMergePlanDefaults(t *testing.T) { + implicitDefaults := FullTextIndexConfig{} + explicitDefaults := FullTextIndexConfig{ + MaxSegmentFileSize: defaultFullTextMaxSegmentFileSize, + SegmentsPerMergeTask: defaultFullTextSegmentsPerMergeTask, + } + custom := FullTextIndexConfig{ + MaxSegmentFileSize: 512 << 20, + SegmentsPerMergeTask: 7, + } + + require.True(t, implicitDefaults.Equal(explicitDefaults)) + require.False(t, implicitDefaults.Equal(custom)) +} + +func TestNewBleveIndexV2RejectsInvalidMergePlanOptions(t *testing.T) { + logger := zaptest.NewLogger(t).Sugar().Desugar() + db, tempDir, cleanup := setupTestDB(t) + defer cleanup() + + tests := []struct { + name string + config FullTextIndexConfig + wantErr string + }{ + { + name: "negative max segment file size", + config: FullTextIndexConfig{ + MaxSegmentFileSize: -1, + }, + wantErr: "max_segment_file_size must be positive", + }, + { + name: "single segment merge task", + config: FullTextIndexConfig{ + SegmentsPerMergeTask: 1, + }, + wantErr: "segments_per_merge_task must be at least 2", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + config, err := NewIndexConfig("test_index", tt.config) + require.NoError(t, err) + + _, err = NewBleveIndexV2(logger, nil, db, tempDir, "test_index", config, nil) + require.ErrorContains(t, err, tt.wantErr) + }) + } +} + func TestNewBleveIndexV2(t *testing.T) { logger := zaptest.NewLogger(t).Sugar().Desugar() db, tempDir, cleanup := setupTestDB(t) diff --git a/src/store/db/indexes/openapi.gen.go b/src/store/db/indexes/openapi.gen.go index cdc7f32cc7..5eba4214b9 100644 --- a/src/store/db/indexes/openapi.gen.go +++ b/src/store/db/indexes/openapi.gen.go @@ -412,8 +412,14 @@ type EmbeddingsIndexStats struct { // FullTextIndexConfig defines model for FullTextIndexConfig. type FullTextIndexConfig struct { + // MaxSegmentFileSize Maximum summed persisted input size, in bytes, for a Bleve vector-segment merge task. Defaults to 256 MiB. + MaxSegmentFileSize int64 `json:"max_segment_file_size,omitempty"` + // MemOnly Whether to use memory-only storage MemOnly bool `json:"mem_only,omitempty"` + + // SegmentsPerMergeTask Maximum number of segments in a Bleve merge task. Defaults to 5. + SegmentsPerMergeTask int `json:"segments_per_merge_task,omitempty"` } // FullTextIndexStats defines model for FullTextIndexStats. @@ -1289,221 +1295,222 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "iBdpevf/AgAA///PSN6SPvAAAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/src/store/db/indexes/openapi.go b/src/store/db/indexes/openapi.go index da6edc09ca..cb6dc07226 100644 --- a/src/store/db/indexes/openapi.go +++ b/src/store/db/indexes/openapi.go @@ -75,7 +75,8 @@ func NewFullTextIndexConfig(name string, memOnly bool) *IndexConfig { } func (bc FullTextIndexConfig) Equal(oc FullTextIndexConfig) bool { - return bc.MemOnly == oc.MemOnly + return bc.MemOnly == oc.MemOnly && + bc.normalizedBleveMergePlanOptions() == oc.normalizedBleveMergePlanOptions() } // normalizeDistanceMetric treats the zero value ("") as the default "l2_squared" diff --git a/src/store/db/indexes/openapi.yaml b/src/store/db/indexes/openapi.yaml index 980a686f8d..38ad14b9c8 100644 --- a/src/store/db/indexes/openapi.yaml +++ b/src/store/db/indexes/openapi.yaml @@ -72,6 +72,17 @@ components: x-go-type-skip-optional-pointer: true type: boolean description: "Whether to use memory-only storage" + max_segment_file_size: + x-go-type-skip-optional-pointer: true + type: integer + format: int64 + minimum: 1 + description: "Maximum summed persisted input size, in bytes, for a Bleve vector-segment merge task. Defaults to 256 MiB." + segments_per_merge_task: + x-go-type-skip-optional-pointer: true + type: integer + minimum: 2 + description: "Maximum number of segments in a Bleve merge task. Defaults to 5." FullTextIndexStats: type: object properties: