@@ -1736,7 +1736,6 @@ row_merge_read_clustered_index(
1736
1736
mem_heap_t * mtuple_heap = NULL ;
1737
1737
mtuple_t prev_mtuple;
1738
1738
mem_heap_t * conv_heap = NULL ;
1739
- FlushObserver* observer = trx->flush_observer ;
1740
1739
double curr_progress = 0.0 ;
1741
1740
ib_uint64_t read_rows = 0 ;
1742
1741
ib_uint64_t table_total_rows = 0 ;
@@ -2211,9 +2210,8 @@ row_merge_read_clustered_index(
2211
2210
bool skip_sort = skip_pk_sort
2212
2211
&& dict_index_is_clust (merge_buf[0 ]->index );
2213
2212
2214
- for (ulint i = 0 ; i < n_index; i++, skip_sort = false ) {
2213
+ for (ulint k = 0 , i = 0 ; i < n_index; i++, skip_sort = false ) {
2215
2214
row_merge_buf_t * buf = merge_buf[i];
2216
- merge_file_t * file = &files[i];
2217
2215
ulint rows_added = 0 ;
2218
2216
2219
2217
if (dict_index_is_spatial (buf->index )) {
@@ -2237,13 +2235,24 @@ row_merge_read_clustered_index(
2237
2235
continue ;
2238
2236
}
2239
2237
2238
+ merge_file_t * file = &files[k++];
2239
+
2240
2240
if (UNIV_LIKELY
2241
2241
(row && (rows_added = row_merge_buf_add (
2242
2242
buf, fts_index, old_table, new_table,
2243
2243
psort_info, row, ext, &doc_id,
2244
2244
conv_heap, &err,
2245
2245
&v_heap, eval_table, trx)))) {
2246
2246
2247
+ /* Set the page flush observer for the
2248
+ transaction when buffering the very first
2249
+ record for a non-redo-logged operation. */
2250
+ if (file->n_rec == 0 && i == 0
2251
+ && innodb_log_optimize_ddl) {
2252
+ trx->set_flush_observer (
2253
+ new_table->space , stage);
2254
+ }
2255
+
2247
2256
/* If we are creating FTS index,
2248
2257
a single row can generate more
2249
2258
records for tokenized word */
@@ -2383,7 +2392,7 @@ row_merge_read_clustered_index(
2383
2392
clust_btr_bulk = UT_NEW_NOKEY (
2384
2393
BtrBulk (index[i],
2385
2394
trx,
2386
- observer /* */ ));
2395
+ trx-> get_flush_observer () ));
2387
2396
} else {
2388
2397
clust_btr_bulk->latch ();
2389
2398
}
@@ -2495,8 +2504,9 @@ row_merge_read_clustered_index(
2495
2504
trx->error_key_num = i;
2496
2505
goto all_done;);
2497
2506
2498
- BtrBulk btr_bulk (index[i], trx,
2499
- observer);
2507
+ BtrBulk btr_bulk (
2508
+ index[i], trx,
2509
+ trx->get_flush_observer ());
2500
2510
2501
2511
err = row_merge_insert_index_tuples (
2502
2512
index[i], old_table,
@@ -4597,47 +4607,26 @@ row_merge_build_indexes(
4597
4607
}
4598
4608
4599
4609
trx_start_if_not_started_xa (trx, true );
4610
+ ulint n_merge_files = 0 ;
4600
4611
4601
- /* Check if we need a flush observer to flush dirty pages.
4602
- Since we disable redo logging in bulk load, so we should flush
4603
- dirty pages before online log apply, because online log apply enables
4604
- redo logging(we can do further optimization here).
4605
- 1. online add index: flush dirty pages right before row_log_apply().
4606
- 2. table rebuild: flush dirty pages before row_log_table_apply().
4607
-
4608
- we use bulk load to create all types of indexes except spatial index,
4609
- for which redo logging is enabled. If we create only spatial indexes,
4610
- we don't need to flush dirty pages at all. */
4611
- bool need_flush_observer = bool (innodb_log_optimize_ddl);
4612
-
4613
- if (need_flush_observer) {
4614
- need_flush_observer = old_table != new_table;
4615
-
4616
- for (i = 0 ; i < n_indexes; i++) {
4617
- if (!dict_index_is_spatial (indexes[i])) {
4618
- need_flush_observer = true ;
4619
- }
4612
+ for (ulint i = 0 ; i < n_indexes; i++)
4613
+ {
4614
+ if (!dict_index_is_spatial (indexes[i])) {
4615
+ n_merge_files++;
4620
4616
}
4621
4617
}
4622
4618
4623
- FlushObserver* flush_observer = NULL ;
4624
- if (need_flush_observer) {
4625
- flush_observer = UT_NEW_NOKEY (
4626
- FlushObserver (new_table->space , trx, stage));
4627
-
4628
- trx_set_flush_observer (trx, flush_observer);
4629
- }
4630
-
4631
4619
merge_files = static_cast <merge_file_t *>(
4632
- ut_malloc_nokey (n_indexes * sizeof *merge_files));
4620
+ ut_malloc_nokey (n_merge_files * sizeof *merge_files));
4633
4621
4634
4622
/* Initialize all the merge file descriptors, so that we
4635
4623
don't call row_merge_file_destroy() on uninitialized
4636
4624
merge file descriptor */
4637
4625
4638
- for (i = 0 ; i < n_indexes ; i++) {
4626
+ for (i = 0 ; i < n_merge_files ; i++) {
4639
4627
merge_files[i].fd = -1 ;
4640
4628
merge_files[i].offset = 0 ;
4629
+ merge_files[i].n_rec = 0 ;
4641
4630
}
4642
4631
4643
4632
total_static_cost = COST_BUILD_INDEX_STATIC * n_indexes + COST_READ_CLUSTERED_INDEX;
@@ -4720,7 +4709,7 @@ row_merge_build_indexes(
4720
4709
" and create temporary files" );
4721
4710
}
4722
4711
4723
- for (i = 0 ; i < n_indexes ; i++) {
4712
+ for (i = 0 ; i < n_merge_files ; i++) {
4724
4713
total_index_blocks += merge_files[i].offset ;
4725
4714
}
4726
4715
@@ -4733,7 +4722,7 @@ row_merge_build_indexes(
4733
4722
/* Now we have files containing index entries ready for
4734
4723
sorting and inserting. */
4735
4724
4736
- for (i = 0 ; i < n_indexes; i++) {
4725
+ for (ulint k = 0 , i = 0 ; i < n_indexes; i++) {
4737
4726
dict_index_t * sort_idx = indexes[i];
4738
4727
4739
4728
if (dict_index_is_spatial (sort_idx)) {
@@ -4812,13 +4801,13 @@ row_merge_build_indexes(
4812
4801
#ifdef FTS_INTERNAL_DIAG_PRINT
4813
4802
DEBUG_FTS_SORT_PRINT (" FTS_SORT: Complete Insert\n " );
4814
4803
#endif
4815
- } else if (merge_files[i ].fd >= 0 ) {
4804
+ } else if (merge_files[k ].fd >= 0 ) {
4816
4805
char buf[NAME_LEN + 1 ];
4817
4806
row_merge_dup_t dup = {
4818
4807
sort_idx, table, col_map, 0 };
4819
4808
4820
4809
pct_cost = (COST_BUILD_INDEX_STATIC +
4821
- (total_dynamic_cost * merge_files[i ].offset /
4810
+ (total_dynamic_cost * merge_files[k ].offset /
4822
4811
total_index_blocks)) /
4823
4812
(total_static_cost + total_dynamic_cost)
4824
4813
* PCT_COST_MERGESORT_INDEX * 100 ;
@@ -4842,7 +4831,7 @@ row_merge_build_indexes(
4842
4831
}
4843
4832
4844
4833
error = row_merge_sort (
4845
- trx, &dup, &merge_files[i ],
4834
+ trx, &dup, &merge_files[k ],
4846
4835
block, &tmpfd, true ,
4847
4836
pct_progress, pct_cost,
4848
4837
crypt_block, new_table->space , stage);
@@ -4864,10 +4853,10 @@ row_merge_build_indexes(
4864
4853
4865
4854
if (error == DB_SUCCESS) {
4866
4855
BtrBulk btr_bulk (sort_idx, trx,
4867
- flush_observer );
4856
+ trx-> get_flush_observer () );
4868
4857
4869
4858
pct_cost = (COST_BUILD_INDEX_STATIC +
4870
- (total_dynamic_cost * merge_files[i ].offset /
4859
+ (total_dynamic_cost * merge_files[k ].offset /
4871
4860
total_index_blocks)) /
4872
4861
(total_static_cost + total_dynamic_cost) *
4873
4862
PCT_COST_INSERT_INDEX * 100 ;
@@ -4884,9 +4873,9 @@ row_merge_build_indexes(
4884
4873
4885
4874
error = row_merge_insert_index_tuples (
4886
4875
sort_idx, old_table,
4887
- merge_files[i ].fd , block, NULL ,
4876
+ merge_files[k ].fd , block, NULL ,
4888
4877
&btr_bulk,
4889
- merge_files[i ].n_rec , pct_progress, pct_cost,
4878
+ merge_files[k ].n_rec , pct_progress, pct_cost,
4890
4879
crypt_block, new_table->space , stage);
4891
4880
4892
4881
error = btr_bulk.finish (error);
@@ -4904,7 +4893,7 @@ row_merge_build_indexes(
4904
4893
}
4905
4894
4906
4895
/* Close the temporary file to free up space. */
4907
- row_merge_file_destroy (&merge_files[i ]);
4896
+ row_merge_file_destroy (&merge_files[k++ ]);
4908
4897
4909
4898
if (indexes[i]->type & DICT_FTS) {
4910
4899
row_fts_psort_info_destroy (psort_info, merge_info);
@@ -4916,7 +4905,12 @@ row_merge_build_indexes(
4916
4905
ut_ad (sort_idx->online_status
4917
4906
== ONLINE_INDEX_COMPLETE);
4918
4907
} else {
4919
- if (flush_observer) {
4908
+ if (dict_index_is_spatial (indexes[i])) {
4909
+ /* We never disable redo logging for
4910
+ creating SPATIAL INDEX. Avoid writing any
4911
+ unnecessary MLOG_INDEX_LOAD record. */
4912
+ } else if (FlushObserver* flush_observer =
4913
+ trx->get_flush_observer ()) {
4920
4914
flush_observer->flush ();
4921
4915
row_merge_write_redo (indexes[i]);
4922
4916
}
@@ -4958,7 +4952,7 @@ row_merge_build_indexes(
4958
4952
4959
4953
row_merge_file_destroy_low (tmpfd);
4960
4954
4961
- for (i = 0 ; i < n_indexes ; i++) {
4955
+ for (i = 0 ; i < n_merge_files ; i++) {
4962
4956
row_merge_file_destroy (&merge_files[i]);
4963
4957
}
4964
4958
@@ -5015,8 +5009,7 @@ row_merge_build_indexes(
5015
5009
5016
5010
DBUG_EXECUTE_IF (" ib_index_crash_after_bulk_load" , DBUG_SUICIDE (););
5017
5011
5018
- if (flush_observer != NULL ) {
5019
- ut_ad (need_flush_observer);
5012
+ if (FlushObserver* flush_observer = trx->get_flush_observer ()) {
5020
5013
5021
5014
DBUG_EXECUTE_IF (" ib_index_build_fail_before_flush" ,
5022
5015
error = DB_INTERRUPTED;
@@ -5028,7 +5021,7 @@ row_merge_build_indexes(
5028
5021
5029
5022
flush_observer->flush ();
5030
5023
5031
- UT_DELETE (flush_observer );
5024
+ trx-> remove_flush_observer ( );
5032
5025
5033
5026
if (trx_is_interrupted (trx)) {
5034
5027
error = DB_INTERRUPTED;
0 commit comments