@@ -646,6 +646,79 @@ TEST_F(SpillTest, partition_process) {
646646 }
647647}
648648
649+ struct PredoSyncExecutor {
650+ static std::function<void ()> predo;
651+ static Status submit (workgroup::ScanTask task) {
652+ do {
653+ predo ();
654+ task.run ();
655+ } while (!task.is_finished ());
656+ return Status::OK ();
657+ }
658+ static void force_submit (workgroup::ScanTask task) { (void )submit (std::move (task)); }
659+ };
660+ std::function<void ()> PredoSyncExecutor::predo;
661+
662+ TEST_F (SpillTest, partition_yield_with_failed) {
663+ ObjectPool pool;
664+
665+ // order by id_int
666+ // full data id_int, id_smallint
667+ std::vector<bool > nullables = {false , false };
668+ TExprBuilder tuple_slots_builder;
669+ tuple_slots_builder << TYPE_INT ;
670+ auto tuple_slots = tuple_slots_builder.get_res ();
671+
672+ auto ctx_st = no_partition_context (&pool, &dummy_rt_st, {}, tuple_slots);
673+ ASSERT_OK (ctx_st.status ());
674+ auto ctx = ctx_st.value ();
675+ (void )ctx;
676+
677+ std::vector<ExprContext*> tuple;
678+ ASSERT_OK (Expr::create_expr_trees (&pool, tuple_slots, &tuple, &dummy_rt_st));
679+
680+ // create chunk
681+ RandomChunkBuilder chunk_builder;
682+
683+ // create spilled factory
684+ // auto factory_options = SpilledFactoryOptions(ctx->partition_nums, ctx->parition_exprs, ctx->sort_exprs, ctx->sort_descs, false);
685+ auto factory = spill::make_spilled_factory ();
686+
687+ // create spiller
688+ SpilledOptions spill_options (4 );
689+ // 4 buffer chunk
690+ spill_options.mem_table_pool_size = 1 ;
691+ // file size: 1M
692+ spill_options.spill_mem_table_bytes_size = 1 * 1024 * 1024 ;
693+ // spill format type
694+ spill_options.spill_type = spill::SpillFormaterType::SPILL_BY_COLUMN ;
695+
696+ spill_options.block_manager = dummy_block_mgr.get ();
697+
698+ auto chunk_empty = chunk_builder.gen (tuple, nullables);
699+
700+ auto spiller = factory->create (spill_options);
701+ spiller->set_metrics (metrics);
702+ SpillerCaller<spill::PartitionedSpillerWriter*, spill::SpillerReader*> caller (spiller.get ());
703+ ASSERT_OK (spiller->prepare (&dummy_rt_st));
704+
705+ size_t test_loop = 1024 ;
706+ std::vector<ChunkPtr> holder;
707+ {
708+ for (size_t i = 0 ; i < test_loop; ++i) {
709+ auto chunk = chunk_builder.gen (tuple, nullables);
710+ auto hash_column = spill::SpillHashColumn::create (chunk->num_rows ());
711+ chunk->append_column (std::move (hash_column), -1 );
712+ ASSERT_OK (spiller->spill <SyncExecutor>(&dummy_rt_st, chunk, EmptyMemGuard{}));
713+ ASSERT_OK (spiller->_spilled_task_status );
714+ holder.push_back (chunk);
715+ }
716+
717+ PredoSyncExecutor::predo = [&]() { spiller.reset (); };
718+ ASSERT_OK (spiller->flush <PredoSyncExecutor>(&dummy_rt_st, EmptyMemGuard{}));
719+ }
720+ }
721+
649722TEST_F (SpillTest, aligned_buffer) {
650723 spill::AlignedBuffer buffer;
651724 ASSERT_EQ (buffer.data (), nullptr );
0 commit comments