@@ -4224,16 +4224,18 @@ TEST_P(WriteInteTest, TestPkSpillableIntermediateMergeWithTempFileTracking) {
42244224 auto batch3 =
42254225 arrow::ipc::internal::json::ArrayFromJSON (data_type, R"( [["Alice", 10, 3]])" ).ValueOrDie ();
42264226
4227- // Each write triggers spill. With LOCAL_SORT_MAX_NUM_FILE_HANDLES=2, intermediate
4228- // merge keeps the number of temp files bounded .
4227+ // Each write triggers spill. With LOCAL_SORT_MAX_NUM_FILE_HANDLES=2, leveled
4228+ // compaction merges when a level reaches max_fan_in files .
42294229 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 0 , batch1));
42304230 ASSERT_EQ (1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
42314231
42324232 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 0 , batch2));
42334233 ASSERT_EQ (1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
42344234
42354235 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 0 , batch3));
4236- ASSERT_EQ (1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4236+ // Level 0: 1 file (batch3), Level 1: 1 file (merged batch1+batch2) = 2 files total.
4237+ // Final cleanup at read time reduces this to <= max_fan_in - 1.
4238+ ASSERT_LE (TestHelper::CountChannelFiles (file_system_, tmp_dir), 2 );
42374239
42384240 // PrepareCommit should consume all spill files
42394241 ASSERT_OK_AND_ASSIGN (auto commit_messages,
@@ -4309,12 +4311,12 @@ TEST_P(WriteInteTest, TestPkSpillableMultiBucketMultiRoundDataCorrectness) {
43094311
43104312 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 0 , r1_b0_batch1));
43114313 ASSERT_EQ (1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4312- // Trigger spill merge
4314+ // Trigger leveled compaction (level 0 reaches max_fan_in=2)
43134315 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 0 , r1_b0_batch2));
43144316 ASSERT_EQ (1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4315- // Trigger spill merge
4317+ // Third write: level 0 has 1 file, level 1 has 1 file = 2 total
43164318 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 0 , r1_b0_batch3));
4317- ASSERT_EQ ( 1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4319+ ASSERT_LE ( TestHelper::CountChannelFiles (file_system_, tmp_dir), 2 );
43184320
43194321 auto r1_b1_batch1 =
43204322 arrow::ipc::internal::json::ArrayFromJSON (data_type, R"( [["Dave", 10, 10]])" ).ValueOrDie ();
@@ -4323,14 +4325,15 @@ TEST_P(WriteInteTest, TestPkSpillableMultiBucketMultiRoundDataCorrectness) {
43234325 auto r1_b1_batch3 =
43244326 arrow::ipc::internal::json::ArrayFromJSON (data_type, R"( [["Dave", 10, 30]])" ).ValueOrDie ();
43254327
4328+ int32_t bucket0_files = TestHelper::CountChannelFiles (file_system_, tmp_dir);
43264329 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 1 , r1_b1_batch1));
4327- ASSERT_EQ (2 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4328- // Trigger spill merge
4330+ ASSERT_EQ (bucket0_files + 1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4331+ // Trigger leveled compaction for bucket 1
43294332 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 1 , r1_b1_batch2));
4330- ASSERT_EQ (2 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4331- // Trigger spill merge
4333+ ASSERT_EQ (bucket0_files + 1 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4334+ // Third write for bucket 1: same pattern
43324335 ASSERT_OK (write_array_fn (file_store_write.get (), {{" pt" , " 10" }}, /* bucket=*/ 1 , r1_b1_batch3));
4333- ASSERT_EQ ( 2 , TestHelper::CountChannelFiles (file_system_, tmp_dir));
4336+ ASSERT_LE ( TestHelper::CountChannelFiles (file_system_, tmp_dir), bucket0_files + 2 );
43344337
43354338 ASSERT_OK_AND_ASSIGN (auto commit_messages_1,
43364339 file_store_write->PrepareCommit (/* wait_compaction=*/ false ,
0 commit comments