Skip to content

Commit a6eeab5

Browse files
authored
Lightning: Make sure we are using default block size of 16KB if user does not specify one. (#60097) (#60184)
close #59947
1 parent f46af10 commit a6eeab5

File tree

4 files changed

+49
-1
lines changed

4 files changed

+49
-1
lines changed

lightning/pkg/importer/table_import.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,9 @@ func (tr *TableImporter) preprocessEngine(
664664
logTask := tr.logger.With(zap.Int32("engineNumber", engineID)).Begin(zap.InfoLevel, "encode kv data and write")
665665
dataEngineCfg := &backend.EngineConfig{
666666
TableInfo: tr.tableInfo,
667+
Local: backend.LocalEngineConfig{
668+
BlockSize: int(rc.cfg.TikvImporter.BlockSize),
669+
},
667670
}
668671
if !tr.tableMeta.IsRowOrdered {
669672
dataEngineCfg.Local.Compact = true

pkg/lightning/backend/local/engine.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,16 @@ func newSSTWriter(path string, blockSize int) (*sstable.Writer, error) {
14231423
if err != nil {
14241424
return nil, errors.Trace(err)
14251425
}
1426+
1427+
// Logic to ensure the default block size is set to 16KB.
1428+
// If a smaller block size is used (e.g., 4KB, the default for Pebble),
1429+
// a single large SST file may generate a disproportionately large index block,
1430+
// potentially causing a memory spike and leading to an Out of Memory (OOM) scenario.
1431+
// If the user specifies a smaller block size, respect their choice.
1432+
if blockSize <= 0 {
1433+
blockSize = config.DefaultBlockSize
1434+
}
1435+
14261436
writable := objstorageprovider.NewFileWritable(f)
14271437
writer := sstable.NewWriter(writable, sstable.WriterOptions{
14281438
TablePropertyCollectors: []func() pebble.TablePropertyCollector{

pkg/lightning/backend/local/engine_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"os"
2222
"path"
2323
"path/filepath"
24+
"reflect"
2425
"sync"
2526
"testing"
2627
"time"
@@ -33,6 +34,7 @@ import (
3334
"github.com/pingcap/tidb/br/pkg/membuf"
3435
"github.com/pingcap/tidb/pkg/lightning/backend"
3536
"github.com/pingcap/tidb/pkg/lightning/common"
37+
"github.com/pingcap/tidb/pkg/lightning/config"
3638
"github.com/pingcap/tidb/pkg/lightning/log"
3739
"github.com/stretchr/testify/require"
3840
"github.com/tikv/client-go/v2/oracle"
@@ -240,3 +242,36 @@ func TestIterOutputHasUniqueMemorySpace(t *testing.T) {
240242
// after iter closed, the memory buffer of iter goes to pool
241243
require.Greater(t, pool.TotalSize(), int64(0))
242244
}
245+
246+
// TestCreateSSTWriterDefaultBlockSize tests that createSSTWriter will use the default block size of 16KB if the block size is not set.
247+
func TestCreateSSTWriterDefaultBlockSize(t *testing.T) {
248+
db, tmpPath := makePebbleDB(t, nil)
249+
t.Cleanup(func() {
250+
require.NoError(t, db.Close())
251+
})
252+
engine := &Engine{
253+
config: backend.LocalEngineConfig{
254+
BlockSize: 0, // BlockSize is not set
255+
},
256+
sstDir: tmpPath,
257+
logger: log.Logger{},
258+
}
259+
260+
writer := &Writer{
261+
engine: engine,
262+
}
263+
264+
sstWriter, err := writer.createSSTWriter()
265+
require.NoError(t, err)
266+
require.NotNil(t, sstWriter)
267+
268+
// blockSize is a private field of sstWriter.writer, so we use reflection to access the private field blockSize
269+
writerValue := reflect.ValueOf(sstWriter.writer).Elem()
270+
blockSizeField := writerValue.FieldByName("blockSize")
271+
require.True(t, blockSizeField.IsValid(), "blockSize field should be valid")
272+
require.Equal(t, config.DefaultBlockSize, int(blockSizeField.Int()))
273+
274+
// clean up
275+
err = sstWriter.writer.Close()
276+
require.NoError(t, err)
277+
}

pkg/lightning/config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1496,7 +1496,7 @@ func NewConfig() *Config {
14961496
DiskQuota: ByteSize(math.MaxInt64),
14971497
DuplicateResolution: NoneOnDup,
14981498
PausePDSchedulerScope: PausePDSchedulerScopeTable,
1499-
BlockSize: 16 * 1024,
1499+
BlockSize: DefaultBlockSize,
15001500
LogicalImportBatchSize: ByteSize(defaultLogicalImportBatchSize),
15011501
LogicalImportBatchRows: defaultLogicalImportBatchRows,
15021502
LogicalImportPrepStmt: defaultLogicalImportPrepStmt,

0 commit comments

Comments
 (0)