From a175314c3e5827eb193872241446f2f8f5c9d33c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 20:07:14 +0200 Subject: Adding upstream version 1:10.5.12. Signed-off-by: Daniel Baumann --- mysql-test/suite/galera/t/GAL-382.test | 16 + mysql-test/suite/galera/t/GAL-401.test | 56 + mysql-test/suite/galera/t/GAL-419.test | 38 + mysql-test/suite/galera/t/GAL-480.test | 46 + mysql-test/suite/galera/t/GCF-1081.test | 72 ++ mysql-test/suite/galera/t/GCF-360.cnf | 17 + mysql-test/suite/galera/t/GCF-360.test | 65 ++ mysql-test/suite/galera/t/GCF-939.test | 31 + mysql-test/suite/galera/t/MDEV-10715.cnf | 14 + mysql-test/suite/galera/t/MDEV-10715.test | 19 + mysql-test/suite/galera/t/MDEV-15443.cnf | 5 + mysql-test/suite/galera/t/MDEV-15443.test | 53 + mysql-test/suite/galera/t/MDEV-16509.test | 144 +++ mysql-test/suite/galera/t/MDEV-18832.cnf | 4 + mysql-test/suite/galera/t/MDEV-18832.test | 15 + mysql-test/suite/galera/t/MDEV-20225.test | 49 + mysql-test/suite/galera/t/MDEV-20616.test | 244 +++++ mysql-test/suite/galera/t/MDEV-20793.test | 78 ++ mysql-test/suite/galera/t/MDEV-22021.combinations | 4 + mysql-test/suite/galera/t/MDEV-22021.test | 60 ++ mysql-test/suite/galera/t/MDEV-22051.test | 33 + mysql-test/suite/galera/t/MDEV-22055.test | 19 + mysql-test/suite/galera/t/MDEV-22227.test | 26 + mysql-test/suite/galera/t/MDEV-22421.test | 12 + mysql-test/suite/galera/t/MDEV-22458.test | 21 + mysql-test/suite/galera/t/MDEV-24063.test | 26 + mysql-test/suite/galera/t/MDEV-24327.cnf | 6 + mysql-test/suite/galera/t/MDEV-24327.test | 87 ++ mysql-test/suite/galera/t/MDEV-25562.test | 11 + mysql-test/suite/galera/t/MDEV-25740.test | 14 + mysql-test/suite/galera/t/MDEV-6860.cnf | 7 + mysql-test/suite/galera/t/MDEV-6860.test | 42 + mysql-test/suite/galera/t/MENT-1047.test | 7 + mysql-test/suite/galera/t/MW-252.test | 42 + mysql-test/suite/galera/t/MW-258.test | 42 + mysql-test/suite/galera/t/MW-259.test | 42 + mysql-test/suite/galera/t/MW-284.cnf | 1 + mysql-test/suite/galera/t/MW-284.test | 68 ++ mysql-test/suite/galera/t/MW-285.test | 31 + mysql-test/suite/galera/t/MW-286.test | 58 + mysql-test/suite/galera/t/MW-292.test | 93 ++ mysql-test/suite/galera/t/MW-309.test | 32 + mysql-test/suite/galera/t/MW-313.cnf | 12 + mysql-test/suite/galera/t/MW-313.test | 51 + mysql-test/suite/galera/t/MW-328-footer.inc | 18 + mysql-test/suite/galera/t/MW-328-header.inc | 29 + mysql-test/suite/galera/t/MW-328A.cnf | 7 + mysql-test/suite/galera/t/MW-328A.test | 82 ++ mysql-test/suite/galera/t/MW-328B.cnf | 7 + mysql-test/suite/galera/t/MW-328B.test | 36 + mysql-test/suite/galera/t/MW-328C.cnf | 7 + mysql-test/suite/galera/t/MW-328C.test | 35 + mysql-test/suite/galera/t/MW-328D.cnf | 7 + mysql-test/suite/galera/t/MW-328D.test | 39 + mysql-test/suite/galera/t/MW-328E.cnf | 7 + mysql-test/suite/galera/t/MW-328E.test | 40 + mysql-test/suite/galera/t/MW-329.cnf | 9 + mysql-test/suite/galera/t/MW-329.test | 104 ++ mysql-test/suite/galera/t/MW-336.cnf | 7 + mysql-test/suite/galera/t/MW-336.test | 120 +++ mysql-test/suite/galera/t/MW-357.test | 13 + mysql-test/suite/galera/t/MW-360-master.opt | 2 + mysql-test/suite/galera/t/MW-369.inc | 74 ++ mysql-test/suite/galera/t/MW-369.test | 344 ++++++ mysql-test/suite/galera/t/MW-388.test | 79 ++ mysql-test/suite/galera/t/MW-402.test | 224 ++++ mysql-test/suite/galera/t/MW-416.test | 132 +++ mysql-test/suite/galera/t/MW-44-master.opt | 1 + mysql-test/suite/galera/t/MW-44.test | 32 + mysql-test/suite/galera/t/MW-86-wait1.test | 109 ++ mysql-test/suite/galera/t/MW-86-wait8.cnf | 10 + mysql-test/suite/galera/t/MW-86-wait8.test | 131 +++ mysql-test/suite/galera/t/basic.test | 26 + mysql-test/suite/galera/t/binlog_checksum.test | 36 + mysql-test/suite/galera/t/create.test | 89 ++ .../suite/galera/t/enforce_storage_engine.test | 33 + .../suite/galera/t/enforce_storage_engine2.cnf | 13 + .../suite/galera/t/enforce_storage_engine2.test | 20 + mysql-test/suite/galera/t/ev51914.test | 214 ++++ mysql-test/suite/galera/t/fk.test | 116 ++ mysql-test/suite/galera/t/galera#414.cnf | 8 + mysql-test/suite/galera/t/galera#414.test | 43 + mysql-test/suite/galera/t/galera#500.test | 45 + mysql-test/suite/galera/t/galera#505.test | 23 + mysql-test/suite/galera/t/galera-features#117.cnf | 5 + mysql-test/suite/galera/t/galera-features#117.test | 38 + .../t/galera_FK_duplicate_client_insert.test | 161 +++ mysql-test/suite/galera/t/galera_UK_conflict.test | 276 +++++ mysql-test/suite/galera/t/galera_admin.test | 86 ++ .../suite/galera/t/galera_alter_engine_innodb.test | 17 + .../suite/galera/t/galera_alter_engine_myisam.test | 25 + .../suite/galera/t/galera_alter_table_force.test | 17 + .../suite/galera/t/galera_applier_ftwrl_table.test | 34 + .../t/galera_applier_ftwrl_table_alter-master.opt | 1 + .../galera/t/galera_applier_ftwrl_table_alter.cnf | 14 + .../galera/t/galera_applier_ftwrl_table_alter.test | 37 + mysql-test/suite/galera/t/galera_as_master.cnf | 1 + mysql-test/suite/galera/t/galera_as_master.test | 69 ++ .../suite/galera/t/galera_as_master_large.cnf | 4 + .../suite/galera/t/galera_as_master_large.test | 46 + mysql-test/suite/galera/t/galera_as_slave.cnf | 1 + mysql-test/suite/galera/t/galera_as_slave.test | 51 + .../suite/galera/t/galera_as_slave_autoinc.cnf | 1 + .../suite/galera/t/galera_as_slave_autoinc.test | 83 ++ mysql-test/suite/galera/t/galera_as_slave_ctas.cnf | 5 + .../suite/galera/t/galera_as_slave_ctas.test | 74 ++ mysql-test/suite/galera/t/galera_as_slave_gtid.cnf | 6 + mysql-test/suite/galera/t/galera_as_slave_gtid.inc | 94 ++ .../suite/galera/t/galera_as_slave_gtid.test | 10 + .../galera/t/galera_as_slave_gtid_auto_engine.cnf | 8 + .../galera/t/galera_as_slave_gtid_auto_engine.test | 14 + .../suite/galera/t/galera_as_slave_gtid_myisam.cnf | 6 + .../galera/t/galera_as_slave_gtid_myisam.test | 90 ++ .../t/galera_as_slave_gtid_replicate_do_db_cc.cnf | 14 + .../suite/galera/t/galera_as_slave_nonprim.cnf | 1 + .../suite/galera/t/galera_as_slave_nonprim.test | 95 ++ .../suite/galera/t/galera_as_slave_replay.cnf | 11 + .../suite/galera/t/galera_as_slave_replay.test | 200 ++++ .../galera/t/galera_autoinc_sst_mariabackup.cnf | 11 + .../galera/t/galera_autoinc_sst_mariabackup.test | 71 ++ mysql-test/suite/galera/t/galera_backup_stage.test | 120 +++ mysql-test/suite/galera/t/galera_bf_abort.test | 34 + .../t/galera_bf_abort_at_after_statement.test | 37 + .../galera/t/galera_bf_abort_flush_for_export.test | 39 + .../suite/galera/t/galera_bf_abort_for_update.test | 56 + .../suite/galera/t/galera_bf_abort_ftwrl.test | 30 + .../suite/galera/t/galera_bf_abort_get_lock.test | 36 + .../galera/t/galera_bf_abort_group_commit.cnf | 15 + .../galera/t/galera_bf_abort_group_commit.test | 77 ++ .../suite/galera/t/galera_bf_abort_lock_table.test | 36 + mysql-test/suite/galera/t/galera_bf_abort_ps.cnf | 3 + mysql-test/suite/galera/t/galera_bf_abort_ps.test | 34 + .../galera/t/galera_bf_abort_ps_threadpool.cnf | 7 + .../galera/t/galera_bf_abort_ps_threadpool.test | 54 + .../suite/galera/t/galera_bf_abort_shutdown.test | 33 + .../suite/galera/t/galera_bf_abort_sleep.test | 30 + .../galera/t/galera_bf_background_statistics.cnf | 9 + .../galera/t/galera_bf_background_statistics.test | 49 + mysql-test/suite/galera/t/galera_bf_kill.cnf | 7 + mysql-test/suite/galera/t/galera_bf_kill.test | 141 +++ mysql-test/suite/galera/t/galera_bf_kill_debug.cnf | 7 + .../suite/galera/t/galera_bf_kill_debug.test | 140 +++ mysql-test/suite/galera/t/galera_bf_lock_wait.cnf | 7 + mysql-test/suite/galera/t/galera_bf_lock_wait.test | 90 ++ .../suite/galera/t/galera_binlog_cache_size.test | 35 + .../suite/galera/t/galera_binlog_checksum.cnf | 13 + .../suite/galera/t/galera_binlog_checksum.test | 43 + .../galera/t/galera_binlog_event_max_size_max.cnf | 9 + .../galera/t/galera_binlog_event_max_size_max.test | 21 + .../galera/t/galera_binlog_event_max_size_min.cnf | 9 + .../galera/t/galera_binlog_event_max_size_min.test | 15 + .../suite/galera/t/galera_binlog_row_image.test | 100 ++ .../suite/galera/t/galera_binlog_stmt_autoinc.cnf | 7 + .../suite/galera/t/galera_binlog_stmt_autoinc.test | 232 ++++ mysql-test/suite/galera/t/galera_can_run_toi.test | 34 + mysql-test/suite/galera/t/galera_change_user.test | 29 + mysql-test/suite/galera/t/galera_commit_empty.test | 35 + .../suite/galera/t/galera_concurrent_ctas.test | 57 + .../suite/galera/t/galera_create_function.test | 53 + .../suite/galera/t/galera_create_procedure.test | 52 + .../galera/t/galera_create_table_as_select.test | 145 +++ .../suite/galera/t/galera_create_table_like.test | 50 + .../suite/galera/t/galera_create_trigger.test | 43 + mysql-test/suite/galera/t/galera_create_view.test | 6 + mysql-test/suite/galera/t/galera_ctas.test | 39 + .../suite/galera/t/galera_ddl_fk_conflict.inc | 192 ++++ .../suite/galera/t/galera_ddl_fk_conflict.test | 37 + .../galera/t/galera_ddl_fk_conflict_with_tmp.inc | 69 ++ .../suite/galera/t/galera_ddl_multiline.test | 54 + mysql-test/suite/galera/t/galera_defaults.cnf | 7 + mysql-test/suite/galera/t/galera_defaults.test | 37 + mysql-test/suite/galera/t/galera_delete_limit.test | 52 + .../suite/galera/t/galera_desync_overlapped.test | 59 ++ .../suite/galera/t/galera_drop_database.test | 67 ++ mysql-test/suite/galera/t/galera_drop_multi.test | 41 + .../suite/galera/t/galera_encrypt_tmp_files.cnf | 8 + .../suite/galera/t/galera_encrypt_tmp_files.test | 57 + mysql-test/suite/galera/t/galera_enum.test | 68 ++ mysql-test/suite/galera/t/galera_events.test | 53 + mysql-test/suite/galera/t/galera_events2.test | 148 +++ .../suite/galera/t/galera_fk_cascade_delete.test | 70 ++ .../galera/t/galera_fk_cascade_delete_debug.test | 116 ++ .../suite/galera/t/galera_fk_cascade_update.test | 41 + mysql-test/suite/galera/t/galera_fk_conflict.test | 41 + mysql-test/suite/galera/t/galera_fk_lock_wait.test | 40 + mysql-test/suite/galera/t/galera_fk_mismatch.test | 38 + .../suite/galera/t/galera_fk_multicolumn.test | 42 + .../suite/galera/t/galera_fk_multitable.test | 32 + mysql-test/suite/galera/t/galera_fk_no_pk.test | 37 + .../suite/galera/t/galera_fk_selfreferential.test | 24 + mysql-test/suite/galera/t/galera_fk_setnull.test | 36 + mysql-test/suite/galera/t/galera_flush_local.test | 143 +++ .../t/galera_forced_binlog_format-master.opt | 1 + .../galera/t/galera_forced_binlog_format.test | 52 + mysql-test/suite/galera/t/galera_ftwrl.test | 39 + mysql-test/suite/galera/t/galera_ftwrl_drain.test | 69 ++ mysql-test/suite/galera/t/galera_fulltext.test | 85 ++ .../suite/galera/t/galera_gcache_recover.cnf | 7 + .../suite/galera/t/galera_gcache_recover.test | 77 ++ .../galera/t/galera_gcache_recover_full_gcache.cnf | 9 + .../t/galera_gcache_recover_full_gcache.test | 73 ++ .../galera/t/galera_gcache_recover_manytrx.cnf | 9 + .../galera/t/galera_gcache_recover_manytrx.test | 225 ++++ mysql-test/suite/galera/t/galera_gcs_fc_limit.test | 61 ++ mysql-test/suite/galera/t/galera_gcs_fragment.cnf | 5 + mysql-test/suite/galera/t/galera_gcs_fragment.test | 74 ++ .../suite/galera/t/galera_gcs_max_packet_size.cnf | 5 + .../suite/galera/t/galera_gcs_max_packet_size.test | 26 + mysql-test/suite/galera/t/galera_gra_log.test | 49 + mysql-test/suite/galera/t/galera_gtid-master.opt | 1 + mysql-test/suite/galera/t/galera_gtid.cnf | 10 + mysql-test/suite/galera/t/galera_gtid.test | 31 + mysql-test/suite/galera/t/galera_gtid_slave.cnf | 16 + mysql-test/suite/galera/t/galera_gtid_slave.test | 92 ++ .../suite/galera/t/galera_gtid_slave_sst_rsync.cnf | 18 + .../galera/t/galera_gtid_slave_sst_rsync.test | 199 ++++ .../suite/galera/t/galera_gtid_trx_conflict.cnf | 14 + .../suite/galera/t/galera_gtid_trx_conflict.test | 56 + .../suite/galera/t/galera_inject_bf_long_wait.test | 25 + .../suite/galera/t/galera_insert_ignore.test | 60 ++ mysql-test/suite/galera/t/galera_insert_multi.test | 122 +++ .../suite/galera/t/galera_ist_mariabackup.cnf | 15 + .../suite/galera/t/galera_ist_mariabackup.test | 16 + .../t/galera_ist_mariabackup_innodb_flush_logs.cnf | 16 + .../galera_ist_mariabackup_innodb_flush_logs.test | 13 + mysql-test/suite/galera/t/galera_ist_mysqldump.cnf | 10 + .../suite/galera/t/galera_ist_mysqldump.test | 24 + mysql-test/suite/galera/t/galera_ist_progress.cnf | 5 + mysql-test/suite/galera/t/galera_ist_progress.test | 77 ++ mysql-test/suite/galera/t/galera_ist_recv_bind.cnf | 8 + .../suite/galera/t/galera_ist_recv_bind.test | 55 + .../suite/galera/t/galera_ist_restart_joiner.cnf | 4 + .../suite/galera/t/galera_ist_restart_joiner.test | 111 ++ mysql-test/suite/galera/t/galera_ist_rsync.cnf | 12 + mysql-test/suite/galera/t/galera_ist_rsync.test | 13 + mysql-test/suite/galera/t/galera_kill_applier.test | 46 + mysql-test/suite/galera/t/galera_kill_ddl.test | 53 + .../suite/galera/t/galera_kill_largechanges.test | 50 + .../suite/galera/t/galera_kill_nochanges.test | 40 + .../suite/galera/t/galera_kill_smallchanges.test | 46 + .../suite/galera/t/galera_last_committed_id.cnf | 9 + .../galera/t/galera_last_committed_id.combinations | 6 + .../suite/galera/t/galera_last_committed_id.test | 66 ++ mysql-test/suite/galera/t/galera_load_data.cnf | 17 + mysql-test/suite/galera/t/galera_load_data.test | 100 ++ mysql-test/suite/galera/t/galera_lock_table.test | 52 + .../t/galera_lock_tables_in_transaction.test | 21 + mysql-test/suite/galera/t/galera_log_bin.cnf | 9 + mysql-test/suite/galera/t/galera_log_bin.inc | 46 + mysql-test/suite/galera/t/galera_log_bin.test | 1 + .../suite/galera/t/galera_log_bin_opt-master.opt | 1 + mysql-test/suite/galera/t/galera_log_bin_opt.cnf | 15 + mysql-test/suite/galera/t/galera_log_bin_opt.test | 2 + .../galera/t/galera_log_output_csv-master.opt | 1 + .../suite/galera/t/galera_log_output_csv.test | 26 + mysql-test/suite/galera/t/galera_many_columns.test | 63 ++ mysql-test/suite/galera/t/galera_many_indexes.test | 74 ++ mysql-test/suite/galera/t/galera_many_rows.cnf | 5 + mysql-test/suite/galera/t/galera_many_rows.test | 59 ++ .../suite/galera/t/galera_many_tables_nopk.test | 109 ++ .../suite/galera/t/galera_many_tables_pk.test | 101 ++ mysql-test/suite/galera/t/galera_mdev_10812.test | 27 + mysql-test/suite/galera/t/galera_mdev_13787.cnf | 9 + mysql-test/suite/galera/t/galera_mdev_13787.test | 6 + mysql-test/suite/galera/t/galera_mdev_15611.cnf | 5 + mysql-test/suite/galera/t/galera_mdev_15611.test | 30 + mysql-test/suite/galera/t/galera_mdl_race.test | 72 ++ .../suite/galera/t/galera_multi_database.test | 43 + .../galera/t/galera_multirow_rollback.combinations | 4 + .../suite/galera/t/galera_multirow_rollback.test | 89 ++ .../suite/galera/t/galera_myisam_autocommit.test | 45 + .../suite/galera/t/galera_myisam_transactions.test | 36 + mysql-test/suite/galera/t/galera_nonPK_and_PA.test | 168 +++ mysql-test/suite/galera/t/galera_nopk_bit.test | 46 + mysql-test/suite/galera/t/galera_nopk_blob.test | 46 + .../suite/galera/t/galera_nopk_large_varchar.test | 50 + mysql-test/suite/galera/t/galera_nopk_unicode.test | 43 + .../galera/t/galera_parallel_apply_lock_table.test | 51 + .../galera/t/galera_parallel_autoinc_largetrx.test | 70 ++ .../galera/t/galera_parallel_autoinc_manytrx.test | 95 ++ .../suite/galera/t/galera_parallel_simple.test | 67 ++ mysql-test/suite/galera/t/galera_partition.cnf | 18 + mysql-test/suite/galera/t/galera_partition.test | 451 ++++++++ mysql-test/suite/galera/t/galera_password.test | 14 + mysql-test/suite/galera/t/galera_pc_ignore_sb.test | 54 + mysql-test/suite/galera/t/galera_pc_recovery.test | 102 ++ .../suite/galera/t/galera_performance_schema.test | 58 + .../suite/galera/t/galera_pk_bigint_signed.test | 46 + .../suite/galera/t/galera_pk_bigint_unsigned.test | 45 + .../suite/galera/t/galera_prepared_statement.test | 45 + mysql-test/suite/galera/t/galera_query_cache.cnf | 10 + mysql-test/suite/galera/t/galera_query_cache.test | 67 ++ .../galera/t/galera_query_cache_sync_wait.cnf | 10 + .../galera/t/galera_query_cache_sync_wait.test | 90 ++ mysql-test/suite/galera/t/galera_read_only.test | 39 + .../galera/t/galera_repl_key_format_flat16.test | 34 + .../suite/galera/t/galera_repl_max_ws_size.test | 29 + .../suite/galera/t/galera_restart_nochanges.test | 40 + .../galera/t/galera_restart_on_unknown_option.test | 158 +++ mysql-test/suite/galera/t/galera_roles.test | 201 ++++ mysql-test/suite/galera/t/galera_rsu_add_pk.test | 49 + mysql-test/suite/galera/t/galera_rsu_drop_pk.test | 66 ++ mysql-test/suite/galera/t/galera_rsu_error.test | 34 + mysql-test/suite/galera/t/galera_rsu_simple.test | 37 + .../suite/galera/t/galera_rsu_wsrep_desync.test | 86 ++ mysql-test/suite/galera/t/galera_sbr.test | 27 + mysql-test/suite/galera/t/galera_sbr_binlog.cnf | 7 + mysql-test/suite/galera/t/galera_sbr_binlog.test | 28 + .../suite/galera/t/galera_schema_dirty_reads.test | 13 + mysql-test/suite/galera/t/galera_serializable.test | 76 ++ mysql-test/suite/galera/t/galera_server.test | 28 + .../t/galera_set_position_after_cert_failure.test | 98 ++ .../galera_set_position_after_dummy_writeset.test | 101 ++ .../suite/galera/t/galera_shutdown_nonprim.test | 36 + mysql-test/suite/galera/t/galera_slave_replay.cnf | 1 + mysql-test/suite/galera/t/galera_slave_replay.test | 197 ++++ mysql-test/suite/galera/t/galera_sp_bf_abort.inc | 38 + mysql-test/suite/galera/t/galera_sp_bf_abort.test | 347 ++++++ .../suite/galera/t/galera_sp_insert_parallel.test | 55 + mysql-test/suite/galera/t/galera_split_brain.test | 43 + .../suite/galera/t/galera_sql_log_bin_zero.test | 26 + mysql-test/suite/galera/t/galera_ssl.cnf | 7 + mysql-test/suite/galera/t/galera_ssl.test | 25 + .../suite/galera/t/galera_ssl_compression.cnf | 7 + .../suite/galera/t/galera_ssl_compression.test | 35 + mysql-test/suite/galera/t/galera_ssl_upgrade.cnf | 7 + mysql-test/suite/galera/t/galera_ssl_upgrade.test | 79 ++ .../suite/galera/t/galera_sst_mariabackup.cnf | 16 + .../suite/galera/t/galera_sst_mariabackup.test | 20 + .../galera/t/galera_sst_mariabackup_data_dir.cnf | 17 + .../galera/t/galera_sst_mariabackup_data_dir.test | 23 + ...ra_sst_mariabackup_encrypt_with_key-openssl.cnf | 13 + ...a_sst_mariabackup_encrypt_with_key-openssl.test | 12 + .../t/galera_sst_mariabackup_encrypt_with_key.cnf | 12 + .../t/galera_sst_mariabackup_encrypt_with_key.test | 24 + ...era_sst_mariabackup_encrypt_with_key_server.cnf | 13 + ...ra_sst_mariabackup_encrypt_with_key_server.test | 25 + .../galera/t/galera_sst_mariabackup_lost_found.cnf | 15 + .../t/galera_sst_mariabackup_lost_found.test | 71 ++ .../galera/t/galera_sst_mariabackup_qpress.cnf | 13 + .../galera/t/galera_sst_mariabackup_qpress.test | 24 + .../t/galera_sst_mariabackup_table_options.cnf | 18 + .../t/galera_sst_mariabackup_table_options.test | 229 ++++ mysql-test/suite/galera/t/galera_sst_mysqldump.cnf | 9 + .../suite/galera/t/galera_sst_mysqldump.test | 20 + .../galera/t/galera_sst_mysqldump_with_key.cnf | 17 + .../galera/t/galera_sst_mysqldump_with_key.test | 32 + mysql-test/suite/galera/t/galera_sst_rsync.cnf | 10 + mysql-test/suite/galera/t/galera_sst_rsync.test | 13 + mysql-test/suite/galera/t/galera_sst_rsync2.cnf | 14 + mysql-test/suite/galera/t/galera_sst_rsync2.test | 12 + .../suite/galera/t/galera_sst_rsync_binlogname.cnf | 12 + .../galera/t/galera_sst_rsync_binlogname.test | 9 + .../suite/galera/t/galera_sst_rsync_data_dir.cnf | 14 + .../suite/galera/t/galera_sst_rsync_data_dir.test | 16 + .../galera/t/galera_sst_rsync_encrypt_with_key.cnf | 14 + .../t/galera_sst_rsync_encrypt_with_key.test | 29 + .../t/galera_sst_rsync_encrypt_with_server.cnf | 16 + .../t/galera_sst_rsync_encrypt_with_server.test | 29 + .../galera/t/galera_sst_rsync_logbasename.cnf | 15 + .../galera/t/galera_sst_rsync_logbasename.test | 9 + .../suite/galera/t/galera_status_cluster.test | 18 + .../suite/galera/t/galera_status_local_index.test | 21 + .../suite/galera/t/galera_status_local_state.test | 28 + .../suite/galera/t/galera_suspend_slave.test | 70 ++ .../suite/galera/t/galera_sync_wait_show.test | 73 ++ .../galera/t/galera_sync_wait_upto-master.opt | 1 + .../suite/galera/t/galera_sync_wait_upto.cnf | 9 + .../galera/t/galera_sync_wait_upto.combinations | 6 + .../suite/galera/t/galera_sync_wait_upto.test | 72 ++ .../galera/t/galera_toi_alter_auto_increment.test | 122 +++ .../suite/galera/t/galera_toi_ddl_error.test | 34 + .../suite/galera/t/galera_toi_ddl_fk_insert.test | 69 ++ .../suite/galera/t/galera_toi_ddl_fk_update.test | 49 + .../suite/galera/t/galera_toi_ddl_locking.test | 98 ++ .../galera/t/galera_toi_ddl_nonconflicting.test | 41 + .../suite/galera/t/galera_toi_ddl_sequential.test | 32 + .../suite/galera/t/galera_toi_drop_database.test | 56 + mysql-test/suite/galera/t/galera_toi_ftwrl.test | 22 + .../suite/galera/t/galera_toi_lock_exclusive.test | 38 + .../suite/galera/t/galera_toi_lock_shared.test | 34 + mysql-test/suite/galera/t/galera_toi_truncate.test | 46 + .../galera/t/galera_transaction_read_only.test | 58 + .../suite/galera/t/galera_transaction_replay.test | 255 +++++ mysql-test/suite/galera/t/galera_trigger.test | 72 ++ mysql-test/suite/galera/t/galera_truncate.test | 79 ++ .../suite/galera/t/galera_truncate_temporary.test | 85 ++ mysql-test/suite/galera/t/galera_udf.cnf | 15 + .../suite/galera/t/galera_unicode_identifiers.test | 78 ++ mysql-test/suite/galera/t/galera_unicode_pk.test | 64 ++ mysql-test/suite/galera/t/galera_update_limit.test | 55 + mysql-test/suite/galera/t/galera_v1_row_events.cnf | 13 + .../suite/galera/t/galera_v1_row_events.test | 21 + .../suite/galera/t/galera_var_OSU_method.test | 45 + .../suite/galera/t/galera_var_OSU_method2.test | 47 + .../galera/t/galera_var_auto_inc_control_off.test | 105 ++ .../galera/t/galera_var_auto_inc_control_on.cnf | 13 + .../galera/t/galera_var_auto_inc_control_on.test | 65 ++ .../galera/t/galera_var_certify_nonPK_off.test | 43 + .../suite/galera/t/galera_var_cluster_address.test | 76 ++ .../suite/galera/t/galera_var_cluster_conf_id.test | 9 + .../suite/galera/t/galera_var_desync_on.test | 61 ++ .../suite/galera/t/galera_var_dirty_reads.test | 76 ++ mysql-test/suite/galera/t/galera_var_fkchecks.test | 40 + .../suite/galera/t/galera_var_gtid_domain_id.cnf | 16 + .../suite/galera/t/galera_var_gtid_domain_id.test | 64 ++ .../galera/t/galera_var_ignore_apply_errors.test | 274 +++++ .../t/galera_var_innodb_disallow_writes.test | 72 ++ .../galera/t/galera_var_load_data_splitting.test | 42 + mysql-test/suite/galera/t/galera_var_log_bin.cnf | 10 + mysql-test/suite/galera/t/galera_var_log_bin.test | 22 + .../suite/galera/t/galera_var_max_ws_rows.test | 176 ++++ .../suite/galera/t/galera_var_max_ws_size.test | 46 + .../t/galera_var_mysql_replication_bundle.test | 30 + .../suite/galera/t/galera_var_node_address.cnf | 10 + .../suite/galera/t/galera_var_node_address.test | 32 + .../galera/t/galera_var_notify_cmd-master.opt | 1 + .../suite/galera/t/galera_var_notify_cmd.test | 18 + .../suite/galera/t/galera_var_reject_queries.test | 49 + .../galera/t/galera_var_replicate_myisam_off.test | 21 + .../galera/t/galera_var_replicate_myisam_on.test | 229 ++++ .../galera/t/galera_var_retry_autocommit.test | 143 +++ .../suite/galera/t/galera_var_slave_threads.cnf | 7 + .../suite/galera/t/galera_var_slave_threads.test | 121 +++ mysql-test/suite/galera/t/galera_var_sst_auth.cnf | 7 + mysql-test/suite/galera/t/galera_var_sst_auth.test | 39 + .../suite/galera/t/galera_var_sync_wait.test | 53 + .../galera/t/galera_var_trx_fragment_size.test | 43 + .../suite/galera/t/galera_var_wsrep_on_off.test | 185 ++++ .../t/galera_var_wsrep_provider_options.test | 11 + .../galera/t/galera_var_wsrep_start_position.test | 76 ++ mysql-test/suite/galera/t/galera_view.test | 7 + mysql-test/suite/galera/t/galera_virtual_blob.test | 10 + .../suite/galera/t/galera_virtual_column.test | 42 + .../galera/t/galera_vote_drop_temporary-master.opt | 1 + .../suite/galera/t/galera_vote_rejoin_ddl.cnf | 10 + .../suite/galera/t/galera_vote_rejoin_ddl.test | 96 ++ .../suite/galera/t/galera_vote_rejoin_dml.cnf | 7 + .../suite/galera/t/galera_vote_rejoin_dml.test | 99 ++ mysql-test/suite/galera/t/galera_wan.cnf | 14 + mysql-test/suite/galera/t/galera_wan.test | 40 + .../suite/galera/t/galera_wan_restart_ist.cnf | 14 + .../suite/galera/t/galera_wan_restart_ist.test | 207 ++++ .../suite/galera/t/galera_wan_restart_sst.cnf | 14 + .../suite/galera/t/galera_wan_restart_sst.test | 138 +++ .../galera/t/galera_wsrep_desync_wsrep_on.test | 59 ++ .../suite/galera/t/galera_wsrep_log_conficts.cnf | 12 + .../suite/galera/t/galera_wsrep_log_conficts.test | 55 + .../galera/t/galera_wsrep_new_cluster-master.opt | 1 + .../suite/galera/t/galera_wsrep_new_cluster.test | 39 + .../t/galera_wsrep_provider_options_syntax.test | 20 + .../galera/t/galera_wsrep_provider_unset_set.test | 50 + .../suite/galera/t/galera_zero_length_column.test | 41 + mysql-test/suite/galera/t/grant.test | 25 + mysql-test/suite/galera/t/lp1276424.test | 17 + mysql-test/suite/galera/t/lp1347768.test | 24 + mysql-test/suite/galera/t/lp1376747-2.test | 29 + mysql-test/suite/galera/t/lp1376747-3.test | 28 + mysql-test/suite/galera/t/lp1376747-4.test | 60 ++ mysql-test/suite/galera/t/lp1376747.test | 31 + mysql-test/suite/galera/t/lp1438990.test | 38 + mysql-test/suite/galera/t/lp959512.test | 26 + mysql-test/suite/galera/t/mdev-22543.test | 58 + mysql-test/suite/galera/t/mdev_10518.cnf | 17 + mysql-test/suite/galera/t/mdev_10518.test | 64 ++ mysql-test/suite/galera/t/mdev_18730.test | 71 ++ mysql-test/suite/galera/t/mdev_21025.test | 22 + mysql-test/suite/galera/t/mdev_21718.cnf | 4 + mysql-test/suite/galera/t/mdev_21718.test | 35 + mysql-test/suite/galera/t/mdev_9290.test | 24 + mysql-test/suite/galera/t/mysql-wsrep#110.test | 51 + mysql-test/suite/galera/t/mysql-wsrep#198.cnf | 9 + mysql-test/suite/galera/t/mysql-wsrep#198.test | 40 + mysql-test/suite/galera/t/mysql-wsrep#201.cnf | 9 + mysql-test/suite/galera/t/mysql-wsrep#201.test | 32 + mysql-test/suite/galera/t/mysql-wsrep#237.test | 34 + mysql-test/suite/galera/t/mysql-wsrep#247.test | 23 + mysql-test/suite/galera/t/mysql-wsrep#31.test | 53 + mysql-test/suite/galera/t/mysql-wsrep#33.cnf | 8 + mysql-test/suite/galera/t/mysql-wsrep#33.test | 28 + mysql-test/suite/galera/t/mysql-wsrep#332.test | 113 ++ mysql-test/suite/galera/t/mysql-wsrep#90.test | 67 ++ .../suite/galera/t/mysql-wsrep-bugs-607.test | 70 ++ mysql-test/suite/galera/t/partition.test | 221 ++++ mysql-test/suite/galera/t/pxc-421.test | 67 ++ mysql-test/suite/galera/t/query_cache.cnf | 9 + mysql-test/suite/galera/t/query_cache.test | 1112 ++++++++++++++++++++ mysql-test/suite/galera/t/rename.test | 53 + mysql-test/suite/galera/t/rpl_row_annotate.cnf | 6 + mysql-test/suite/galera/t/rpl_row_annotate.test | 45 + mysql-test/suite/galera/t/sql_log_bin.test | 56 + mysql-test/suite/galera/t/unique_key.test | 54 + mysql-test/suite/galera/t/versioning_trx_id.cnf | 1 + mysql-test/suite/galera/t/versioning_trx_id.test | 42 + mysql-test/suite/galera/t/view.test | 50 + mysql-test/suite/galera/t/wsrep_strict_ddl.test | 133 +++ .../suite/galera/t/wsrep_trx_fragment_size_sr.test | 22 + 497 files changed, 25464 insertions(+) create mode 100644 mysql-test/suite/galera/t/GAL-382.test create mode 100644 mysql-test/suite/galera/t/GAL-401.test create mode 100644 mysql-test/suite/galera/t/GAL-419.test create mode 100644 mysql-test/suite/galera/t/GAL-480.test create mode 100644 mysql-test/suite/galera/t/GCF-1081.test create mode 100644 mysql-test/suite/galera/t/GCF-360.cnf create mode 100644 mysql-test/suite/galera/t/GCF-360.test create mode 100644 mysql-test/suite/galera/t/GCF-939.test create mode 100644 mysql-test/suite/galera/t/MDEV-10715.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-10715.test create mode 100644 mysql-test/suite/galera/t/MDEV-15443.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-15443.test create mode 100644 mysql-test/suite/galera/t/MDEV-16509.test create mode 100644 mysql-test/suite/galera/t/MDEV-18832.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-18832.test create mode 100644 mysql-test/suite/galera/t/MDEV-20225.test create mode 100644 mysql-test/suite/galera/t/MDEV-20616.test create mode 100644 mysql-test/suite/galera/t/MDEV-20793.test create mode 100644 mysql-test/suite/galera/t/MDEV-22021.combinations create mode 100644 mysql-test/suite/galera/t/MDEV-22021.test create mode 100644 mysql-test/suite/galera/t/MDEV-22051.test create mode 100644 mysql-test/suite/galera/t/MDEV-22055.test create mode 100644 mysql-test/suite/galera/t/MDEV-22227.test create mode 100644 mysql-test/suite/galera/t/MDEV-22421.test create mode 100644 mysql-test/suite/galera/t/MDEV-22458.test create mode 100644 mysql-test/suite/galera/t/MDEV-24063.test create mode 100644 mysql-test/suite/galera/t/MDEV-24327.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-24327.test create mode 100644 mysql-test/suite/galera/t/MDEV-25562.test create mode 100644 mysql-test/suite/galera/t/MDEV-25740.test create mode 100644 mysql-test/suite/galera/t/MDEV-6860.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-6860.test create mode 100644 mysql-test/suite/galera/t/MENT-1047.test create mode 100644 mysql-test/suite/galera/t/MW-252.test create mode 100644 mysql-test/suite/galera/t/MW-258.test create mode 100644 mysql-test/suite/galera/t/MW-259.test create mode 100644 mysql-test/suite/galera/t/MW-284.cnf create mode 100644 mysql-test/suite/galera/t/MW-284.test create mode 100644 mysql-test/suite/galera/t/MW-285.test create mode 100644 mysql-test/suite/galera/t/MW-286.test create mode 100644 mysql-test/suite/galera/t/MW-292.test create mode 100644 mysql-test/suite/galera/t/MW-309.test create mode 100644 mysql-test/suite/galera/t/MW-313.cnf create mode 100644 mysql-test/suite/galera/t/MW-313.test create mode 100644 mysql-test/suite/galera/t/MW-328-footer.inc create mode 100644 mysql-test/suite/galera/t/MW-328-header.inc create mode 100644 mysql-test/suite/galera/t/MW-328A.cnf create mode 100644 mysql-test/suite/galera/t/MW-328A.test create mode 100644 mysql-test/suite/galera/t/MW-328B.cnf create mode 100644 mysql-test/suite/galera/t/MW-328B.test create mode 100644 mysql-test/suite/galera/t/MW-328C.cnf create mode 100644 mysql-test/suite/galera/t/MW-328C.test create mode 100644 mysql-test/suite/galera/t/MW-328D.cnf create mode 100644 mysql-test/suite/galera/t/MW-328D.test create mode 100644 mysql-test/suite/galera/t/MW-328E.cnf create mode 100644 mysql-test/suite/galera/t/MW-328E.test create mode 100644 mysql-test/suite/galera/t/MW-329.cnf create mode 100644 mysql-test/suite/galera/t/MW-329.test create mode 100644 mysql-test/suite/galera/t/MW-336.cnf create mode 100644 mysql-test/suite/galera/t/MW-336.test create mode 100644 mysql-test/suite/galera/t/MW-357.test create mode 100644 mysql-test/suite/galera/t/MW-360-master.opt create mode 100644 mysql-test/suite/galera/t/MW-369.inc create mode 100644 mysql-test/suite/galera/t/MW-369.test create mode 100644 mysql-test/suite/galera/t/MW-388.test create mode 100644 mysql-test/suite/galera/t/MW-402.test create mode 100644 mysql-test/suite/galera/t/MW-416.test create mode 100644 mysql-test/suite/galera/t/MW-44-master.opt create mode 100644 mysql-test/suite/galera/t/MW-44.test create mode 100644 mysql-test/suite/galera/t/MW-86-wait1.test create mode 100644 mysql-test/suite/galera/t/MW-86-wait8.cnf create mode 100644 mysql-test/suite/galera/t/MW-86-wait8.test create mode 100644 mysql-test/suite/galera/t/basic.test create mode 100644 mysql-test/suite/galera/t/binlog_checksum.test create mode 100644 mysql-test/suite/galera/t/create.test create mode 100644 mysql-test/suite/galera/t/enforce_storage_engine.test create mode 100644 mysql-test/suite/galera/t/enforce_storage_engine2.cnf create mode 100644 mysql-test/suite/galera/t/enforce_storage_engine2.test create mode 100644 mysql-test/suite/galera/t/ev51914.test create mode 100644 mysql-test/suite/galera/t/fk.test create mode 100644 mysql-test/suite/galera/t/galera#414.cnf create mode 100644 mysql-test/suite/galera/t/galera#414.test create mode 100644 mysql-test/suite/galera/t/galera#500.test create mode 100644 mysql-test/suite/galera/t/galera#505.test create mode 100644 mysql-test/suite/galera/t/galera-features#117.cnf create mode 100644 mysql-test/suite/galera/t/galera-features#117.test create mode 100644 mysql-test/suite/galera/t/galera_FK_duplicate_client_insert.test create mode 100644 mysql-test/suite/galera/t/galera_UK_conflict.test create mode 100644 mysql-test/suite/galera/t/galera_admin.test create mode 100644 mysql-test/suite/galera/t/galera_alter_engine_innodb.test create mode 100644 mysql-test/suite/galera/t/galera_alter_engine_myisam.test create mode 100644 mysql-test/suite/galera/t/galera_alter_table_force.test create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table.test create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.cnf create mode 100644 mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test create mode 100644 mysql-test/suite/galera/t/galera_as_master.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_master.test create mode 100644 mysql-test/suite/galera/t/galera_as_master_large.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_master_large.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_autoinc.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_autoinc.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_ctas.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_ctas.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid.inc create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_gtid_replicate_do_db_cc.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_nonprim.test create mode 100644 mysql-test/suite/galera/t/galera_as_slave_replay.cnf create mode 100644 mysql-test/suite/galera/t/galera_as_slave_replay.test create mode 100644 mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.cnf create mode 100644 mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.test create mode 100644 mysql-test/suite/galera/t/galera_backup_stage.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_at_after_statement.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_for_update.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_ftwrl.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_get_lock.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_group_commit.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_lock_table.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_ps.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_ps.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_shutdown.test create mode 100644 mysql-test/suite/galera/t/galera_bf_abort_sleep.test create mode 100644 mysql-test/suite/galera/t/galera_bf_background_statistics.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_background_statistics.test create mode 100644 mysql-test/suite/galera/t/galera_bf_kill.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_kill.test create mode 100644 mysql-test/suite/galera/t/galera_bf_kill_debug.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_kill_debug.test create mode 100644 mysql-test/suite/galera/t/galera_bf_lock_wait.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_lock_wait.test create mode 100644 mysql-test/suite/galera/t/galera_binlog_cache_size.test create mode 100644 mysql-test/suite/galera/t/galera_binlog_checksum.cnf create mode 100644 mysql-test/suite/galera/t/galera_binlog_checksum.test create mode 100644 mysql-test/suite/galera/t/galera_binlog_event_max_size_max.cnf create mode 100644 mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test create mode 100644 mysql-test/suite/galera/t/galera_binlog_event_max_size_min.cnf create mode 100644 mysql-test/suite/galera/t/galera_binlog_event_max_size_min.test create mode 100644 mysql-test/suite/galera/t/galera_binlog_row_image.test create mode 100644 mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.cnf create mode 100644 mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.test create mode 100644 mysql-test/suite/galera/t/galera_can_run_toi.test create mode 100644 mysql-test/suite/galera/t/galera_change_user.test create mode 100644 mysql-test/suite/galera/t/galera_commit_empty.test create mode 100644 mysql-test/suite/galera/t/galera_concurrent_ctas.test create mode 100644 mysql-test/suite/galera/t/galera_create_function.test create mode 100644 mysql-test/suite/galera/t/galera_create_procedure.test create mode 100644 mysql-test/suite/galera/t/galera_create_table_as_select.test create mode 100644 mysql-test/suite/galera/t/galera_create_table_like.test create mode 100644 mysql-test/suite/galera/t/galera_create_trigger.test create mode 100644 mysql-test/suite/galera/t/galera_create_view.test create mode 100644 mysql-test/suite/galera/t/galera_ctas.test create mode 100644 mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc create mode 100644 mysql-test/suite/galera/t/galera_ddl_fk_conflict.test create mode 100644 mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc create mode 100644 mysql-test/suite/galera/t/galera_ddl_multiline.test create mode 100644 mysql-test/suite/galera/t/galera_defaults.cnf create mode 100644 mysql-test/suite/galera/t/galera_defaults.test create mode 100644 mysql-test/suite/galera/t/galera_delete_limit.test create mode 100644 mysql-test/suite/galera/t/galera_desync_overlapped.test create mode 100644 mysql-test/suite/galera/t/galera_drop_database.test create mode 100644 mysql-test/suite/galera/t/galera_drop_multi.test create mode 100644 mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf create mode 100644 mysql-test/suite/galera/t/galera_encrypt_tmp_files.test create mode 100644 mysql-test/suite/galera/t/galera_enum.test create mode 100644 mysql-test/suite/galera/t/galera_events.test create mode 100644 mysql-test/suite/galera/t/galera_events2.test create mode 100644 mysql-test/suite/galera/t/galera_fk_cascade_delete.test create mode 100644 mysql-test/suite/galera/t/galera_fk_cascade_delete_debug.test create mode 100644 mysql-test/suite/galera/t/galera_fk_cascade_update.test create mode 100644 mysql-test/suite/galera/t/galera_fk_conflict.test create mode 100644 mysql-test/suite/galera/t/galera_fk_lock_wait.test create mode 100644 mysql-test/suite/galera/t/galera_fk_mismatch.test create mode 100644 mysql-test/suite/galera/t/galera_fk_multicolumn.test create mode 100644 mysql-test/suite/galera/t/galera_fk_multitable.test create mode 100644 mysql-test/suite/galera/t/galera_fk_no_pk.test create mode 100644 mysql-test/suite/galera/t/galera_fk_selfreferential.test create mode 100644 mysql-test/suite/galera/t/galera_fk_setnull.test create mode 100644 mysql-test/suite/galera/t/galera_flush_local.test create mode 100644 mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt create mode 100644 mysql-test/suite/galera/t/galera_forced_binlog_format.test create mode 100644 mysql-test/suite/galera/t/galera_ftwrl.test create mode 100644 mysql-test/suite/galera/t/galera_ftwrl_drain.test create mode 100644 mysql-test/suite/galera/t/galera_fulltext.test create mode 100644 mysql-test/suite/galera/t/galera_gcache_recover.cnf create mode 100644 mysql-test/suite/galera/t/galera_gcache_recover.test create mode 100644 mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.cnf create mode 100644 mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.test create mode 100644 mysql-test/suite/galera/t/galera_gcache_recover_manytrx.cnf create mode 100644 mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test create mode 100644 mysql-test/suite/galera/t/galera_gcs_fc_limit.test create mode 100644 mysql-test/suite/galera/t/galera_gcs_fragment.cnf create mode 100644 mysql-test/suite/galera/t/galera_gcs_fragment.test create mode 100644 mysql-test/suite/galera/t/galera_gcs_max_packet_size.cnf create mode 100644 mysql-test/suite/galera/t/galera_gcs_max_packet_size.test create mode 100644 mysql-test/suite/galera/t/galera_gra_log.test create mode 100644 mysql-test/suite/galera/t/galera_gtid-master.opt create mode 100644 mysql-test/suite/galera/t/galera_gtid.cnf create mode 100644 mysql-test/suite/galera/t/galera_gtid.test create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave.cnf create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave.test create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test create mode 100644 mysql-test/suite/galera/t/galera_gtid_trx_conflict.cnf create mode 100644 mysql-test/suite/galera/t/galera_gtid_trx_conflict.test create mode 100644 mysql-test/suite/galera/t/galera_inject_bf_long_wait.test create mode 100644 mysql-test/suite/galera/t/galera_insert_ignore.test create mode 100644 mysql-test/suite/galera/t/galera_insert_multi.test create mode 100644 mysql-test/suite/galera/t/galera_ist_mariabackup.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_mariabackup.test create mode 100644 mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.test create mode 100644 mysql-test/suite/galera/t/galera_ist_mysqldump.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_mysqldump.test create mode 100644 mysql-test/suite/galera/t/galera_ist_progress.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_progress.test create mode 100644 mysql-test/suite/galera/t/galera_ist_recv_bind.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_recv_bind.test create mode 100644 mysql-test/suite/galera/t/galera_ist_restart_joiner.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_restart_joiner.test create mode 100644 mysql-test/suite/galera/t/galera_ist_rsync.cnf create mode 100644 mysql-test/suite/galera/t/galera_ist_rsync.test create mode 100644 mysql-test/suite/galera/t/galera_kill_applier.test create mode 100644 mysql-test/suite/galera/t/galera_kill_ddl.test create mode 100644 mysql-test/suite/galera/t/galera_kill_largechanges.test create mode 100644 mysql-test/suite/galera/t/galera_kill_nochanges.test create mode 100644 mysql-test/suite/galera/t/galera_kill_smallchanges.test create mode 100644 mysql-test/suite/galera/t/galera_last_committed_id.cnf create mode 100644 mysql-test/suite/galera/t/galera_last_committed_id.combinations create mode 100644 mysql-test/suite/galera/t/galera_last_committed_id.test create mode 100644 mysql-test/suite/galera/t/galera_load_data.cnf create mode 100644 mysql-test/suite/galera/t/galera_load_data.test create mode 100644 mysql-test/suite/galera/t/galera_lock_table.test create mode 100644 mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test create mode 100644 mysql-test/suite/galera/t/galera_log_bin.cnf create mode 100644 mysql-test/suite/galera/t/galera_log_bin.inc create mode 100644 mysql-test/suite/galera/t/galera_log_bin.test create mode 100644 mysql-test/suite/galera/t/galera_log_bin_opt-master.opt create mode 100644 mysql-test/suite/galera/t/galera_log_bin_opt.cnf create mode 100644 mysql-test/suite/galera/t/galera_log_bin_opt.test create mode 100644 mysql-test/suite/galera/t/galera_log_output_csv-master.opt create mode 100644 mysql-test/suite/galera/t/galera_log_output_csv.test create mode 100644 mysql-test/suite/galera/t/galera_many_columns.test create mode 100644 mysql-test/suite/galera/t/galera_many_indexes.test create mode 100644 mysql-test/suite/galera/t/galera_many_rows.cnf create mode 100644 mysql-test/suite/galera/t/galera_many_rows.test create mode 100644 mysql-test/suite/galera/t/galera_many_tables_nopk.test create mode 100644 mysql-test/suite/galera/t/galera_many_tables_pk.test create mode 100644 mysql-test/suite/galera/t/galera_mdev_10812.test create mode 100644 mysql-test/suite/galera/t/galera_mdev_13787.cnf create mode 100644 mysql-test/suite/galera/t/galera_mdev_13787.test create mode 100644 mysql-test/suite/galera/t/galera_mdev_15611.cnf create mode 100644 mysql-test/suite/galera/t/galera_mdev_15611.test create mode 100644 mysql-test/suite/galera/t/galera_mdl_race.test create mode 100644 mysql-test/suite/galera/t/galera_multi_database.test create mode 100644 mysql-test/suite/galera/t/galera_multirow_rollback.combinations create mode 100644 mysql-test/suite/galera/t/galera_multirow_rollback.test create mode 100644 mysql-test/suite/galera/t/galera_myisam_autocommit.test create mode 100644 mysql-test/suite/galera/t/galera_myisam_transactions.test create mode 100644 mysql-test/suite/galera/t/galera_nonPK_and_PA.test create mode 100644 mysql-test/suite/galera/t/galera_nopk_bit.test create mode 100644 mysql-test/suite/galera/t/galera_nopk_blob.test create mode 100644 mysql-test/suite/galera/t/galera_nopk_large_varchar.test create mode 100644 mysql-test/suite/galera/t/galera_nopk_unicode.test create mode 100644 mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test create mode 100644 mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test create mode 100644 mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test create mode 100644 mysql-test/suite/galera/t/galera_parallel_simple.test create mode 100644 mysql-test/suite/galera/t/galera_partition.cnf create mode 100644 mysql-test/suite/galera/t/galera_partition.test create mode 100644 mysql-test/suite/galera/t/galera_password.test create mode 100644 mysql-test/suite/galera/t/galera_pc_ignore_sb.test create mode 100644 mysql-test/suite/galera/t/galera_pc_recovery.test create mode 100644 mysql-test/suite/galera/t/galera_performance_schema.test create mode 100644 mysql-test/suite/galera/t/galera_pk_bigint_signed.test create mode 100644 mysql-test/suite/galera/t/galera_pk_bigint_unsigned.test create mode 100644 mysql-test/suite/galera/t/galera_prepared_statement.test create mode 100644 mysql-test/suite/galera/t/galera_query_cache.cnf create mode 100644 mysql-test/suite/galera/t/galera_query_cache.test create mode 100644 mysql-test/suite/galera/t/galera_query_cache_sync_wait.cnf create mode 100644 mysql-test/suite/galera/t/galera_query_cache_sync_wait.test create mode 100644 mysql-test/suite/galera/t/galera_read_only.test create mode 100644 mysql-test/suite/galera/t/galera_repl_key_format_flat16.test create mode 100644 mysql-test/suite/galera/t/galera_repl_max_ws_size.test create mode 100644 mysql-test/suite/galera/t/galera_restart_nochanges.test create mode 100644 mysql-test/suite/galera/t/galera_restart_on_unknown_option.test create mode 100644 mysql-test/suite/galera/t/galera_roles.test create mode 100644 mysql-test/suite/galera/t/galera_rsu_add_pk.test create mode 100644 mysql-test/suite/galera/t/galera_rsu_drop_pk.test create mode 100644 mysql-test/suite/galera/t/galera_rsu_error.test create mode 100644 mysql-test/suite/galera/t/galera_rsu_simple.test create mode 100644 mysql-test/suite/galera/t/galera_rsu_wsrep_desync.test create mode 100644 mysql-test/suite/galera/t/galera_sbr.test create mode 100644 mysql-test/suite/galera/t/galera_sbr_binlog.cnf create mode 100644 mysql-test/suite/galera/t/galera_sbr_binlog.test create mode 100644 mysql-test/suite/galera/t/galera_schema_dirty_reads.test create mode 100644 mysql-test/suite/galera/t/galera_serializable.test create mode 100644 mysql-test/suite/galera/t/galera_server.test create mode 100644 mysql-test/suite/galera/t/galera_set_position_after_cert_failure.test create mode 100644 mysql-test/suite/galera/t/galera_set_position_after_dummy_writeset.test create mode 100644 mysql-test/suite/galera/t/galera_shutdown_nonprim.test create mode 100644 mysql-test/suite/galera/t/galera_slave_replay.cnf create mode 100644 mysql-test/suite/galera/t/galera_slave_replay.test create mode 100644 mysql-test/suite/galera/t/galera_sp_bf_abort.inc create mode 100644 mysql-test/suite/galera/t/galera_sp_bf_abort.test create mode 100644 mysql-test/suite/galera/t/galera_sp_insert_parallel.test create mode 100644 mysql-test/suite/galera/t/galera_split_brain.test create mode 100644 mysql-test/suite/galera/t/galera_sql_log_bin_zero.test create mode 100644 mysql-test/suite/galera/t/galera_ssl.cnf create mode 100644 mysql-test/suite/galera/t/galera_ssl.test create mode 100644 mysql-test/suite/galera/t/galera_ssl_compression.cnf create mode 100644 mysql-test/suite/galera/t/galera_ssl_compression.test create mode 100644 mysql-test/suite/galera/t/galera_ssl_upgrade.cnf create mode 100644 mysql-test/suite/galera/t/galera_ssl_upgrade.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mysqldump.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mysqldump.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync2.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync2.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_binlogname.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_binlogname.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_data_dir.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_data_dir.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.test create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_logbasename.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_rsync_logbasename.test create mode 100644 mysql-test/suite/galera/t/galera_status_cluster.test create mode 100644 mysql-test/suite/galera/t/galera_status_local_index.test create mode 100644 mysql-test/suite/galera/t/galera_status_local_state.test create mode 100644 mysql-test/suite/galera/t/galera_suspend_slave.test create mode 100644 mysql-test/suite/galera/t/galera_sync_wait_show.test create mode 100644 mysql-test/suite/galera/t/galera_sync_wait_upto-master.opt create mode 100644 mysql-test/suite/galera/t/galera_sync_wait_upto.cnf create mode 100644 mysql-test/suite/galera/t/galera_sync_wait_upto.combinations create mode 100644 mysql-test/suite/galera/t/galera_sync_wait_upto.test create mode 100644 mysql-test/suite/galera/t/galera_toi_alter_auto_increment.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ddl_error.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ddl_fk_update.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ddl_locking.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ddl_sequential.test create mode 100644 mysql-test/suite/galera/t/galera_toi_drop_database.test create mode 100644 mysql-test/suite/galera/t/galera_toi_ftwrl.test create mode 100644 mysql-test/suite/galera/t/galera_toi_lock_exclusive.test create mode 100644 mysql-test/suite/galera/t/galera_toi_lock_shared.test create mode 100644 mysql-test/suite/galera/t/galera_toi_truncate.test create mode 100644 mysql-test/suite/galera/t/galera_transaction_read_only.test create mode 100644 mysql-test/suite/galera/t/galera_transaction_replay.test create mode 100644 mysql-test/suite/galera/t/galera_trigger.test create mode 100644 mysql-test/suite/galera/t/galera_truncate.test create mode 100644 mysql-test/suite/galera/t/galera_truncate_temporary.test create mode 100644 mysql-test/suite/galera/t/galera_udf.cnf create mode 100644 mysql-test/suite/galera/t/galera_unicode_identifiers.test create mode 100644 mysql-test/suite/galera/t/galera_unicode_pk.test create mode 100644 mysql-test/suite/galera/t/galera_update_limit.test create mode 100644 mysql-test/suite/galera/t/galera_v1_row_events.cnf create mode 100644 mysql-test/suite/galera/t/galera_v1_row_events.test create mode 100644 mysql-test/suite/galera/t/galera_var_OSU_method.test create mode 100644 mysql-test/suite/galera/t/galera_var_OSU_method2.test create mode 100644 mysql-test/suite/galera/t/galera_var_auto_inc_control_off.test create mode 100644 mysql-test/suite/galera/t/galera_var_auto_inc_control_on.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test create mode 100644 mysql-test/suite/galera/t/galera_var_certify_nonPK_off.test create mode 100644 mysql-test/suite/galera/t/galera_var_cluster_address.test create mode 100644 mysql-test/suite/galera/t/galera_var_cluster_conf_id.test create mode 100644 mysql-test/suite/galera/t/galera_var_desync_on.test create mode 100644 mysql-test/suite/galera/t/galera_var_dirty_reads.test create mode 100644 mysql-test/suite/galera/t/galera_var_fkchecks.test create mode 100644 mysql-test/suite/galera/t/galera_var_gtid_domain_id.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_gtid_domain_id.test create mode 100644 mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test create mode 100644 mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test create mode 100644 mysql-test/suite/galera/t/galera_var_load_data_splitting.test create mode 100644 mysql-test/suite/galera/t/galera_var_log_bin.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_log_bin.test create mode 100644 mysql-test/suite/galera/t/galera_var_max_ws_rows.test create mode 100644 mysql-test/suite/galera/t/galera_var_max_ws_size.test create mode 100644 mysql-test/suite/galera/t/galera_var_mysql_replication_bundle.test create mode 100644 mysql-test/suite/galera/t/galera_var_node_address.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_node_address.test create mode 100644 mysql-test/suite/galera/t/galera_var_notify_cmd-master.opt create mode 100644 mysql-test/suite/galera/t/galera_var_notify_cmd.test create mode 100644 mysql-test/suite/galera/t/galera_var_reject_queries.test create mode 100644 mysql-test/suite/galera/t/galera_var_replicate_myisam_off.test create mode 100644 mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test create mode 100644 mysql-test/suite/galera/t/galera_var_retry_autocommit.test create mode 100644 mysql-test/suite/galera/t/galera_var_slave_threads.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_slave_threads.test create mode 100644 mysql-test/suite/galera/t/galera_var_sst_auth.cnf create mode 100644 mysql-test/suite/galera/t/galera_var_sst_auth.test create mode 100644 mysql-test/suite/galera/t/galera_var_sync_wait.test create mode 100644 mysql-test/suite/galera/t/galera_var_trx_fragment_size.test create mode 100644 mysql-test/suite/galera/t/galera_var_wsrep_on_off.test create mode 100644 mysql-test/suite/galera/t/galera_var_wsrep_provider_options.test create mode 100644 mysql-test/suite/galera/t/galera_var_wsrep_start_position.test create mode 100644 mysql-test/suite/galera/t/galera_view.test create mode 100644 mysql-test/suite/galera/t/galera_virtual_blob.test create mode 100644 mysql-test/suite/galera/t/galera_virtual_column.test create mode 100644 mysql-test/suite/galera/t/galera_vote_drop_temporary-master.opt create mode 100644 mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf create mode 100644 mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test create mode 100644 mysql-test/suite/galera/t/galera_vote_rejoin_dml.cnf create mode 100644 mysql-test/suite/galera/t/galera_vote_rejoin_dml.test create mode 100644 mysql-test/suite/galera/t/galera_wan.cnf create mode 100644 mysql-test/suite/galera/t/galera_wan.test create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_ist.cnf create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_ist.test create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_sst.cnf create mode 100644 mysql-test/suite/galera/t/galera_wan_restart_sst.test create mode 100644 mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test create mode 100644 mysql-test/suite/galera/t/galera_wsrep_log_conficts.cnf create mode 100644 mysql-test/suite/galera/t/galera_wsrep_log_conficts.test create mode 100644 mysql-test/suite/galera/t/galera_wsrep_new_cluster-master.opt create mode 100644 mysql-test/suite/galera/t/galera_wsrep_new_cluster.test create mode 100644 mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test create mode 100644 mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test create mode 100644 mysql-test/suite/galera/t/galera_zero_length_column.test create mode 100644 mysql-test/suite/galera/t/grant.test create mode 100644 mysql-test/suite/galera/t/lp1276424.test create mode 100644 mysql-test/suite/galera/t/lp1347768.test create mode 100644 mysql-test/suite/galera/t/lp1376747-2.test create mode 100644 mysql-test/suite/galera/t/lp1376747-3.test create mode 100644 mysql-test/suite/galera/t/lp1376747-4.test create mode 100644 mysql-test/suite/galera/t/lp1376747.test create mode 100644 mysql-test/suite/galera/t/lp1438990.test create mode 100644 mysql-test/suite/galera/t/lp959512.test create mode 100644 mysql-test/suite/galera/t/mdev-22543.test create mode 100644 mysql-test/suite/galera/t/mdev_10518.cnf create mode 100644 mysql-test/suite/galera/t/mdev_10518.test create mode 100644 mysql-test/suite/galera/t/mdev_18730.test create mode 100644 mysql-test/suite/galera/t/mdev_21025.test create mode 100644 mysql-test/suite/galera/t/mdev_21718.cnf create mode 100644 mysql-test/suite/galera/t/mdev_21718.test create mode 100644 mysql-test/suite/galera/t/mdev_9290.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#110.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#198.cnf create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#198.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#201.cnf create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#201.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#237.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#247.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#31.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#33.cnf create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#33.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#332.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep#90.test create mode 100644 mysql-test/suite/galera/t/mysql-wsrep-bugs-607.test create mode 100644 mysql-test/suite/galera/t/partition.test create mode 100644 mysql-test/suite/galera/t/pxc-421.test create mode 100644 mysql-test/suite/galera/t/query_cache.cnf create mode 100644 mysql-test/suite/galera/t/query_cache.test create mode 100644 mysql-test/suite/galera/t/rename.test create mode 100644 mysql-test/suite/galera/t/rpl_row_annotate.cnf create mode 100644 mysql-test/suite/galera/t/rpl_row_annotate.test create mode 100644 mysql-test/suite/galera/t/sql_log_bin.test create mode 100644 mysql-test/suite/galera/t/unique_key.test create mode 100644 mysql-test/suite/galera/t/versioning_trx_id.cnf create mode 100644 mysql-test/suite/galera/t/versioning_trx_id.test create mode 100644 mysql-test/suite/galera/t/view.test create mode 100644 mysql-test/suite/galera/t/wsrep_strict_ddl.test create mode 100644 mysql-test/suite/galera/t/wsrep_trx_fragment_size_sr.test (limited to 'mysql-test/suite/galera/t') diff --git a/mysql-test/suite/galera/t/GAL-382.test b/mysql-test/suite/galera/t/GAL-382.test new file mode 100644 index 00000000..05cc7346 --- /dev/null +++ b/mysql-test/suite/galera/t/GAL-382.test @@ -0,0 +1,16 @@ +# +# GAL-382 InnoDB: Failing assertion: xid_seqno > trx_sys_cur_xid_seqno in trx0sys.cc line 356 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +create table t1 (i int, j int, k int, primary key pk(i)) engine=innodb; +insert into t1 values (1, 1, 1), (2, 2, 2), (3, 3, 3); +create table t2 (i int, j int, k int, primary key pk(i, j, k), index idx(i, k, j)) engine=innodb; +replace into t2 (i, j, k) select /*!99997 */ i, k, j from t1; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/GAL-401.test b/mysql-test/suite/galera/t/GAL-401.test new file mode 100644 index 00000000..06ce37dc --- /dev/null +++ b/mysql-test/suite/galera/t/GAL-401.test @@ -0,0 +1,56 @@ +# This tests proper desync counter cleanup when DONOR/DESYNC state is cleared. + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Make node 1 tolerate split-brain +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; + +# Desync and disconnect node 2 from the PC: +--connection node_2 +SET @@global.wsrep_desync = 1; +SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# Wait until node 2 disappears from the PC: +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# Modify app state to force node 2 into PRIMARY upon reconnection. +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); + +# Reconnect node 2 to the PC: +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +# Must return 0: +SHOW STATUS LIKE 'wsrep_desync_count'; + +# Resync node_2, should pass: +SET @@global.wsrep_desync = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc + +SET SESSION wsrep_sync_wait=15; +SHOW CREATE TABLE t1; +DROP TABLE t1; +CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; diff --git a/mysql-test/suite/galera/t/GAL-419.test b/mysql-test/suite/galera/t/GAL-419.test new file mode 100644 index 00000000..d304b01e --- /dev/null +++ b/mysql-test/suite/galera/t/GAL-419.test @@ -0,0 +1,38 @@ +# +# GAL-419 safe_to_bootstrap: boostrap using wsrep_cluster_address=gcomm:// not prevented +# + +--source include/galera_cluster.inc +--source include/big_test.inc + +call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node.*"); +call mtr.add_suppression("Aborting"); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--source include/kill_galera.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--source include/kill_galera.inc + +--sleep 2 + +# Node #1 has wsrep_cluster_address=gcomm:// in my.cnf, so should fail to bootstrap + +--error 1 +--exec $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf | grep 'This node is not safe to bootstrap the cluster' + +# Unless we remove grastate.dat + +--remove_file $MYSQLTEST_VARDIR/mysqld.1/data/grastate.dat +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--connection node_1 +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--connection node_2 +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--source include/start_mysqld.inc diff --git a/mysql-test/suite/galera/t/GAL-480.test b/mysql-test/suite/galera/t/GAL-480.test new file mode 100644 index 00000000..c2b34f2a --- /dev/null +++ b/mysql-test/suite/galera/t/GAL-480.test @@ -0,0 +1,46 @@ +--source include/galera_cluster.inc + +--connection node_1 +CREATE TABLE t1 (f1 CHAR(10), f0 integer) ENGINE=InnoDB; + +FLUSH TABLE t1 FOR EXPORT; +UNLOCK TABLES; + +ALTER TABLE t1 DROP COLUMN f1; + +SET SESSION wsrep_osu_method='RSU'; +ALTER TABLE t1 ADD COLUMN f1 CHAR(10); +ALTER TABLE t1 DROP COLUMN f1; +ALTER TABLE t1 ADD COLUMN f2 CHAR(10); +ALTER TABLE t1 DROP COLUMN f2; +ALTER TABLE t1 ADD COLUMN f3 CHAR(10); +ALTER TABLE t1 DROP COLUMN f3; +ALTER TABLE t1 ADD COLUMN f4 CHAR(10); +ALTER TABLE t1 DROP COLUMN f4; +ALTER TABLE t1 ADD COLUMN f5 CHAR(10); +ALTER TABLE t1 DROP COLUMN f5; +ALTER TABLE t1 ADD COLUMN f6 CHAR(10); +ALTER TABLE t1 DROP COLUMN f6; +ALTER TABLE t1 ADD COLUMN f7 CHAR(10); +ALTER TABLE t1 DROP COLUMN f7; +ALTER TABLE t1 ADD COLUMN f8 CHAR(10); +ALTER TABLE t1 DROP COLUMN f8; +ALTER TABLE t1 ADD COLUMN f9 CHAR(10); +ALTER TABLE t1 DROP COLUMN f9; +ALTER TABLE t1 ADD COLUMN f10 CHAR(10); +ALTER TABLE t1 DROP COLUMN f10; +ALTER TABLE t1 ADD COLUMN f11 CHAR(10); +ALTER TABLE t1 DROP COLUMN f11; +ALTER TABLE t1 ADD COLUMN f12 CHAR(10); +ALTER TABLE t1 DROP COLUMN f12; +ALTER TABLE t1 ADD COLUMN f13 CHAR(10); +ALTER TABLE t1 DROP COLUMN f13; +ALTER TABLE t1 ADD COLUMN f14 CHAR(10); +ALTER TABLE t1 DROP COLUMN f14; +ALTER TABLE t1 ADD COLUMN f15 CHAR(10); +ALTER TABLE t1 DROP COLUMN f15; +ALTER TABLE t1 ADD COLUMN f16 CHAR(10); +ALTER TABLE t1 DROP COLUMN f16; + +SET SESSION wsrep_osu_method='TOI'; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/GCF-1081.test b/mysql-test/suite/galera/t/GCF-1081.test new file mode 100644 index 00000000..38553fed --- /dev/null +++ b/mysql-test/suite/galera/t/GCF-1081.test @@ -0,0 +1,72 @@ +# +# GCF-1081 - Assertion `!thd->sp_runtime_ctx` +# +# Test replaying of stored procedures +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connection node_1 + +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 0), (3, 0); + +DELIMITER |; +CREATE PROCEDURE proc_update () +BEGIN + UPDATE t1 SET f2 = 1 where f1 > 0; +END| +DELIMITER ;| + +# Block the SP +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send CALL proc_update (); + +# Wait until SP is blocked +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--source include/galera_wait_sync_point.inc + +# Issue a conflicting insert on node #2 +--connection node_1a +SET GLOBAL debug_dbug = 'd,sync.wsrep_before_BF_victim_unlock'; + +--connection node_2 +--send INSERT INTO t1 VALUES (2, 2); + +# Wait until it BF aborts the SP +--connection node_1a +SET SESSION DEBUG_SYNC = 'now WAIT_FOR sync.wsrep_before_BF_victim_unlock_reached'; +SET GLOBAL debug_dbug = ''; + +# Unblock the SP +--connection node_1a +--source include/galera_clear_sync_point.inc +--source include/galera_signal_sync_point.inc + +--connection node_2 +--reap +SELECT * FROM t1; + +# SP succeeds +--connection node_1 +--reap +SELECT * FROM t1; + +# wsrep_local_replays has increased by 1 +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old AS wsrep_local_replays; +--enable_query_log + +DROP PROCEDURE proc_update; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/GCF-360.cnf b/mysql-test/suite/galera/t/GCF-360.cnf new file mode 100644 index 00000000..28e51f87 --- /dev/null +++ b/mysql-test/suite/galera/t/GCF-360.cnf @@ -0,0 +1,17 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port' +wsrep_ignore_apply_errors=0 + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port' +wsrep_ignore_apply_errors=0 + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port' +wsrep_ignore_apply_errors=0 + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port' +wsrep_ignore_apply_errors=0 diff --git a/mysql-test/suite/galera/t/GCF-360.test b/mysql-test/suite/galera/t/GCF-360.test new file mode 100644 index 00000000..f1a51117 --- /dev/null +++ b/mysql-test/suite/galera/t/GCF-360.test @@ -0,0 +1,65 @@ +# +# GCF-360 Inconsistency voting: node goes non-prim on DDL that fails everywhere +# +# We issue 400 DDLs in total to make this test more stressful# +# + +--source include/galera_cluster.inc + +--let $count = 100 + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 + +--disable_query_log +--disable_result_log +while ($count) +{ + --connection node_1 + --send DROP TABLE nonexisting_table; + + --connection node_2 + --send DROP TABLE nonexisting_table; + + --connection node_3 + --send DROP TABLE nonexisting_table; + + --connection node_4 + --send DROP TABLE nonexisting_table; + + --connection node_1 + --error ER_BAD_TABLE_ERROR + --reap + + --connection node_2 + --error ER_BAD_TABLE_ERROR + --reap + + --connection node_3 + --error ER_BAD_TABLE_ERROR + --reap + + --connection node_4 + --error ER_BAD_TABLE_ERROR + --reap + + --dec $count +} +--enable_result_log +--enable_query_log + +--connection node_1 +SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table"); + +--connection node_2 +SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table"); + +--connection node_3 +SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table"); + +--connection node_4 +SELECT VARIABLE_VALUE AS expect_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table"); diff --git a/mysql-test/suite/galera/t/GCF-939.test b/mysql-test/suite/galera/t/GCF-939.test new file mode 100644 index 00000000..637d6569 --- /dev/null +++ b/mysql-test/suite/galera/t/GCF-939.test @@ -0,0 +1,31 @@ +# +# GCF-939 Avoid creation of GRA log files when applier is successfull +# + +--source include/galera_cluster.inc + +--exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log + +--connection node_1 +--error ER_BAD_TABLE_ERROR +DROP TABLE t1; + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +# Expect only one GRA_*.log file +# TODO replace_regex is somehow broken, it will filter out +# result totally if replacement string is already in result +# fixed this temporarily by calling list_files twice +# to get GRA_.log two times, this works for some reason +# +--replace_regex /GRA_.+\.log/GRA_.log/ +--list_files $MYSQLTEST_VARDIR/mysqld.2/data GRA_*.log +--replace_regex /GRA_.+\.log/GRA_.log/ +--list_files $MYSQLTEST_VARDIR/mysqld.2/data GRA_*.log + +DROP TABLE t1; +CALL mtr.add_suppression("Ignoring error 'Unknown table 'test.t1'' on query"); +--connection node_2 +CALL mtr.add_suppression("Error 'Unknown table 'test.t1'' on query"); + diff --git a/mysql-test/suite/galera/t/MDEV-10715.cnf b/mysql-test/suite/galera/t/MDEV-10715.cnf new file mode 100644 index 00000000..58951446 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-10715.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW +[mysqld.1] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 +[mysqld.2] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 \ No newline at end of file diff --git a/mysql-test/suite/galera/t/MDEV-10715.test b/mysql-test/suite/galera/t/MDEV-10715.test new file mode 100644 index 00000000..18632058 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-10715.test @@ -0,0 +1,19 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +create table t1(a int); +set @@wsrep_gtid_seq_no=22; +insert into t1 values(1); +insert into t1 values(2); +select @@gtid_binlog_state; +select wsrep_last_seen_gtid(); +select wsrep_last_written_gtid(); + +--connection node_2 +select @@gtid_binlog_state; +select wsrep_last_seen_gtid(); +select wsrep_last_written_gtid(); + +--connection node_1 +drop table t1; diff --git a/mysql-test/suite/galera/t/MDEV-15443.cnf b/mysql-test/suite/galera/t/MDEV-15443.cnf new file mode 100644 index 00000000..88a08203 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-15443.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf +[mysqld.1] +wsrep_auto_increment_control=OFF +[mysqld.2] +wsrep_auto_increment_control=OFF diff --git a/mysql-test/suite/galera/t/MDEV-15443.test b/mysql-test/suite/galera/t/MDEV-15443.test new file mode 100644 index 00000000..06a00632 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-15443.test @@ -0,0 +1,53 @@ +# +# MDEV-15443 +# +# If transactions are executed into InnoDB without wsrep_on, +# rseg header trx_id gets incremented and the rseg header +# corresponding to maximum trx_id may store undefined wsrep XID. +# When the wsrep XID is read from the storage engine, +# undefined XID may returned instead the valid one. +# +# This test demonstrates the problem by taking a node_2 out +# of the cluster and writing and deleting a row with +# wsrep_on=0. When the bug is present, node_2 will fail to +# rejoin the cluster because an invalid XID is read from the +# storage engine after startup/recovery. +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +# Initialize table on node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +# Go to node_2, verify that the previous INSERT completed. +# Take node_2 out of the cluster, insert and delete a record +# on a table with wsrep_on. +--connection node_2 +SELECT * FROM t1; +SET GLOBAL wsrep_cluster_address=''; +SET SESSION wsrep_on=0; +INSERT INTO t1 VALUES (2); +DELETE FROM t1 WHERE f1 = 2; + +# Shutdown node_2 +--source include/shutdown_mysqld.inc + +# On node_1, verify that the node has left the cluster. +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Insert into t1 to enforce IST on node_2 when it is restarted. +INSERT INTO t1 VALUES (2); + +# Restart node_2 +--connection node_2 +--source include/start_mysqld.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_1 +--source include/wait_condition.inc +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-16509.test b/mysql-test/suite/galera/t/MDEV-16509.test new file mode 100644 index 00000000..078f1e95 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-16509.test @@ -0,0 +1,144 @@ +# +# Test various executions which go through binlog group commit +# + +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +--let $galera_connection_name = ctrl +--let $galera_server_number = 1 +--source include/galera_connect.inc + +# Scenario 1: Block INSERT after commit order release after queued for +# group commit. Verify that +# +# - wsrep_last_committed is not advanced before commit finishes +# - The INSERT does not become visible before commit finishes + +# Turn off sync wait to avoid blocking and use wsrep_last_committed +# to observe gtid position. +SET SESSION wsrep_sync_wait = 0; +--let $last_seen_gtid_prev = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +# Set up sync points +SET DEBUG_SYNC = "wsrep_before_commit_order_leave SIGNAL bcol_reached WAIT_FOR bcol_continue"; +SET DEBUG_SYNC = "wsrep_after_commit_order_leave SIGNAL acol_reached WAIT_FOR acol_continue"; +SET DEBUG_SYNC = "after_group_after_commit SIGNAL after_group_reached WAIT_FOR after_group_continue"; +# Send insert which will block in the sync points above +--send INSERT INTO t1 VALUES (1) + +--connection ctrl +# INSERT has gone through wsrep_ordered_commit() and the transaction is +# committed in memory. +SET DEBUG_SYNC = "now WAIT_FOR bcol_reached"; +--disable_query_log +--eval SELECT VARIABLE_VALUE = '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log +SELECT * FROM t1; +SET DEBUG_SYNC = "now SIGNAL bcol_continue"; + +# SE commit finished but wsrep_after_commit() has not called yet. +SET DEBUG_SYNC = "now WAIT_FOR acol_reached"; +--disable_query_log +--eval SELECT VARIABLE_VALUE = '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log +SELECT * FROM t1; +SET DEBUG_SYNC = "now SIGNAL acol_continue"; + +SET DEBUG_SYNC = "now WAIT_FOR after_group_reached"; +--disable_query_log +--eval SELECT VARIABLE_VALUE != '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_do_not_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log +SET DEBUG_SYNC = "now SIGNAL after_group_continue"; + +--connection node_1 +--reap + +# +# Scenario 2: Verify that two INSERTs from two different connections +# queue for commit. +# +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +SET SESSION wsrep_sync_wait = 0; + +--connection ctrl +--let $last_seen_gtid_prev = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_1 +SET DEBUG_SYNC = "wsrep_before_commit_order_leave SIGNAL bcol_reached_1 WAIT_FOR bcol_continue_1"; +SET DEBUG_SYNC = "wsrep_after_commit_order_leave SIGNAL acol_reached_1 WAIT_FOR acol_continue_1"; +SET DEBUG_SYNC = "after_group_after_commit SIGNAL agac_reached_1 WAIT_FOR agac_continue_1"; +--send INSERT INTO t1 VALUES (2); +--connection ctrl +SET DEBUG_SYNC = "now WAIT_FOR bcol_reached_1"; + +--disable_query_log +--eval SELECT VARIABLE_VALUE = '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log + +--connection node_1a +SET DEBUG_SYNC = "wsrep_before_commit_order_leave SIGNAL bcol_reached_2 WAIT_FOR bcol_continue_2"; +SET DEBUG_SYNC = "wsrep_after_commit_order_leave SIGNAL acol_reached_2 WAIT_FOR acol_continue_2"; +SET DEBUG_SYNC = "after_group_after_commit SIGNAL agac_reached_2 WAIT_FOR agac_continue_2"; +--send INSERT INTO t1 VALUES (3); + +# Now INSERTs are queued, node_1 waiting after releasing commit order, +# node_1a waiting before releasing commit order. +--connection ctrl +SET DEBUG_SYNC = "now SIGNAL bcol_continue_1"; +SET DEBUG_SYNC = "now WAIT_FOR acol_reached_1"; +SET DEBUG_SYNC = "now WAIT_FOR bcol_reached_2"; + +--disable_query_log +--eval SELECT VARIABLE_VALUE = '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log + +SET DEBUG_SYNC = "now SIGNAL bcol_continue_2"; +SET DEBUG_SYNC = "now WAIT_FOR acol_reached_2"; + +--disable_query_log +--eval SELECT VARIABLE_VALUE = '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log + +# Last seen GTIDs are incremented one by one once after_group_after_commit +# is reached. +SET DEBUG_SYNC = "now SIGNAL acol_continue_1"; +SET DEBUG_SYNC = "now WAIT_FOR agac_reached_1"; + +--disable_query_log +--eval SELECT VARIABLE_VALUE != '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_no_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log + +--let $last_seen_gtid_prev = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +SET DEBUG_SYNC = "now SIGNAL acol_continue_2"; +SET DEBUG_SYNC = "now WAIT_FOR agac_reached_2"; +--disable_query_log +--eval SELECT VARIABLE_VALUE != '$last_seen_gtid_prev' AS wsrep_last_seen_gtid_no_match FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--enable_query_log + +SET DEBUG_SYNC = "now SIGNAL agac_continue_1"; + +--connection node_1 +--reap + +--connection ctrl +SET DEBUG_SYNC = "now SIGNAL agac_continue_2"; + +--connection node_1a +--reap + +--connection ctrl +SET DEBUG_SYNC = "RESET"; + +DROP TABLE t1; + +--disconnect ctrl +--disconnect node_1a +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/MDEV-18832.cnf b/mysql-test/suite/galera/t/MDEV-18832.cnf new file mode 100644 index 00000000..4c62448f --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-18832.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin diff --git a/mysql-test/suite/galera/t/MDEV-18832.test b/mysql-test/suite/galera/t/MDEV-18832.test new file mode 100644 index 00000000..e2f1b2af --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-18832.test @@ -0,0 +1,15 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE TABLE t1 (Id int(11) NOT NULL, PRIMARY KEY (Id)); +INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); +INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); +INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); +INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); +DROP SEQUENCE Seq1_1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); +DROP SEQUENCE Seq1_1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-20225.test b/mysql-test/suite/galera/t/MDEV-20225.test new file mode 100644 index 00000000..2124e499 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-20225.test @@ -0,0 +1,49 @@ +# +# MDEV-20225 - Verify that DROP TRIGGER gets keys assigned corresponding +# to all affected tables. +# + +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INT NOT NULL PRIMARY KEY AUTO_INCREMENT, f2 INT) ENGINE=InnoDB; + +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, NEW.f1); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_slave_threads = 2; +SET GLOBAL debug_dbug = 'd,sync.mdev_20225'; + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +DROP TRIGGER tr1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: now' +--source include/wait_condition.inc + + +--connection node_1 +INSERT INTO t1 VALUES (NULL); +# We must rely on sleep here. If the bug is fixed, the second applier +# is not allowed to go past apply monitor which would trigger the bug, +# so there is no sync point or condition to wait. +--sleep 1 + +--connection node_2 +SET GLOBAL debug_dbug = 'RESET'; +SET DEBUG_SYNC = 'now SIGNAL signal.mdev_20225_continue'; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL wsrep_slave_threads = 1; + +# Trigger should now be dropped on node_2. +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME like '%tr1' +--source include/wait_condition.inc +SHOW TRIGGERS; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/MDEV-20616.test b/mysql-test/suite/galera/t/MDEV-20616.test new file mode 100644 index 00000000..1cbc4aad --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-20616.test @@ -0,0 +1,244 @@ +# +# Test different deadlock scenarios in innodb and make sure that +# wsrep patch does not handle them as BF aborts. +# + +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +############################################################################## +# test case to verify that natural deadlock of trigger SP execution is +# handled correctly +############################################################################## + +--echo +--echo Test phase 1 to make sure that natral deadlock in trigger SP execution is +--echo handled correctly +--echo +--let $aborts_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +CREATE TABLE t1(a INT); +CREATE TABLE t2(f1 INT, f2 INT, f3 INT); +--disable_query_log +let $run=1000; +while($run) +{ + INSERT INTO t2 VALUES (1, 2, 3); + dec $run; +} +--enable_query_log + +DELIMITER |; +CREATE PROCEDURE proc() +BEGIN + INSERT INTO t2 VALUES(100, 200, 300); + UPDATE t2 SET f3 = f3 + 100; +END| +DELIMITER ;| + +CREATE TRIGGER t1 BEFORE INSERT ON t1 FOR EACH ROW CALL proc(); + +--send INSERT INTO t1 VALUES(2); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--send INSERT INTO t1 VALUES(1); + +--connection node_1 +--error 0,ER_LOCK_DEADLOCK +--reap + +--connection node_1a +--error 0,ER_LOCK_DEADLOCK +--reap + +--connection node_1 +--let $aborts_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +--disable_query_log +--eval SELECT $aborts_new - $aborts_old AS wsrep__bf_aborts; +--enable_query_log +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE proc; + +############################################################################## +# +# test case to verify that BF abort for SP execution is handled correctly +# +############################################################################## + +--echo +--echo Test phase 2 to make sure that BF abort for SP execution is +--echo handled correctly +--echo +--connection node_1 +SET SESSION wsrep_retry_autocommit = 0; +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); + +# Control connection for Galera sync point management +--connection node_1a + +SET SESSION wsrep_retry_autocommit = 0; +SET SESSION wsrep_sync_wait = 0; +--let $aborts_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +DELIMITER |; +CREATE PROCEDURE proc_update() +BEGIN + UPDATE t1 SET f2 = 'b'; +END| +DELIMITER ;| + +INSERT INTO t1 VALUES(1, 'a'); + +--connection node_1 +SET debug_sync='wsrep_before_certification SIGNAL ready WAIT_FOR cont'; +--send CALL proc_update + +--connection node_1a +SET debug_sync='now WAIT_FOR ready'; + +--connection node_2 +UPDATE t1 SET f2='c'; + +--connection node_1a +# wait for BF to happen +--let $wait_condition = SELECT VARIABLE_VALUE = $aborts_old + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts' +--source include/wait_condition.inc + +SET debug_sync='now SIGNAL cont'; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_1a +SET debug_sync='RESET'; + +DROP PROCEDURE proc_update; + + +############################################################################## +# +# test case to verify that natural deadlock does not cause BF abort +# +############################################################################## + +--connection node_1 +--echo +--echo Test phase 3 to make sure natural deadlock is not treated as BF abort +--echo +TRUNCATE t1; +INSERT INTO t1 VALUES (1, 'a'), (2, 'a'); + +--connection node_1a +--let $aborts_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +START TRANSACTION; +UPDATE t1 SET f2 = 'b' WHERE f1 = 1; + +--connection node_1 +START TRANSACTION; +UPDATE t1 SET f2 = 'c' WHERE f1 = 2; + +--connection node_1a +# this hangs for lock wait +--send UPDATE t1 SET f2 = 'b' WHERE f1 = 2 + +# +# classic deadlock happens here +# +--connection node_1 +--error 0, ER_LOCK_DEADLOCK +UPDATE t1 SET f2 = 'c' WHERE f1 = 1; + +--connection node_1a +--error 0, ER_LOCK_DEADLOCK +--reap +COMMIT; + +# +# either one of SP executions was aborted because of natural deadlock, or in worst case +# they were ordered seqeuntailly, and both succeeded. +# anyways, we just check here that no BF aborts happened +# +--let $aborts_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +--disable_query_log +--eval SELECT $aborts_new - $aborts_old AS wsrep__bf_aborts; +--enable_query_log + +--connection node_1 +ROLLBACK; + +############################################################################## +# +# test case to verify that natural deadlock within SP exceution +# does not cause BF abort +# +############################################################################## + +--echo +--echo Test phase 4 to make sure natural deadlock inside SP execution +--echo is not treated as BF abort +--echo + +--connection node_1a +TRUNCATE t1; +INSERT INTO t1 VALUES (1, 'a'), (2, 'a'); + +--let $aborts_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +DELIMITER |; +CREATE PROCEDURE proc_update_1() +BEGIN + START TRANSACTION; + UPDATE t1 SET f2 = 'b' WHERE f1 = 1; + SELECT SLEEP(5); + UPDATE t1 SET f2 = 'b' WHERE f1 = 2; + COMMIT; +END| +DELIMITER ;| + +DELIMITER |; +CREATE PROCEDURE proc_update_2() +BEGIN + START TRANSACTION; + UPDATE t1 SET f2 = 'c' WHERE f1 = 2; + SELECT SLEEP(5); + UPDATE t1 SET f2 = 'c' WHERE f1 = 1; + COMMIT; +END| +DELIMITER ;| + +--connection node_1 +--send CALL proc_update_1 + +--connection node_1a +# +# calling proc_update_2 should cause a natural deadlock +# however, this test is not deterministic, and depends on the sleep() to +# cause expected ordering for update statement execution within SPs +# We therefore, allow both success and deadlock error for the result +# +--error 0, ER_LOCK_DEADLOCK +CALL proc_update_2; + +# +# either one of SP executions was aborted because of natural deadlock, or in worst case +# they were ordered seqeuntailly, and both succeeded. +# anyways, we just check here that no BF aborts happened +# +--let $aborts_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +--disable_query_log +--eval SELECT $aborts_new - $aborts_old AS wsrep__bf_aborts; +--enable_query_log + + +--connection node_1 +--error 0, ER_LOCK_DEADLOCK +--reap + +DROP PROCEDURE proc_update_1; +DROP PROCEDURE proc_update_2; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-20793.test b/mysql-test/suite/galera/t/MDEV-20793.test new file mode 100644 index 00000000..13ff3cbe --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-20793.test @@ -0,0 +1,78 @@ +# +# MDEV-20793 Assertion after certification failure during replay. +# +# The test outline: +# In order to produce certification failure three transactions +# are needed. One transaction is executing on node_1 and two others +# on node_2. The first transaction from node_2 BF aborts the transaction +# on node_1, but does not cause certification conflict. The second +# transaction from node_2 will cause conflict and the transaction on +# node_1 fails in certification during replay. +# + +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 INT); +INSERT INTO t1 VALUES (1, 0), (5, 0); + +--let galera_connection_name = node_1_ctrl +--let galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1_ctrl +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_slave_threads = 2; + +--connection node_1 +# Start transaction which takes gap lock 1 - 5 +SET SESSION wsrep_retry_autocommit = 0; +START TRANSACTION; +UPDATE t1 SET f2 = 1; +SET SESSION debug_sync = "wsrep_before_replay SIGNAL reached WAIT_FOR continue"; + +--connection node_1_ctrl +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +# Insert into gap from other node. This generates BF abort but does not +# conflict with update. +INSERT INTO t1 VALUES (2, 2); + +--connection node_1_ctrl +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = local_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# Make an update which will conflict with update on node_1 +--connection node_2 +UPDATE t1 SET f2 = 2 WHERE f1 = 5; + +--connection node_1_ctrl +--let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1_ctrl +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +SET SESSION debug_sync = "now WAIT_FOR reached"; + +--let $galera_sync_point = local_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc +SET SESSION debug_sync = "now SIGNAL continue"; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +SET debug_sync = "RESET"; + +DROP TABLE t1; +SET GLOBAL wsrep_slave_threads = 1; diff --git a/mysql-test/suite/galera/t/MDEV-22021.combinations b/mysql-test/suite/galera/t/MDEV-22021.combinations new file mode 100644 index 00000000..1eeb8fb4 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22021.combinations @@ -0,0 +1,4 @@ +[binlogoff] + +[binlogon] +log-bin diff --git a/mysql-test/suite/galera/t/MDEV-22021.test b/mysql-test/suite/galera/t/MDEV-22021.test new file mode 100644 index 00000000..5e189faf --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22021.test @@ -0,0 +1,60 @@ +# +# SAVEPOINT ROLLBACK can introduce inconsistency in cluster. +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp1; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +DELETE FROM t1; + +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +SELECT COUNT(*) = 0 FROM t1; +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +DELETE FROM t1; + +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (5); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO t1 VALUES (8); +COMMIT; + +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22051.test b/mysql-test/suite/galera/t/MDEV-22051.test new file mode 100644 index 00000000..b7332c47 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22051.test @@ -0,0 +1,33 @@ +# +# If FTWRL is issued on node, DDL statement should report error back to +# user. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +FLUSH TABLES WITH READ LOCK; + +--error ER_UNKNOWN_COM_ERROR +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +SET wsrep_OSU_method=RSU; +--error ER_UNKNOWN_COM_ERROR +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +SET wsrep_OSU_method=TOI; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--error ER_UNKNOWN_COM_ERROR +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +--connection node_1 +UNLOCK TABLES; + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +FLUSH TABLES WITH READ LOCK; +--error ER_CANT_UPDATE_WITH_READLOCK +INSERT INTO t1 VALUES (1); +UNLOCK TABLES; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22055.test b/mysql-test/suite/galera/t/MDEV-22055.test new file mode 100644 index 00000000..ae29c456 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22055.test @@ -0,0 +1,19 @@ +--source include/galera_cluster.inc + +ROLLBACK AND CHAIN; + +CREATE TABLE t1(a int not null primary key) engine=innodb; +INSERT INTO t1 values (1); + +BEGIN; +INSERT INTO t1 values (2); +ROLLBACK AND CHAIN; + +SELECT * FROM t1; + +--connection node_2 +SET SESSION wsrep_sync_wait=15; +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22227.test b/mysql-test/suite/galera/t/MDEV-22227.test new file mode 100644 index 00000000..0ee75b97 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22227.test @@ -0,0 +1,26 @@ +--source include/galera_cluster.inc +--source include/have_log_bin.inc + +CREATE TABLE t1 (a INT) ENGINE=MyISAM; +LOCK TABLE t1 WRITE CONCURRENT; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +# TOI operations will ignore lock_wait_timeout +SET lock_wait_timeout= 1; +--send CREATE VIEW v1 AS SELECT * FROM t1 + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Waiting for table level lock' +--source include/wait_condition.inc + +--connection node_1 +UNLOCK TABLES; + +--connection node_1a +--reap + +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22421.test b/mysql-test/suite/galera/t/MDEV-22421.test new file mode 100644 index 00000000..369e5638 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22421.test @@ -0,0 +1,12 @@ +# +# Tables with system versioning should not append keys to wsrep. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SET @@local.sql_mode='no_field_options'; +CREATE TABLE t1 (f1 INT, ROW_START BIGINT UNSIGNED AS ROW START INVISIBLE, ROW_END BIGINT UNSIGNED AS ROW END INVISIBLE, PERIOD FOR SYSTEM_TIME(ROW_START, ROW_END)) WITH SYSTEM VERSIONING ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +UPDATE t1 SET f1 = 1 WHERE f1 = 1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22458.test b/mysql-test/suite/galera/t/MDEV-22458.test new file mode 100644 index 00000000..8f9ba1bb --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22458.test @@ -0,0 +1,21 @@ +# MDEV-22458 +# +# When running SHOW command, thread lock `LOCK_thd_data` should not be taken. +# Lock will be taken only when we are killing thread +# + +--source include/galera_cluster.inc +CREATE TABLE t1 (a INT); + +--connect (con1,localhost,root,,test) +--let $con1 = `SELECT CONNECTION_ID()` + +INSERT INTO t1 VALUES (1),(2),(3),(4); + +--error ER_TARGET_NOT_EXPLAINABLE +EVALP SHOW EXPLAIN FOR $con1; + +--connection con1 +INSERT INTO t1 VALUES (5),(6),(7),(8); + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-24063.test b/mysql-test/suite/galera/t/MDEV-24063.test new file mode 100644 index 00000000..9646db5d --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-24063.test @@ -0,0 +1,26 @@ +# +# MDEV-24063 +# +# my_bool wsrep_thd_is_aborting(const THD*): +# Assertion `((&(&thd->LOCK_thd_data)->m_mutex)->count > 0 && +# pthread_equal(pthread_self(), (&(&thd->LOCK_thd_data)->m_mutex)->thread))' failed. +# + +--source include/galera_cluster.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); + +--connection node_2 +SET GLOBAL wsrep_on=OFF; +--source include/shutdown_mysqld.inc +--source include/start_mysqld.inc + +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/MDEV-24327.cnf b/mysql-test/suite/galera/t/MDEV-24327.cnf new file mode 100644 index 00000000..390a9aab --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-24327.cnf @@ -0,0 +1,6 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin=mariadb-bin +log-slave-updates=OFF + diff --git a/mysql-test/suite/galera/t/MDEV-24327.test b/mysql-test/suite/galera/t/MDEV-24327.test new file mode 100644 index 00000000..7aeffea1 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-24327.test @@ -0,0 +1,87 @@ +# +# MDEV-24327 wsrep XID checkpointing order violation with log_slave_updates=OFF +# +# Here we have configure two node cluster with --log-bin=ON and --log-slave_-updates=OFF +# +# a transaction in node executes so far that it has replicated and reached +# commit phase, We have sync point before entering commit order monitor and +# the transaction is parked there +# +# Then another transaction is executed in node 2, it replicates and commits in node 2 +# and is received and applied in node 1. After applying it will remain waiting for +# commit order monitor, as it has later seqno than the first transaction in node 1. +# +# control connection in node 1 waits to see the +# +# With the buggy version of MDEV-24327, the applier has however, already synced the +# wsrep XID checkpoint +# +# +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); +INSERT INTO t1 VALUES (1, 'f'); +INSERT INTO t1 VALUES (2, 'g'); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = '1' WHERE f1 = 1; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait=0; +--connection node_1a +--let $expected_wsrep_received = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_received'` +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Block the commit, send the COMMIT and wait until it gets blocked + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a + +# wait for the commit to block in sync point + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# +# replicate non conflicting transaction from node 2 +# it will get later seqno and should sync XID checkpoint after transaction in node 1 +# +--connection node_2 +UPDATE t1 SET f2 = '2' WHERE f1 = 2; + +# +# wait until update from node 2 has been committed +# if XID checkpointing order was violated, node 1 would crash for assert +# + +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_wsrep_received FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_received' +--source include/wait_condition.inc + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +--connection node_1 +--reap +SELECT * FROM t1; +--echo "node 1 is complete now" + + +--connection node_2 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-25562.test b/mysql-test/suite/galera/t/MDEV-25562.test new file mode 100644 index 00000000..b4552643 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-25562.test @@ -0,0 +1,11 @@ +# +# MDEV-25562 Assertion `pause_seqno_.is_undefined() == false' failed in void wsrep::server_state::resume() +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SET SESSION WSREP_ON=0; +FLUSH TABLES WITH READ LOCK AND DISABLE CHECKPOINT; +SET SESSION WSREP_ON=1; +UNLOCK TABLES; diff --git a/mysql-test/suite/galera/t/MDEV-25740.test b/mysql-test/suite/galera/t/MDEV-25740.test new file mode 100644 index 00000000..0ea8d5f5 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-25740.test @@ -0,0 +1,14 @@ +# +# When `completion_type = CHAIN` is used, transaction started should not have previous writeset. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SET AUTOCOMMIT = OFF; +SET completion_type = CHAIN; +CREATE TABLE t1(f1 INT) ENGINE=InnoDB; +BEGIN; +INSERT INTO t1 VALUES (1); +ROLLBACK; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-6860.cnf b/mysql-test/suite/galera/t/MDEV-6860.cnf new file mode 100644 index 00000000..d8defd34 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-6860.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld.2] +slave-parallel-threads=2 +slave-parallel-mode=optimistic +[mysqld.1] +wsrep-slave-threads=10 diff --git a/mysql-test/suite/galera/t/MDEV-6860.test b/mysql-test/suite/galera/t/MDEV-6860.test new file mode 100644 index 00000000..3a8c98f3 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-6860.test @@ -0,0 +1,42 @@ +--source include/have_innodb.inc + +--source include/galera_cluster.inc + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3, MASTER_USE_GTID=slave_pos; +--enable_query_log +START SLAVE; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +--let $inserts=1000 +CREATE TABLE t1 (f1 int, f2 int) ENGINE=InnoDB; + +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t1 values ($count,1) + --inc $count +} +--enable_query_log + +--connection node_2 + +--let $wait_condition = SELECT COUNT(*) = $inserts FROM t1 +--source include/wait_condition.inc + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = $inserts FROM t1 +--source include/wait_condition.inc + +--connection node_3 +DROP TABLE t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/t/MENT-1047.test b/mysql-test/suite/galera/t/MENT-1047.test new file mode 100644 index 00000000..1431818f --- /dev/null +++ b/mysql-test/suite/galera/t/MENT-1047.test @@ -0,0 +1,7 @@ +# +# MENT-1047 - Reject XA with Galera replication +# +--source include/galera_cluster.inc + +--error ER_NOT_SUPPORTED_YET +XA START 'trx'; diff --git a/mysql-test/suite/galera/t/MW-252.test b/mysql-test/suite/galera/t/MW-252.test new file mode 100644 index 00000000..dfb82e80 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-252.test @@ -0,0 +1,42 @@ +# +# MW-252 - Check that FTWRL causes the node to become desynced +# and not subject to flow control +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; + +FLUSH TABLES WITH READ LOCK; + +# Node #1 is now desynced +--let $wait_condition = SELECT VARIABLE_VALUE = 'Donor/Desynced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment' +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# Node #2 can issue updates without flow control kicking in +--connection node_2 + +--let $count = 100 +--disable_query_log +while ($count) +{ + INSERT INTO t1 VALUES (1); + --dec $count +} +--enable_query_log + +# Restore cluster +--connection node_1 +UNLOCK TABLES; + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment' +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 100 FROM t1 +--source include/wait_condition.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-258.test b/mysql-test/suite/galera/t/MW-258.test new file mode 100644 index 00000000..174dd2c0 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-258.test @@ -0,0 +1,42 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +LOCK TABLE t1 WRITE; +--echo value prior to RSU: +SHOW STATUS LIKE 'wsrep_desync_count'; +SHOW VARIABLES LIKE 'wsrep_desync'; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_osu_method = RSU; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_osu_method = RSU; +--send ALTER TABLE t1 ADD COLUMN f3 INTEGER; + +--sleep 5 +--connection node_1 +--echo value during RSU: +SHOW STATUS LIKE 'wsrep_desync_count'; +SHOW VARIABLES LIKE 'wsrep_desync'; +UNLOCK TABLES; + +--connection node_1a +--reap +--connection node_1b +--reap + +--connection node_1 +--echo value after RSU: +--sleep 3 +SHOW STATUS LIKE 'wsrep_desync_count'; +SHOW VARIABLES LIKE 'wsrep_desync'; +SET GLOBAL wsrep_desync=0; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-259.test b/mysql-test/suite/galera/t/MW-259.test new file mode 100644 index 00000000..7298285f --- /dev/null +++ b/mysql-test/suite/galera/t/MW-259.test @@ -0,0 +1,42 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +SET GLOBAL wsrep_desync=0; +SET wsrep_OSU_method=RSU; + +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1a + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +# wsrep_desync=1 will block +--send SET GLOBAL wsrep_desync=1; + +--connection node_1b +--sleep 2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'SET GLOBAL wsrep_desync=1' +--source include/wait_condition.inc + +SET DEBUG_SYNC= 'now SIGNAL continue'; +DROP TABLE t1; +SET GLOBAL wsrep_desync=0; + +--connection node_1 +--reap + +--connection node_1a +--reap + +# Cleanup +SET DEBUG_SYNC= 'RESET'; + diff --git a/mysql-test/suite/galera/t/MW-284.cnf b/mysql-test/suite/galera/t/MW-284.cnf new file mode 100644 index 00000000..52fd3093 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-284.cnf @@ -0,0 +1 @@ +!include ../galera_2nodes_as_master.cnf diff --git a/mysql-test/suite/galera/t/MW-284.test b/mysql-test/suite/galera/t/MW-284.test new file mode 100644 index 00000000..99fe305d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-284.test @@ -0,0 +1,68 @@ +# +# MW-284 Slave I/O retry on ER_COM_UNKNOWN_ERROR +# + +--source include/have_log_bin.inc +--source include/galera_cluster.inc + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +call mtr.add_suppression("\\[ERROR\\] Error reading packet from server: WSREP has not yet prepared node for application use .*"); +call mtr.add_suppression("WSREP has not yet prepared node for application use"); + +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_1, MASTER_USER='root', MASTER_CONNECT_RETRY=1; +--enable_query_log + +--connection node_1 +--let $wsrep_sync_wait_state= `SELECT @@global.wsrep_sync_wait;` +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +SET GLOBAL wsrep_provider_options='gmcast.isolate=1'; +SET SESSION wsrep_on = OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status' +--source include/wait_condition.inc +SET SESSION wsrep_on = ON; + +#wsrep_sync_wait is set to zero because when slave tries to connect it it ask for queries like SELECT UNIX_TIMESTAMP() on node 1 which will fail, causing +#a warning in slave error log. +SET global wsrep_sync_wait=0; + +--connection node_3 +SELECT @@wsrep_on; +--sleep 1 +START SLAVE; +--let $slave_param= Slave_IO_Running +--let $slave_param_value= Connecting +--source include/wait_for_slave_param.inc + +--connection node_1 +SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; + +# We expect the slave to reconnect and resume replication + +--connection node_3 +--source include/wait_for_slave_to_start.inc + +--connection node_1 +--source include/galera_wait_ready.inc +INSERT INTO t1 VALUES (1); + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) > 0 FROM t1 +--source include/wait_condition.inc + +# Cleanup + +--connection node_1 +DROP TABLE t1; +--eval SET global wsrep_sync_wait=$wsrep_sync_wait_state + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +CALL mtr.add_suppression('failed registering on master'); diff --git a/mysql-test/suite/galera/t/MW-285.test b/mysql-test/suite/galera/t/MW-285.test new file mode 100644 index 00000000..1c567f7b --- /dev/null +++ b/mysql-test/suite/galera/t/MW-285.test @@ -0,0 +1,31 @@ +# +# Broken FK constraints cause assertions +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE parent1 ( id INT PRIMARY KEY, KEY (id) ) ENGINE=InnoDB; +CREATE TABLE parent2 ( id INT PRIMARY KEY, KEY (id) ) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT PRIMARY KEY, + parent1_id INT, + parent2_id INT, + FOREIGN KEY (parent1_id) REFERENCES parent1(id), + FOREIGN KEY (parent1_id) REFERENCES parent2(id) +) ENGINE=InnoDB; + +INSERT INTO parent1 VALUES (1); +INSERT INTO parent2 VALUES (1); +INSERT INTO child VALUES (1,1,1); +INSERT INTO child VALUES (2,1,1); + +SET foreign_key_checks=OFF; +DROP TABLE parent1; + +UPDATE child SET parent1_id=2 WHERE id=1; + +DROP TABLE child; +DROP TABLE parent2; +SET foreign_key_checks=ON; diff --git a/mysql-test/suite/galera/t/MW-286.test b/mysql-test/suite/galera/t/MW-286.test new file mode 100644 index 00000000..9c849861 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-286.test @@ -0,0 +1,58 @@ +# +# MW-286 Spurious deadlock error after error with wsrep_desync and wsrep_on +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +# Insert some values before the ALTER +INSERT INTO t1 (f1) VALUES (1), (2), (3); + +# +# run ALTER with no wsrep replication +# +--connection node_2 +SET GLOBAL wsrep_desync = TRUE; +SET wsrep_on = FALSE; + +# +# stop ALTER processing after it has acquired exclusive MDL lock +# +SET SESSION debug_sync = "alter_table_inplace_after_lock_upgrade SIGNAL mdl_locked WAIT_FOR mdl_continue"; + +--send ALTER TABLE t1 ADD PRIMARY KEY (f1); + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +SET SESSION debug_sync = "now WAIT_FOR mdl_locked"; + +# +# replicate conflicting insert from node_1 +# +--connection node_1 +INSERT INTO t1(f1) VALUES (11); + +# +# let parked ALTER processing to continue after the conflict +# +--connection node_2a +SET debug_sync = "now SIGNAL mdl_continue"; +SET debug_sync='RESET'; + +# +# ALTER should have been aborted with query interupted error code +# +--connection node_2 +--error ER_QUERY_INTERRUPTED +--reap + +SET wsrep_on = TRUE; +SET GLOBAL wsrep_desync = FALSE; + +--connection node_1 + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-292.test b/mysql-test/suite/galera/t/MW-292.test new file mode 100644 index 00000000..9580d53d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-292.test @@ -0,0 +1,93 @@ +# +# MW-292 Reset timestamp after transaction replay +# +# We force transaction replay to happen and then we check that NOW() is not stuck in time. +# As a bonus we also check that RAND() continues to return random values after replay +# +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE rand_table (f1 FLOAT); +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (2, 'a'); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +SELECT * FROM t1 WHERE f1 = 2 FOR UPDATE; + +# Block the applier on node #1 and issue a conflicting update on node #2 +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait=0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +UPDATE t1 SET f2 = 'c' WHERE f1 = 2; + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Block the commit, send the COMMIT and wait until it gets blocked + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a + +--let $galera_sync_point = apply_monitor_slave_enter_sync commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Let the conflicting UPDATE proceed and wait until it hits abort_trx_end. +# The victim transaction still sits in commit_monitor_master_sync_point. + +--let $galera_sync_point = abort_trx_end +--source include/galera_set_sync_point.inc +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = abort_trx_end commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc + +# Let the transactions proceed +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = abort_trx_end +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc + +# Commit succeeds +--connection node_1 +--reap + +# Confirm that NOW() is not stuck in time relative to SYSDATE(); +--sleep 3 +SELECT TIMEDIFF(SYSDATE(), NOW()) < 2; + +INSERT INTO rand_table VALUES (RAND()),(RAND()),(RAND()),(RAND()),(RAND()); +INSERT INTO rand_table VALUES (RAND()),(RAND()),(RAND()),(RAND()),(RAND()); + +SELECT COUNT(DISTINCT f1) = 10 FROM rand_table; + +# wsrep_local_replays has increased by 1 +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; +--enable_query_log + +--connection node_2 +DROP TABLE t1; +DROP TABLE rand_table; diff --git a/mysql-test/suite/galera/t/MW-309.test b/mysql-test/suite/galera/t/MW-309.test new file mode 100644 index 00000000..351a508e --- /dev/null +++ b/mysql-test/suite/galera/t/MW-309.test @@ -0,0 +1,32 @@ +# +# MW-309 Regression: wsrep_max_ws_rows limit also applies to certain SELECT queries +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; + +SET GLOBAL wsrep_max_ws_rows = 2; + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +SELECT * FROM t1 GROUP BY f1; +SELECT * FROM t1 GROUP BY f1; + +--error 0 +SELECT * FROM t1 GROUP BY f1; + +--disable_result_log +--error 0 +SHOW STATUS LIKE '%wsrep%'; +--enable_result_log + +SET GLOBAL wsrep_max_ws_rows = 0; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-313.cnf b/mysql-test/suite/galera/t/MW-313.cnf new file mode 100644 index 00000000..184900c5 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-313.cnf @@ -0,0 +1,12 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin +log-slave-updates + +[mysqld.2] +log-bin +log-slave-updates + + + diff --git a/mysql-test/suite/galera/t/MW-313.test b/mysql-test/suite/galera/t/MW-313.test new file mode 100644 index 00000000..92fd835c --- /dev/null +++ b/mysql-test/suite/galera/t/MW-313.test @@ -0,0 +1,51 @@ +# +# MW-313 Enforce wsrep_max_ws_rows also when binlog is enabled +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_binlog_format_row.inc + +# No error expected for SELECT and SHOW + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; + +SET GLOBAL wsrep_max_ws_rows = 2; + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +SELECT * FROM t1 GROUP BY f1; +SELECT * FROM t1 GROUP BY f1; + +--error 0 +SELECT * FROM t1 GROUP BY f1; + +--disable_result_log +--error 0 +SHOW STATUS LIKE '%wsrep%'; +--enable_result_log + +# Error expected for DML + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 SELECT * FROM t1; + +START TRANSACTION; +INSERT INTO t1 (f1) VALUES (1); + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f1) VALUES (2),(3),(4); + +ROLLBACK; +START TRANSACTION; +--error ER_ERROR_DURING_COMMIT +DELETE FROM t1; + +DROP TABLE t1; +SET GLOBAL wsrep_max_ws_rows = 0; diff --git a/mysql-test/suite/galera/t/MW-328-footer.inc b/mysql-test/suite/galera/t/MW-328-footer.inc new file mode 100644 index 00000000..12a4bf12 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328-footer.inc @@ -0,0 +1,18 @@ +# +# Cleanup for MW-328 tests +# + +--connection node_1 +--disable_query_log +--eval KILL CONNECTION $sp_connection_id +--enable_query_log + +--connection node_1X +--error 2013,1317 +--reap + +--connection node_1 +DROP PROCEDURE proc_update; +DROP TABLE t1, t2; + +CALL mtr.add_suppression("conflict state ABORTED after post commit"); diff --git a/mysql-test/suite/galera/t/MW-328-header.inc b/mysql-test/suite/galera/t/MW-328-header.inc new file mode 100644 index 00000000..f0a6ccac --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328-header.inc @@ -0,0 +1,29 @@ +# +# Initialization for MW-328 tests +# + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB; +INSERT INTO t1 (f1) VALUES (1); + +CREATE TABLE t2 (f1 CHAR(20)) ENGINE=InnoDB; + +# +# Have some random updates going on against t1 +# + +DELIMITER |; +CREATE PROCEDURE proc_update () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + UPDATE t1 SET f2 = LEFT(MD5(RAND()), 4); + END WHILE; +END| + +DELIMITER ;| + +--connect node_1X, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1X +--let $sp_connection_id = `SELECT CONNECTION_ID()` +--send CALL proc_update(); diff --git a/mysql-test/suite/galera/t/MW-328A.cnf b/mysql-test/suite/galera/t/MW-328A.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328A.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/MW-328A.test b/mysql-test/suite/galera/t/MW-328A.test new file mode 100644 index 00000000..2435a9e2 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328A.test @@ -0,0 +1,82 @@ +# +# MW-328 Fix unnecessary/silent BF aborts +# + +# +# test phase 1 is not deterministic +# +# Here we attempt to insert into t2 and check if insert actually +# inserted rows if a success was reported. +# +# However, deadlocks may or may not happen in this test execution +# it all depends on timing. +# + +--source include/galera_cluster.inc +--source include/force_restart.inc +--source suite/galera/t/MW-328-header.inc + +--connection node_1 +call mtr.add_suppression("WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position"); + +--connection node_2 +call mtr.add_suppression("WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position"); +--let $count = 100 +--let $successes = 0 +--let $deadlocks = 0 + +SET SESSION wsrep_retry_autocommit = 0; + +--disable_query_log + +while ($count) +{ + TRUNCATE TABLE t2; + + --error 0,ER_LOCK_DEADLOCK + INSERT IGNORE INTO t2 SELECT f2 FROM t1; + if ($mysql_errno != 1213) { + --inc $successes + if (`SELECT COUNT(*) = 0 FROM t2`) { + --die No rows arrived in table t2 + } + } + + if ($mysql_errno == 1213) { + --inc $deadlocks + + } + + --dec $count +} + +--enable_query_log + + +--source suite/galera/t/MW-328-footer.inc + +# +# Test phase 2 is deterministic +# Here we generate a sure conflict in node 1 and verify that +# insert failed in both nodes +# +--connection node_1 +CREATE TABLE t1 (i int primary key, j int) engine=innodb; +INSERT INTO t1 values (1,0); + +BEGIN; +UPDATE t1 SET j=1 WHERE i=1; + +--connection node_2 +UPDATE t1 SET j=2 WHERE i=1; + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +SELECT * FROM t1; +--connection node_2 +SELECT * FROM t1; +--connection node_1 + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-328B.cnf b/mysql-test/suite/galera/t/MW-328B.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328B.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/MW-328B.test b/mysql-test/suite/galera/t/MW-328B.test new file mode 100644 index 00000000..41581d9c --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328B.test @@ -0,0 +1,36 @@ +# +# MW-328 Fix unnecessary/silent BF aborts +# + +# +# Make sure an unrelated SELECT following a BF-aborted query never +# gets the deadlock error +# + +--source include/galera_cluster.inc +--source include/force_restart.inc +--source suite/galera/t/MW-328-header.inc + +--connection node_2 +--let $count = 100 + +SET SESSION wsrep_retry_autocommit = 0; + +--disable_query_log + +while ($count) +{ + --error 0,1213 + INSERT IGNORE INTO t2 SELECT f2 FROM t1; + + --disable_result_log + --error 0 + SELECT 1 FROM DUAL; + --enable_result_log + + --dec $count +} + +--enable_query_log + +--source suite/galera/t/MW-328-footer.inc diff --git a/mysql-test/suite/galera/t/MW-328C.cnf b/mysql-test/suite/galera/t/MW-328C.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328C.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/MW-328C.test b/mysql-test/suite/galera/t/MW-328C.test new file mode 100644 index 00000000..7241dfbd --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328C.test @@ -0,0 +1,35 @@ +# +# MW-328 Fix unnecessary/silent BF aborts +# + +# +# Make sure that a high value of wsrep_retry_autocommit +# masks all deadlock errors +# + +--source include/galera_cluster.inc +--source suite/galera/t/MW-328-header.inc + +--connection node_2 +--let $count = 100 + +SET SESSION wsrep_retry_autocommit = 10000; + +--disable_query_log + +while ($count) +{ + --error 0 + INSERT IGNORE INTO t2 SELECT f2 FROM t1; + + --disable_result_log + --error 0 + SELECT 1 FROM DUAL; + --enable_result_log + + --dec $count +} + +--enable_query_log + +--source suite/galera/t/MW-328-footer.inc diff --git a/mysql-test/suite/galera/t/MW-328D.cnf b/mysql-test/suite/galera/t/MW-328D.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328D.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/MW-328D.test b/mysql-test/suite/galera/t/MW-328D.test new file mode 100644 index 00000000..e8a22f22 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328D.test @@ -0,0 +1,39 @@ +# +# MW-328 Fix unnecessary/silent BF aborts +# + +# +# Test that non-Galera deadlock error still behaves as expected +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (i INT) ENGINE = InnoDB; +INSERT INTO t1 (i) VALUES(1); + +CREATE TABLE t2 (i INT) ENGINE = InnoDB; + +# Create a deadlock situation + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +SELECT * FROM t1 WHERE i = 1 LOCK IN SHARE MODE; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET AUTOCOMMIT=OFF; +START TRANSACTION; +--send INSERT IGNORE INTO t2 SELECT * FROM t1 WHERE i = 1 FOR UPDATE; + +--connection node_1 +--sleep 2 +DELETE FROM t1 WHERE i = 1; +COMMIT; + +# We expect that ER_LOCK_DEADLOCK will be delivered even though it was a INSERT INGORE statement +--connection node_1a +--error ER_LOCK_DEADLOCK +--reap + +DROP TABLE t1, t2; diff --git a/mysql-test/suite/galera/t/MW-328E.cnf b/mysql-test/suite/galera/t/MW-328E.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328E.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/MW-328E.test b/mysql-test/suite/galera/t/MW-328E.test new file mode 100644 index 00000000..34b17be7 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-328E.test @@ -0,0 +1,40 @@ +# +# MW-328 Fix unnecessary/silent BF aborts +# + +# +# Test that non-Galera deadlock error still behaves as expected (case #2) +# + +--source include/galera_cluster.inc + +create table t1 (i int primary key, j int) engine=innodb; +create table t2 (i int primary key, j int) engine=innodb; + +insert into t1 values (1,0); +insert into t2 values (2,0); + +set autocommit=off; +start transaction; +update t1 set j=1 where i=1; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +set autocommit=off; +start transaction; +begin; +update t2 set j=1 where i=2; + +--connection node_1 +# Hang expected here +--send insert into t1 select * from t2; + +--sleep 2 +--connection node_1a +--error ER_LOCK_DEADLOCK +insert into t2 select * from t1; + +--connection node_1 +--reap + +DROP TABLE t1, t2; diff --git a/mysql-test/suite/galera/t/MW-329.cnf b/mysql-test/suite/galera/t/MW-329.cnf new file mode 100644 index 00000000..10870a81 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-329.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-retry-autocommit=0 + +[mysqld.2] + + + diff --git a/mysql-test/suite/galera/t/MW-329.test b/mysql-test/suite/galera/t/MW-329.test new file mode 100644 index 00000000..904fc2f9 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-329.test @@ -0,0 +1,104 @@ +# +# #MW-329 Fix incorrect affected rows count after replay +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CALL mtr.add_suppression("WSREP: .*conflict state . after post commit .*"); +CREATE TABLE t1 (f1 INTEGER, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB; + +# We start with a populated table +INSERT INTO t1 (f1) VALUES (1),(65535); + +# +# Run concurrent INSERTs +# + +DELIMITER |; +CREATE PROCEDURE proc_insert () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + INSERT INTO t1 (f1) VALUES (FLOOR( 1 + RAND( ) * 65535 )); + SELECT SLEEP(0.1); + END WHILE; +END| +DELIMITER ;| + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +--let $connection_id = `SELECT CONNECTION_ID()` +--disable_query_log +--disable_result_log +--send CALL proc_insert(); + +# +# Run concurrent UPDATEs. We expect that each UPDATE will report that +# some rows were matched and updated +# + +--connection node_2 +--let $count = 10 +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +while ($count) +{ + --let $signature = `SELECT LEFT(MD5(RAND()), 10)` + --disable_query_log + --error 0,ER_LOCK_DEADLOCK + --eval UPDATE t1 SET f2 = '$signature' + --enable_query_log + --let $row_count = `SELECT ROW_COUNT()` + if (`SELECT @@error_count = 0`) { + if (`SELECT $row_count = 0`) { + --die ROW_COUNT() = 0 + } + } + + # + # Ensure at least one replay happens + # + + --let $wsrep_replays = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + --disable_query_log + if (`SELECT $wsrep_replays - $wsrep_local_replays_old > 0`) { + --dec $count + } + --enable_query_log +} + +# +# Confirm that some transaction replays occurred +# + +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old > 0 AS wsrep_local_replays; +--enable_query_log + + +# +# Terminate the stored procedure +# + +--connection node_1 +--disable_query_log +--eval KILL CONNECTION $connection_id +--enable_query_log + +--connection node_1b +--error 0,2013,1317 +--reap +--enable_query_log +--enable_result_log + +--connection node_1 +DROP PROCEDURE proc_insert; +DROP TABLE t1; + +# Due to MW-330, Multiple "conflict state 3 after post commit" warnings if table is dropped while SP is running +CALL mtr.add_suppression("conflict state 3 after post commit"); + +set global innodb_status_output=Default; \ No newline at end of file diff --git a/mysql-test/suite/galera/t/MW-336.cnf b/mysql-test/suite/galera/t/MW-336.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-336.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/MW-336.test b/mysql-test/suite/galera/t/MW-336.test new file mode 100644 index 00000000..83943c7d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-336.test @@ -0,0 +1,120 @@ +# +# MW-336 Slave threads may leak if variable wsrep_slave_threads is set repeatedly +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/force_restart.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +SET GLOBAL wsrep_slave_threads = 10; + +# ensure that the threads have actually started running +--echo # Set slave threads to 10 step 1 +--let $wait_condition = SELECT VARIABLE_VALUE = 10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 10 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +INSERT INTO t1 VALUES (1); + +--connection node_1 +--echo # Wait until one of the appliers has exited +--let $wait_condition = SELECT VARIABLE_VALUE = 9 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 9 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_9 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +SET GLOBAL wsrep_slave_threads = 10; + +# Note that above insert could be handled by one of the slave threads +--echo # Set slave threads to 10 step 2 +--let $wait_condition = SELECT VARIABLE_VALUE = 10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 10 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +SET GLOBAL wsrep_slave_threads = 20; + +--echo # Set slave threads to 20 +--let $wait_condition = SELECT VARIABLE_VALUE = 20 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 20 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_20 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); +INSERT INTO t1 VALUES (11); +INSERT INTO t1 VALUES (12); +INSERT INTO t1 VALUES (13); +INSERT INTO t1 VALUES (14); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (17); +INSERT INTO t1 VALUES (18); +INSERT INTO t1 VALUES (19); +INSERT INTO t1 VALUES (20); + +--connection node_1 +--echo # Wait until 19 of the appliers has exited +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 1 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +SELECT COUNT(*) FROM t1; + +SET GLOBAL wsrep_slave_threads = 10; +--echo # Set slave threads to 10 step 3 +--let $wait_condition = SELECT VARIABLE_VALUE = 10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 10 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +--connection node_1 +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_2 +INSERT INTO t1 VALUES (21); +INSERT INTO t1 VALUES (22); +INSERT INTO t1 VALUES (23); +INSERT INTO t1 VALUES (24); +INSERT INTO t1 VALUES (25); +INSERT INTO t1 VALUES (26); +INSERT INTO t1 VALUES (27); +INSERT INTO t1 VALUES (28); +INSERT INTO t1 VALUES (29); +INSERT INTO t1 VALUES (30); + +--connection node_1 +--echo # Wait until slave threads back to 1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 1 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; + +SELECT COUNT(*) FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-357.test b/mysql-test/suite/galera/t/MW-357.test new file mode 100644 index 00000000..d13cf058 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-357.test @@ -0,0 +1,13 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_2 +SET GLOBAL wsrep_slave_threads = 0; + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-360-master.opt b/mysql-test/suite/galera/t/MW-360-master.opt new file mode 100644 index 00000000..e51c49c3 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-360-master.opt @@ -0,0 +1,2 @@ +--gtid-domain-id=1 --log-bin --log-slave-updates + diff --git a/mysql-test/suite/galera/t/MW-369.inc b/mysql-test/suite/galera/t/MW-369.inc new file mode 100644 index 00000000..71df979d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369.inc @@ -0,0 +1,74 @@ +# +# This file should be included from tests for MW-369 to run concurrent +# transaction from node_1 with autocommit query from node_2. +# +# The parameters: +# * $mw_369_parent_query - the parent query to be run inside transaction +# * $mw_369_child_query - the child query +# +# The operations are the following: +# +# node_1: +# START TRANSACTION; +# $mw_369_parent_query +# node_2 +# $mw_369_child_query - will be blocked on node_1 in apply monitor +# node_1: +# COMMIT; - will be blocked on node_1 in local monitor +# +# The $mw_369_child_query is always expected to succeed. The caller is +# responsible for checking if the final COMMIT on connection node_1 +# succeeds. +# + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--let $galera_sync_point = local_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +# +# Wait until both sync points have been reached +# +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc + +# +# both threads are now parked in sync points, signal them to continue +# +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +--let $galera_sync_point = local_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc diff --git a/mysql-test/suite/galera/t/MW-369.test b/mysql-test/suite/galera/t/MW-369.test new file mode 100644 index 00000000..c8f8c974 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-369.test @@ -0,0 +1,344 @@ +# +# Test A Outline: +# =============== +# +# This test tests the scenario for MW-369 where a new child table +# row referring to parent table row is inserted concurrently from +# another node while the transaction which tries to delete a +# referred row from the parent table is committing. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will be empty. +# +# A new row (1, 1) pointing to parent row (1, 0) is inserted from +# connection node_2, the transaction which tries to remove the +# parent row (1, 0) is run from connection node_1. +# +# Expected outcome: +# ================ +# +# The transaction on node_1 will fail. The parent table will contain +# rows (1, 0), (2, 0) and the child table will contain row (1, 1). +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 1) + +# +# we must open connection node_1a here, MW-369.inc will use it later +# +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test B Outline: +# =============== +# +# This test tests the scenario for MW-369 where a existing +# child table row is updated concurrently from another node +# with a transaction which updates the parent table. +# +# The p table will originally have rows (1, 0), (2, 0). +# The c table will originally have rows (1, 1, 0) which points +# to parent table row (1, 0). +# +# Expected outcome: +# ================ +# +# Both updates should succeed since they are done to separate tables and +# rows. The parent table will contain rows (1, 1), (2, 0). The child +# table will contain row (1, 1, 1). +# + +--connection node_1 +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); + +--let mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test C Outline: +# =============== +# +# This test tests the scenario for MW-369 where a child table row is +# deleted concurrently from the other node while a transaction updates +# the parent table referred by the child table row. +# +# The p table will originally have rows (1, 0), (2, 0) +# The c table will originally have row (1, 1) which points to parent +# table row (1, 0). +# +# A row (1, 1) pointing to parent row (1, 0) is deleted from +# connection node_2, the transaction which tries to update the +# parent row (1, 0) is run from connection node_1. +# +# Expected Outcome: +# ================ +# Both operations on node_1 and node_2 should succeed without conflicts. +# The parent table should contain values (1, 1), (2, 0) and the child +# table should be empty. + +--connection node_1 +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1)) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = DELETE FROM c WHERE f1 = 1 +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + + +# +# Test D Outline: +# =============== +# +# This test is similar to test A, where parent row is deleted while a child row +# is inserted simultaneously on node 2. However, in this test case the FK +# constraint's target column is a unique key, and parent row is not delete, +# but this key value is changed so that insert on node 2 will cause FK +# violation +# +# The p table will originally have rows (1, 0) +# The c table will originally be empty +# +# in node_1, parent row is updated to value (1,1) +# A row (1, 0) pointing to the old version of parent row (1, 0) is inserted +# in connection node_2 +# +# Expected Outcome: +# ================ +# This is a true conflict and one transaciton must abort. In this case it is node_1 +# transaction, which was scheduled later. +# Parent table should have row (1,0) +# child table should have row (1,0) +# + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER UNIQUE KEY) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f2)) ; + +INSERT INTO p VALUES (1, 0); + +--let $mw_369_parent_query = UPDATE p SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO c VALUES (1, 0); +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# Test E Outline: +# =============== +# +# This test is similar to test B, where parent row is deleted while a child row +# is updated simultaneously on node 2. However, in this test case the FK +# constraint has ON DELETE CASCADE option, and the delete on parent row will +# cascade a delete on child row as well. This will cause true conflict with +# connection node_2, which tries to update unrelated column on child table. +# +# The p table will originally have rows (1, 0), (2,0) +# The c table will originally have row (1,1,0) +# +# in node_1, parent row (1,0) is deleted and cascaded delete will happen on +# child table row (1,1,0). +# in connection node_2 child table row is update to value (1,1,1) +# +# Expected Outcome: +# ================ +# This is a true conflict and one transaciton must abort. In this case it is node_1 +# transaction, which was scheduled later. +# Parent table should have rows (1,0), (2,0) +# child table should have row (1,1,1) +# + + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) + ON DELETE CASCADE) ; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = DELETE FROM p WHERE f1 = 1 +--let $mw_369_child_query = UPDATE c SET f2 = 1 WHERE f1 = 1 +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +--echo # +--echo # Start of 10.4 tests +--echo # +# +# Test F Outline: +# =============== +# +# Test two concurrent INSERTs on the child table. +# +# The pf table will originally have row (1) +# The cf table will originally be empty +# +# A new row (10, 1) pointing to parent row (1) is inserted from +# connection node_2. A transaction which tries to INSERT another child +# row (20, 1), pointing to the same parent, is run from connection node_1. +# +# Expected Outcome: +# ================= +# Both INSERTs should succeed since they don't modify the common parent +# key. +# +# At the end of the test: +# parent table should have row (1) +# child table should have rows (10, 1), (20, 1) + +--connection node_1 + +CREATE TABLE pf (f1 INTEGER PRIMARY KEY) ENGINE=INNODB; +CREATE TABLE cf ( + f1 INTEGER PRIMARY KEY, + p_id INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES pf (f1) +); + +INSERT INTO pf VALUES (1); + +# This is run on node1: +--let $mw_369_parent_query = INSERT INTO cf (f1, p_id) VALUES (10, 1) +# This is run on node2: +--let $mw_369_child_query = INSERT INTO cf (f1, p_id) VALUES (20, 1) +--source MW-369.inc + +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM pf; +SELECT * FROM cf; + +DROP TABLE cf; +DROP TABLE pf; + +# +# Test G Outline: +# =============== +# +# This test is similar to test B where a existing +# child table row is updated concurrently from another node +# with a transaction which updates the parent table, except +# that here the child table row is inserted, not updated. +# +# The pg table will originally have rows (1, 0), (2, 0). +# The cg table will originally be empty +# +# Expected outcome: +# ================ +# +# Both UPDATE and INSERT should succeed since they are done to separate tables +# and UPDATE to parent row does not touch the foreign key referenced by the +# child row INSERT. The parent table shall contain rows (1, 1), (2, 0). +# The child table shall contain row (1, 1, 0) which points to parent table +# row (1, 0). +# + +--connection node_1 +CREATE TABLE pg (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE cg (f1 INTEGER PRIMARY KEY, p_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES pg (f1)) ; + +INSERT INTO pg VALUES (1, 0); +INSERT INTO pg VALUES (2, 0); + +--let mw_369_parent_query = UPDATE pg SET f2 = 1 WHERE f1 = 1 +--let $mw_369_child_query = INSERT INTO cg VALUES (1, 1, 0) +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM pg; +SELECT * FROM cg; + +DROP TABLE cg; +DROP TABLE pg; + diff --git a/mysql-test/suite/galera/t/MW-388.test b/mysql-test/suite/galera/t/MW-388.test new file mode 100644 index 00000000..b88f53ca --- /dev/null +++ b/mysql-test/suite/galera/t/MW-388.test @@ -0,0 +1,79 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(255)) Engine=InnoDB; + +DELIMITER |; +CREATE PROCEDURE insert_proc () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 @errno = MYSQL_ERRNO; + END; + INSERT INTO t1 VALUES (1, 'node 1'),(2, 'node 1'); + INSERT INTO t1 VALUES (3, 'node 1'); +END| +DELIMITER ;| + +# We need two slave threads here to guarantee progress. +# If we use only one thread the following could happen +# in node_1: +# We block the only slave thread in wsrep_apply_cb and we +# issue an INSERT (by calling the stored procedure) that will +# try to acquire galera's local monitor in pre_commit(). +# This usually works fine, except for when a commit cut event +# sneaks in the slave queue and gets a local seqno smaller than +# that of the INSERT. Because there is only one slave thread, +# commit cut is not processed and therefore does not advance +# local monitor, and our INSERT remains stuck there. + +SET GLOBAL wsrep_slave_threads = 2; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; + +--let $expected_cert_failures = `SELECT VARIABLE_VALUE + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +--connection node_2 +--send INSERT INTO t1 VALUES (1, 'node 2'); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--send CALL insert_proc (); + +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + + +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +--connection node_2 +--reap + +--connection node_1 +# We expect no errors here, because the handler in insert_proc() caught the deadlock error +--reap +SELECT @errno = 1213; +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; + +--connection node_1 +SET GLOBAL wsrep_slave_threads = DEFAULT; +DROP TABLE t1; +DROP PROCEDURE insert_proc; + +SET GLOBAL debug_dbug = NULL; +SET debug_sync='RESET'; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/mysql-test/suite/galera/t/MW-402.test b/mysql-test/suite/galera/t/MW-402.test new file mode 100644 index 00000000..4b83e25d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-402.test @@ -0,0 +1,224 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/galera_have_debug_sync.inc + +# +# we must open connection node_1a here, MW-369.inc will use it later +# +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +# +# cascading delete operation is replicated from node2 +# and this conflicts with an update for child table in node1 +# +# As a result, the update should fail for certification error +# +--connection node_1 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON DELETE CASCADE); + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = UPDATE c SET f2=1 where f1=1 +--let $mw_369_child_query = DELETE FROM p WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# cascading update operation is replicated from node2 +# and this conflicts with an update for child table in node1 +# +# As a result, the update should fail for certification error +# +--connection node_1 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); + + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = UPDATE c SET f2=2 where f1=1 +--let $mw_369_child_query = UPDATE p set f1=11 WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# ON UPDATE CASCADE tests +# Here we update primary key of parent table to cause cascaded update +# on child table +# +# cascading update operation is replicated from node2 +# and this conflicts with an update for child table in node1 +# +# As a result, the update should fail for certification error +# +--connection node_1 + +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p_id) REFERENCES p (f1) ON UPDATE CASCADE); + + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1, 0); + +--let $mw_369_parent_query = UPDATE c SET p_id=2 where f1=1 +--let $mw_369_child_query = UPDATE p set f1=11 WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +# same as previous, but statements in different order +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +--let $mw_369_parent_query = UPDATE p set f1=21 WHERE f1 = 11 +--let $mw_369_child_query = UPDATE c SET p_id=2 where f1=1 + +--connection node_1a +--source MW-369.inc + +# Commit fails +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + +# +# CASCADE DELETE tests with two parent tables +# Here we cause cascaded operation on child table through +# one parent table and have other operation on the other +# parent table +# +# cascading update operation is replicated from node2 +# but this does not conflict with an update for the other parent table in node1 +# +# As a result, the update on p2 should succeed +# +--connection node_1 + +CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p1_id INTEGER, p2_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p1_id) REFERENCES p1 (f1) + ON DELETE CASCADE, + CONSTRAINT fk_2 FOREIGN KEY (p2_id) REFERENCES p2 (f1)); + +INSERT INTO p1 VALUES (1, 0); +INSERT INTO p2 VALUES (1, 0); + +INSERT INTO c VALUES (1, 1, 1, 0); + +--let $mw_369_parent_query = UPDATE p2 SET f2=2 where f1=1 +--let $mw_369_child_query = DELETE FROM p1 WHERE f1 = 1 + +--connection node_1a +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--reap + +--connection node_2 +SELECT * FROM p1; +SELECT * FROM p2; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p1; +DROP TABLE p2; + +# +# CASCADE DELETE tests with two parent tables +# Here we cause cascaded operation on child table through +# one parent table and issue other delete operation through the +# other parent table. The cascade progresses to same child table row where +# we should see the conflict to happen +# +# As a result, the update on p2 should fail +# +--connection node_1 + +CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p1_id INTEGER, p2_id INTEGER, + f2 INTEGER, + CONSTRAINT fk_1 FOREIGN KEY (p1_id) REFERENCES p1 (f1) + ON DELETE CASCADE, + CONSTRAINT fk_2 FOREIGN KEY (p2_id) REFERENCES p2 (f1) + ON DELETE CASCADE); + +INSERT INTO p1 VALUES (1, 0); +INSERT INTO p2 VALUES (1, 0); + +INSERT INTO c VALUES (1, 1, 1, 0); + +--let $mw_369_parent_query = DELETE FROM p2 WHERE f1=1 +--let $mw_369_child_query = DELETE FROM p1 WHERE f1=1 + +--connection node_1a +--source MW-369.inc + +# Commit succeeds +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p1; +SELECT * FROM p2; +SELECT * FROM c; + +DROP TABLE c,p1,p2; diff --git a/mysql-test/suite/galera/t/MW-416.test b/mysql-test/suite/galera/t/MW-416.test new file mode 100644 index 00000000..f9a1b47e --- /dev/null +++ b/mysql-test/suite/galera/t/MW-416.test @@ -0,0 +1,132 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--source include/wait_until_ready.inc + +CREATE USER 'userMW416'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON test.* TO 'userMW416'@'localhost'; + +--connect userMW416, localhost, userMW416,, test, $NODE_MYPORT_1 +--connection userMW416 + +# DDL + +--error 1044 +ALTER DATABASE db CHARACTER SET = utf8; +--error 1044 +ALTER EVENT ev1 RENAME TO ev2; +--error 1370 +ALTER FUNCTION fun1 COMMENT 'foo'; +#--error 1044,1227 +#ALTER INSTANCE ROTATE INNODB MASTER KEY; +--error 1044,1227 +ALTER LOGFILE GROUP lfg ADD UNDOFILE 'file' ENGINE=InnoDB; +--error 1044,1227,1370 +ALTER PROCEDURE proc1 COMMENT 'foo'; +--error 1044,1227,1370 +ALTER SERVER srv OPTIONS (USER 'sally'); +--error 1044,1142,1227,1370 +ALTER TABLE tbl DROP COLUMN col; +--error 1044,1227,1370 +ALTER TABLESPACE tblspc DROP DATAFILE 'file' ENGINE=innodb; +--error 1044,1142,1227,1370 +ALTER VIEW vw AS SELECT 1; + +--error 1044,1227,1370 +CREATE DATABASE db; +--error 1044,1227,1370 +CREATE EVENT ev1 ON SCHEDULE AT CURRENT_TIMESTAMP DO SELECT 1; +--error 1044,1227,1370 +CREATE FUNCTION fun1() RETURNS int RETURN(1); +--error 1044,1227,1370 +CREATE FUNCTION fun1 RETURNS STRING SONAME 'funlib.so'; +--error 1044,1227,1370 +CREATE PROCEDURE proc1() BEGIN END; +--error 1044,1142,1227,1370 +CREATE INDEX idx ON tbl(id); +--error 1044,1142,1227,1370 +CREATE LOGFILE GROUP lfg ADD UNDOFILE 'undofile' ENGINE innodb; +--error 1044,1142,1227,1370 +CREATE SERVER srv FOREIGN DATA WRAPPER 'fdw' OPTIONS (USER 'user'); +--error 1044,1142,1227,1370 +CREATE TABLE t (i int); +--error 1044,1142,1227,1370 +CREATE TABLESPACE tblspc ADD DATAFILE 'file' ENGINE=innodb; +--error 1044,1142,1227,1370 +CREATE TRIGGER trg BEFORE UPDATE ON t FOR EACH ROW BEGIN END; +--error 1044,1142,1227,1370 +CREATE VIEW vw AS SELECT 1; + + + +--error 1044,1142,1227,1370 +DROP DATABASE db; +--error 1044,1142,1227,1370 +DROP EVENT ev; +--error 1044,1142,1227,1370 +DROP FUNCTION fun1; +--error 1044,1142,1227,1370 +DROP INDEX idx ON t0; +--error 1044,1142,1227,1370,1064 +DROP LOGFILE GROUP lfg; +--error 1044,1142,1227,1370 +DROP PROCEDURE proc1; +--error 1044,1142,1227,1370 +DROP SERVEr srv; +--error 1044,1142,1227,1370 +DROP TABLE t0; +--error 1044,1142,1227,1370,1064 +DROP TABLESPACE tblspc; +--error 1044,1142,1227,1360,1370 +DROP TRIGGER trg; +--error 1044,1142,1227,1370 +DROP VIEW vw; + +--error 1044,1142,1227,1370 +RENAME TABLE t0 TO t1; + +--error 1044,1142,1227,1370 +TRUNCATE TABLE t0; + +# DCL + +# account management +--error 1044,1142,1227,1370,1064 +ALTER USER myuser PASSWORD EXPIRE; +--error 1044,1142,1227,1370 +CREATE USER myuser IDENTIFIED BY 'pass'; +--error 1044,1142,1227,1370 +DROP USER myuser; +--error 1044,1045,1142,1227,1370 +GRANT ALL ON *.* TO 'myuser'; +--error 1044,1142,1227,1370 +RENAME USER myuser TO mariauser; +--error 1044,1142,1227,1370 +REVOKE SELECT ON test FROM myuser; +--error 1044,1142,1227,1370,1698 +REVOKE ALL, GRANT OPTION FROM myuser; +--error 1044,1142,1227,1370,1698 +REVOKE PROXY ON myuser FROM myuser; + +# table maintenance +--error 1044,1142,1227,1370 +ANALYZE TABLE db.tbl; +--error 1044,1142,1227,1370 +CHECK TABLE db.tbl; +--error 1044,1142,1227,1370 +CHECKSUM TABLE db.tbl; +--error 1044,1142,1227,1370 +OPTIMIZE TABLE db.tbl; +--error 1044,1142,1227,1370 +REPAIR TABLE db.tbl; + +# plugin and user defined functions +--error 1044,1142,1227,1370 +INSTALL PLUGIN plg SONAME 'plg.so'; +--error 1044,1142,1227,1370 +UNINSTALL PLUGIN plg; + +--connection node_1 +DROP USER 'userMW416'@'localhost'; +SHOW DATABASES; + diff --git a/mysql-test/suite/galera/t/MW-44-master.opt b/mysql-test/suite/galera/t/MW-44-master.opt new file mode 100644 index 00000000..a15aa0a9 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-44-master.opt @@ -0,0 +1 @@ +--log-output=TABLE diff --git a/mysql-test/suite/galera/t/MW-44.test b/mysql-test/suite/galera/t/MW-44.test new file mode 100644 index 00000000..a2acfc57 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-44.test @@ -0,0 +1,32 @@ +# +# MW-44: DDL is logged in the general_log on the slave +# + +--source include/galera_cluster.inc + +--connection node_1 +TRUNCATE TABLE mysql.general_log; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.general_log WHERE argument NOT LIKE '%mysql.general_log%' +--let $wait_condition_on_error_output = SELECT * FROM mysql.general_log +--source include/wait_condition_with_debug.inc + +--connection node_1 +SET SESSION wsrep_osu_method=TOI; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +SET SESSION wsrep_osu_method=RSU; +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +SET SESSION wsrep_osu_method=TOI; + +--let $wait_condition = SELECT COUNT(*) = 2 FROM mysql.general_log WHERE argument LIKE "CREATE%" OR argument LIKE "ALTER%" +--let $wait_condition_on_error_output = SELECT * FROM mysql.general_log +--source include/wait_condition_with_debug.inc + +--connection node_2 + +--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.general_log WHERE argument LIKE "CREATE%" OR argument LIKE "ALTER%" +--let $wait_condition_on_error_output = SELECT * FROM mysql.general_log +--source include/wait_condition_with_debug.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-86-wait1.test b/mysql-test/suite/galera/t/MW-86-wait1.test new file mode 100644 index 00000000..7ebd3ba9 --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait1.test @@ -0,0 +1,109 @@ +# +# SHOW commands no longer obey wsrep_sync_wait = 1 (WSREP_SYNC_WAIT_BEFORE_READ) +# (they do not wait for the background INSERT in the applier in node_2 to +# complete) +# +--source include/galera_cluster.inc +--source include/have_binlog_format_row.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +SET @orig_debug=@@debug_dbug; + +--connection node_2 +# Make sure no signals have been leftover from previous tests to surprise us. +SELECT @@debug_sync; +set debug_sync='RESET'; + +SET SESSION wsrep_sync_wait = 1; +SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; + +--connection node_1 +CREATE TABLE t_wait1 (f1 INTEGER) ENGINE=InnoDB; +# This will complete in node_1 but will start a background apply in node_2 +# which will stop because of sync.wsrep_apply_cb we set above. +INSERT INTO t_wait1 VALUES (1); + +--connection node_2 + +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--disable_result_log + +SHOW BINARY LOGS; + +SHOW BINLOG EVENTS; + +--error ER_NO_SUCH_TABLE +SHOW COLUMNS FROM t1; + +--error ER_EVENT_DOES_NOT_EXIST +SHOW CREATE EVENT e1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE FUNCTION f1; + +--error ER_SP_DOES_NOT_EXIST +SHOW CREATE PROCEDURE p1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--error ER_TRG_DOES_NOT_EXIST +SHOW CREATE TRIGGER tr1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE VIEW v1; + +SHOW DATABASES; + +SHOW ENGINE InnoDB STATUS; + +--error ER_SP_DOES_NOT_EXIST +SHOW FUNCTION CODE f1; + +SHOW FUNCTION STATUS; + +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_NO_SUCH_TABLE +SHOW INDEX FROM t1; + +SHOW OPEN TABLES; + +--error ER_SP_DOES_NOT_EXIST +SHOW PROCEDURE CODE p1; + +SHOW PROCEDURE STATUS; + +SHOW PRIVILEGES; + +SHOW STATUS LIKE 'wsrep_cluster_size'; + +SHOW TABLE STATUS; + +SHOW TABLES; + +SHOW TRIGGERS; + +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + +--enable_result_log + +# Unblock the background INSERT and remove the sync point. +SET GLOBAL debug_dbug = @orig_debug; + +SET SESSION debug_sync = "now SIGNAL signal.wsrep_apply_cb"; +SET debug_sync='RESET'; +SET SESSION wsrep_sync_wait = default; + +# This will wait for the background INSERT to complete before we quit +# from the test. +DROP TABLE t_wait1; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/mysql-test/suite/galera/t/MW-86-wait8.cnf b/mysql-test/suite/galera/t/MW-86-wait8.cnf new file mode 100644 index 00000000..8f6a760d --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait8.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin +log-slave-updates + +[mysqld.2] +log-bin +log-slave-updates + diff --git a/mysql-test/suite/galera/t/MW-86-wait8.test b/mysql-test/suite/galera/t/MW-86-wait8.test new file mode 100644 index 00000000..1b3f355e --- /dev/null +++ b/mysql-test/suite/galera/t/MW-86-wait8.test @@ -0,0 +1,131 @@ +# +# SHOW commands now obey wsrep_sync_wait = 8 (WSREP_SYNC_WAIT_BEFORE_SHOW) +# +--source include/galera_cluster.inc +--source include/have_binlog_format_row.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +SET @orig_debug=@@debug_dbug; + +--connection node_2 +# Make sure no signals have been leftover from previous tests to surprise us. +SELECT @@debug_sync; + +SET SESSION wsrep_sync_wait = 8; +SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; + +--connection node_1 +CREATE TABLE t_wait8 (f1 INTEGER) ENGINE=InnoDB; +# This will complete in node_1 but will start a background apply in node_2 +# which will stop because of sync.wsrep_apply_cb we set above. +INSERT INTO t_wait8 VALUES (1); + +--connection node_2 + +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT0.1S"; + +SET SESSION debug_sync = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--disable_result_log + +--error ER_LOCK_WAIT_TIMEOUT +SHOW BINARY LOGS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW BINLOG EVENTS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW COLUMNS FROM t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE DATABASE db1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE EVENT e1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE FUNCTION f1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE PROCEDURE p1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE TABLE t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE TRIGGER tr1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW CREATE VIEW v1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW DATABASES; + +--error 0 +SHOW ENGINE InnoDB STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW FUNCTION CODE f1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW FUNCTION STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW GRANTS FOR 'root'@'localhost'; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW INDEX FROM t1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW OPEN TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW PROCEDURE CODE p1; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW PROCEDURE STATUS; + +--error 0 +SHOW PRIVILEGES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLE STATUS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW TRIGGERS; + +--error ER_LOCK_WAIT_TIMEOUT +SHOW GLOBAL VARIABLES LIKE 'foo_bar'; + +--error 0 +SHOW WARNINGS; + +--enable_result_log + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig" +--enable_query_log + +# Unblock the background INSERT and remove the sync point. +SET GLOBAL debug_dbug = @orig_debug; + +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET debug_sync='RESET'; + +SET SESSION wsrep_sync_wait = default; + +# This will wait for the background INSERT to complete before we quit +# from the test. +DROP TABLE t_wait8; + +# Make sure no pending signals are leftover to surprise subsequent tests. +SELECT @@debug_sync; diff --git a/mysql-test/suite/galera/t/basic.test b/mysql-test/suite/galera/t/basic.test new file mode 100644 index 00000000..8fc6eee3 --- /dev/null +++ b/mysql-test/suite/galera/t/basic.test @@ -0,0 +1,26 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +USE test; +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5); +SELECT * FROM t1; + +--echo +--echo # On node_1 +--connection node_1 +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + +--let $galera_diff_statement = SELECT * FROM t1 +--source include/galera_diff.inc + +# Cleanup +DROP TABLE t1; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/binlog_checksum.test b/mysql-test/suite/galera/t/binlog_checksum.test new file mode 100644 index 00000000..5aab68a7 --- /dev/null +++ b/mysql-test/suite/galera/t/binlog_checksum.test @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # On node_1 +--connection node_1 +SET @binlog_checksum_saved= @@GLOBAL.BINLOG_CHECKSUM; +SET @@GLOBAL.BINLOG_CHECKSUM=CRC32; + +--echo # On node_2 +--connection node_2 +SET @binlog_checksum_saved= @@GLOBAL.BINLOG_CHECKSUM; +SET @@GLOBAL.BINLOG_CHECKSUM=CRC32; + +USE test; +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5); +SELECT * FROM t1; +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + +--let $galera_diff_statement = SELECT * FROM t1 +--source include/galera_diff.inc + +# Cleanup +DROP TABLE t1; +--connection node_1 +SET @@GLOBAL.BINLOG_CHECKSUM = @binlog_checksum_saved; +--connection node_2 +SET @@GLOBAL.BINLOG_CHECKSUM = @binlog_checksum_saved; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/create.test b/mysql-test/suite/galera/t/create.test new file mode 100644 index 00000000..96a6640c --- /dev/null +++ b/mysql-test/suite/galera/t/create.test @@ -0,0 +1,89 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-6924 : Server crashed on CREATE TABLE ... SELECT +--echo # + +SET @wsrep_forced_binlog_format_saved=@@GLOBAL.wsrep_forced_binlog_format; +SET @@GLOBAL.wsrep_forced_binlog_format=STATEMENT; + +# @@log_bin must be OFF +SHOW VARIABLES LIKE '%log%bin%'; + +USE test; +CREATE TABLE t1(i INT) ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +CREATE TEMPORARY TABLE `t1_temp` AS SELECT * FROM `t1` WHERE i = 1; +SELECT * FROM t1; +SELECT * FROM t1_temp; + +# Cleanup +DROP TABLE t1; +SET @@GLOBAL.wsrep_forced_binlog_format=@wsrep_forced_binlog_format_saved; + +--echo # +--echo # MDEV-7673: CREATE TABLE SELECT fails on Galera cluster +--echo # +--connection node_1 +CREATE TABLE t1 (i INT) ENGINE=INNODB DEFAULT CHARSET=utf8 SELECT 1 as i; +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; +# Cleanup +DROP TABLE t1; + +--echo # +--echo # MDEV-8166 : Adding index on new table from select crashes Galera +--echo # cluster +--echo # +--connection node_1 +CREATE TABLE t1(i int(11) NOT NULL DEFAULT '0') ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO t1(i) VALUES (1), (2), (3); + +CREATE TABLE t2 (i INT) SELECT i FROM t1; +ALTER TABLE t2 ADD INDEX idx(i); + +SELECT * FROM t2; + +--connection node_2 +SELECT * FROM t2; +SHOW CREATE TABLE t2; + +# Cleanup +DROP TABLE t1, t2; + +--echo # +--echo # MDEV-9853: WSREP says it cannot get fake InnoDB transaction ID +--echo # followed by segmentation fault +--echo # +CREATE TABLE `t1`(`c1` INT) ENGINE=INNODB; + +SET autocommit=0; +CREATE TABLE `t2` (`c1` INT) ENGINE=INNODB SELECT * FROM t1; +COMMIT; +SET autocommit=1; + +# Cleanup +DROP TABLE t1, t2; + + +--echo # +--echo # MDEV-10235: Deadlock in CREATE TABLE ... AS SELECT .. if result set +--echo # is empty in Galera +--echo # +--connection node_1 +CREATE TABLE t1(c1 INT) ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +CREATE TABLE t2 AS SELECT * FROM t1 WHERE c1=2; + +--connection node_2 +SELECT * FROM t1; +SELECT * FROM t2; +# Cleanup +DROP TABLE t1, t2; + +--source include/galera_end.inc +--echo # End of tests + diff --git a/mysql-test/suite/galera/t/enforce_storage_engine.test b/mysql-test/suite/galera/t/enforce_storage_engine.test new file mode 100644 index 00000000..5f07dd53 --- /dev/null +++ b/mysql-test/suite/galera/t/enforce_storage_engine.test @@ -0,0 +1,33 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# enforce_storage_engine should prevent the creation of tables with +# non-enforced storage engines on the master node and the command +# should also not replicate to other nodes. + +--echo # +--echo # MDEV-8831 : enforce_storage_engine doesn't block table creation on +--echo # other nodes (galera cluster) +--echo # + +--connection node_1 +SET @@enforce_storage_engine=INNODB; +CREATE TABLE t1(i INT) ENGINE=INNODB; +--error ER_UNKNOWN_STORAGE_ENGINE +CREATE TABLE t2(i INT) ENGINE=MYISAM; + +INSERT INTO t1 VALUES(1); + +--connection node_2 +SHOW TABLES; +SELECT COUNT(*)=1 FROM t1; + +CREATE TABLE t2(i INT) ENGINE=MYISAM; + +--connection node_1 +SHOW TABLES; + +# Cleanup +DROP TABLE t1, t2; + +--echo # End of tests diff --git a/mysql-test/suite/galera/t/enforce_storage_engine2.cnf b/mysql-test/suite/galera/t/enforce_storage_engine2.cnf new file mode 100644 index 00000000..b14fce85 --- /dev/null +++ b/mysql-test/suite/galera/t/enforce_storage_engine2.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +enforce_storage_engine=innodb +sql_mode='' + +[mysqld.2] +enforce_storage_engine=innodb +sql_mode='' + + + + diff --git a/mysql-test/suite/galera/t/enforce_storage_engine2.test b/mysql-test/suite/galera/t/enforce_storage_engine2.test new file mode 100644 index 00000000..7a822bce --- /dev/null +++ b/mysql-test/suite/galera/t/enforce_storage_engine2.test @@ -0,0 +1,20 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-9312: storage engine not enforced during galera cluster +--echo # replication +--echo # +--connection node_1 +CREATE TABLE t1(i INT) ENGINE=INNODB; +CREATE TABLE t2(i INT) ENGINE=MYISAM; + +--connection node_2 +SHOW TABLES; +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +# Cleanup +DROP TABLE t1, t2; + +--echo # End of tests diff --git a/mysql-test/suite/galera/t/ev51914.test b/mysql-test/suite/galera/t/ev51914.test new file mode 100644 index 00000000..e5edacab --- /dev/null +++ b/mysql-test/suite/galera/t/ev51914.test @@ -0,0 +1,214 @@ +# Disable SAVEPOINT and ROLLBACK TO SAVEPOINT in SP, SF, TR. + +--source include/galera_cluster.inc +--source include/have_innodb.inc + + +--connection node_1 +--echo SAVEPOINT in a stored function should be forbidden +--delimiter | +CREATE FUNCTION f1 () RETURNS INT BEGIN + SAVEPOINT s; + RETURN 1; +END| +--delimiter ; + +SELECT f1(); + +DROP FUNCTION f1; + +--echo ROLLBACK TO SAVEPOINT in a stored function should be forbidden +--delimiter | +CREATE FUNCTION f2 () RETURNS INT BEGIN + ROLLBACK TO SAVEPOINT s; + RETURN 1; +END| +--delimiter ; + +BEGIN; +SAVEPOINT s; +--error ER_SP_DOES_NOT_EXIST +SELECT f2(); +COMMIT; + +DROP FUNCTION f2; + +BEGIN; +SAVEPOINT S; +ROLLBACK TO SAVEPOINT S; +COMMIT; + + +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 values (110), (111), (112), (113), (114); + +--echo Direct SAVEPOINT in a trigger should be forbidden +--connection node_2 +CREATE TRIGGER i1_t1 BEFORE INSERT ON t1 FOR EACH ROW SAVEPOINT s; + +--connection node_1 +INSERT INTO t1 VALUES (1); +DROP TRIGGER i1_t1; + +CREATE TRIGGER i2_t1 AFTER INSERT ON t1 FOR EACH ROW SAVEPOINT s; +INSERT INTO t1 VALUES (2); +DROP TRIGGER i2_t1; + +INSERT INTO t1 VALUES (3); +CREATE TRIGGER u1_t1 BEFORE UPDATE ON t1 FOR EACH ROW SAVEPOINT s; +UPDATE t1 SET a=4 WHERE a=3; +DROP TRIGGER u1_t1; + +CREATE TRIGGER u2_t1 AFTER UPDATE ON t1 FOR EACH ROW SAVEPOINT s; +UPDATE t1 SET a=4 WHERE a=3; +DROP TRIGGER u2_t1; + +CREATE TRIGGER d1_t1 BEFORE DELETE ON t1 FOR EACH ROW SAVEPOINT s; +DELETE FROM t1; +DROP TRIGGER d1_t1; + +CREATE TRIGGER d1_t1 AFTER DELETE ON t1 FOR EACH ROW SAVEPOINT s; +DELETE FROM t1; +DROP TRIGGER d1_t1; + +--echo SAVEPOINT in a compound statement in a trigger should be forbidden +--delimiter | +CREATE TRIGGER i3_t1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN + SAVEPOINT s; +END| +--delimiter ; +INSERT INTO t1 VALUES (5); +DROP TRIGGER i3_t1; + +--echo SAVEPOINT in a PS call in a trigger should be forbidden +# echo handled by SAVEPOINT forbidden in PS +--delimiter | +--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG +CREATE TRIGGER i4_t1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN + PREPARE set_savepoint FROM "SAVEPOINT s"; + EXECUTE set_savepoint; + DEALLOCATE PREPARE set_savepoint; +END| +--delimiter ; + +--connection node_2 +--echo SAVEPOINT in SP called from a trigger should be forbidden +--delimiter | +CREATE PROCEDURE p1() BEGIN + SAVEPOINT s; +END| +--delimiter ; +--connection node_1 +CREATE TRIGGER i5_t1 BEFORE INSERT ON t1 FOR EACH ROW CALL p1; +INSERT INTO t1 VALUES (6); +DROP TRIGGER i5_t1; + +--echo SAVEPOINT in a SP called from a PS called from a trigger be forbidden +# echo handled by SAVEPOINT forbidden in PS +PREPARE call_p1 FROM "CALL p1"; +--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG +CREATE TRIGGER i6_t1 BEFORE INSERT ON t1 FOR EACH ROW EXECUTE call_p1; + +--echo SAVEPOINT in a function called from a trigger should be forbidden +--delimiter | +CREATE FUNCTION f1 () RETURNS INT BEGIN + SAVEPOINT s; + RETURN 1; +END| +--delimiter ; +CREATE TRIGGER i7_t1 BEFORE INSERT ON t1 FOR EACH ROW SET @foo = f1(); +INSERT INTO t1 VALUES (7); +DROP TRIGGER i7_t1; + +--echo SAVEPOINT in a SP called from a SP called from a trigger should be forbidden +--delimiter | +CREATE PROCEDURE p2() BEGIN + CALL p1(); +END| +--delimiter ; +CREATE TRIGGER i8_t1 BEFORE INSERT ON t1 FOR EACH ROW CALL p2; +INSERT INTO t1 VALUES (8); +DROP TRIGGER i8_t1; + +--echo SAVEPOINT in a SP called from a trigger called from a SP should be forbidden +CREATE TRIGGER i9_t1 BEFORE INSERT ON t1 FOR EACH ROW CALL p1; +--delimiter | +CREATE PROCEDURE p3() BEGIN + INSERT INTO t1 VALUES (9); +END| +--delimiter ; +CALL p3(); +DROP TRIGGER i9_t1; + +--echo ROLLBACK TO SAVEPOINT in trigger as a trivial statement should be forbidden +# Trigger activation creates a new savepoint level, making the earlier levels +# inaccessible. Thus forbidding SAVEPOINT should be enough as then there is +# no valid savepoint to pass to ROLLBACK TO SAVEPOINT, but we forbid it once +# more just in case. +CREATE TRIGGER i4_t1 BEFORE INSERT ON t1 FOR EACH ROW ROLLBACK TO SAVEPOINT s; +BEGIN; +SAVEPOINT s; +--error ER_SP_DOES_NOT_EXIST +INSERT INTO t1 VALUES (5); +COMMIT; +DROP TRIGGER i4_t1; + +--echo ROLLBACK TO SAVEPOINT in a trigger in a SP call should be forbidden +--delimiter | +CREATE PROCEDURE p4() BEGIN + ROLLBACK TO SAVEPOINT s; +END| +--delimiter ; +CREATE TRIGGER i5_t1 BEFORE INSERT ON t1 FOR EACH ROW CALL p4; +BEGIN; +SAVEPOINT s; +--error ER_SP_DOES_NOT_EXIST +INSERT INTO t1 VALUES (6); +COMMIT; +DROP TRIGGER i5_t1; + +--echo SAVEPOINT in a SP next to a trigger should work +CREATE TRIGGER i6_t1 BEFORE INSERT ON t1 FOR EACH ROW SET NEW.a = NEW.a + 1; +--delimiter | +CREATE PROCEDURE p5() BEGIN + SAVEPOINT s; + INSERT INTO t1 VALUES (10); + ROLLBACK TO SAVEPOINT s; +END| +--delimiter ; +BEGIN; +CALL p5(); +COMMIT; +DROP TRIGGER i6_t1; + +--connection node_2 +delimiter |; +create trigger t1 before insert on t1 for each row +begin + insert into t2 values (NULL); +end| +delimiter ;| + +--connection node_1 +INSERT INTO t1 VALUES (201), (202), (203); + +--connection node_1 +SELECT * FROM t1; +SELECT COUNT(*) FROM t2; + +--connection node_2 +SELECT * FROM t1; +SELECT COUNT(*) FROM t2; + +--connection node_1 +DEALLOCATE PREPARE call_p1; + +--connection node_2 +DROP TABLE t1, t2; +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; +DROP PROCEDURE p4; +DROP PROCEDURE p5; +DROP FUNCTION f1; diff --git a/mysql-test/suite/galera/t/fk.test b/mysql-test/suite/galera/t/fk.test new file mode 100644 index 00000000..e0b7cf06 --- /dev/null +++ b/mysql-test/suite/galera/t/fk.test @@ -0,0 +1,116 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# MDEV-6651: MariaDB galera cluster crashes in file row0mysql.cc line 684 +# DELETE FROM ports WHERE ports.id = 'f37aa3fe-ab99-4d0f-a566-6cd3169d7516' +# where table ports have foreign keys +# + +USE test; +--echo +--echo # On node_1 +--connection node_1 + + CREATE TABLE networks ( + `tenant_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `status` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL, + `admin_state_up` tinyint(1) DEFAULT NULL, + `shared` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + + CREATE TABLE ports ( + `tenant_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `network_id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + `mac_address` varchar(32) COLLATE utf8_unicode_ci NOT NULL, + `admin_state_up` tinyint(1) NOT NULL, + `status` varchar(16) COLLATE utf8_unicode_ci NOT NULL, + `device_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + `device_owner` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`), + KEY `network_id` (`network_id`), + CONSTRAINT `ports_ibfk_1` FOREIGN KEY (`network_id`) REFERENCES networks (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +CREATE TABLE subnets ( + `tenant_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `network_id` varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL, + `ip_version` int(11) NOT NULL, + `cidr` varchar(64) COLLATE utf8_unicode_ci NOT NULL, + `gateway_ip` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, + `enable_dhcp` tinyint(1) DEFAULT NULL, + `shared` tinyint(1) DEFAULT NULL, + `ipv6_ra_mode` enum('slaac','dhcpv6-stateful','dhcpv6-stateless') COLLATE utf8_unicode_ci DEFAULT NULL, + `ipv6_address_mode` enum('slaac','dhcpv6-stateful','dhcpv6-stateless') COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `network_id` (`network_id`), + CONSTRAINT `subnets_ibfk_1` FOREIGN KEY (`network_id`) REFERENCES networks (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + + CREATE TABLE `ipallocations` ( + `port_id` varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL, + `ip_address` varchar(64) COLLATE utf8_unicode_ci NOT NULL, + `subnet_id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + `network_id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`ip_address`,`subnet_id`,`network_id`), + KEY `port_id` (`port_id`), + KEY `subnet_id` (`subnet_id`), + KEY `network_id` (`network_id`), + CONSTRAINT `ipallocations_ibfk_1` FOREIGN KEY (`port_id`) REFERENCES `ports` (`id`) ON DELETE CASCADE, + CONSTRAINT `ipallocations_ibfk_2` FOREIGN KEY (`subnet_id`) REFERENCES `subnets` (`id`) ON DELETE CASCADE, + CONSTRAINT `ipallocations_ibfk_3` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + +INSERT INTO networks VALUES ('f37aa3fe-ab99-4d0f-a566-6cd3169d7516','f37aa3fe-ab99-4d0f-a566-6cd3169d7516','MyNet','ACTIVE',0,0); + +INSERT INTO ports VALUES ('','f37aa3fe-ab99-4d0f-a566-6cd3169d7516','','f37aa3fe-ab99-4d0f-a566-6cd3169d7516','fa:16:3e:e3:cc:bb',1,'DOWN','f37aa3fe-ab99-4d0f-a566-6cd3169d7516','network:router_gateway'); + +INSERT INTO subnets VALUES ('f37aa3fe-ab99-4d0f-a566-6cd3169d7516','f37aa3fe-ab99-4d0f-a566-6cd3169d7516','ext-subnet','f37aa3fe-ab99-4d0f-a566-6cd3169d7516',4,'10.25.0.0/24','10.25.0.4',0,1,NULL,NULL); + +INSERT INTO ipallocations VALUES ('f37aa3fe-ab99-4d0f-a566-6cd3169d7516','10.25.0.17','f37aa3fe-ab99-4d0f-a566-6cd3169d7516','f37aa3fe-ab99-4d0f-a566-6cd3169d7516'); + +select * from ports where ports.id = 'f37aa3fe-ab99-4d0f-a566-6cd3169d7516'; + +--connection node_2 + +select * from ports where ports.id = 'f37aa3fe-ab99-4d0f-a566-6cd3169d7516'; + +--let $galera_diff_statement = SELECT * FROM ports +--source include/galera_diff.inc + +--connection node_1 + +DELETE FROM ports WHERE ports.id = 'f37aa3fe-ab99-4d0f-a566-6cd3169d7516'; + +select * from networks; +select * from ports; +select * from subnets; +select * from ipallocations; +select * from ports; + +--echo +--echo # On node_2 +--connection node_2 +select * from networks; +select * from ports; +select * from subnets; +select * from ipallocations; +select * from ports; + +--let $galera_diff_statement = SELECT * FROM ports +--source include/galera_diff.inc + +--connection node_1 +drop table ipallocations; +drop table subnets; +drop table ports; +drop table networks; + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera#414.cnf b/mysql-test/suite/galera/t/galera#414.cnf new file mode 100644 index 00000000..fbd1c587 --- /dev/null +++ b/mysql-test/suite/galera/t/galera#414.cnf @@ -0,0 +1,8 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcs.max_packet_size=2' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcs.max_packet_size=2' + diff --git a/mysql-test/suite/galera/t/galera#414.test b/mysql-test/suite/galera/t/galera#414.test new file mode 100644 index 00000000..de10898d --- /dev/null +++ b/mysql-test/suite/galera/t/galera#414.test @@ -0,0 +1,43 @@ +# +# codership/galera#414 Shutdown crashes node if the node started with `gcs.max_packet_size=2` +# + +--source include/big_test.inc +--source include/have_innodb.inc +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# We perform the shutdown/restart sequence in here. If there was a crash during shutdown, MTR will detect it + +--connection node_2 +--source include/shutdown_mysqld.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_on = OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--source include/start_mysqld.inc + +--connection node_1 +SET SESSION wsrep_on = ON; +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +--connection node_1 +CALL mtr.add_suppression("Failed to set packet size"); + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc +CALL mtr.add_suppression("Failed to set packet size"); + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera#500.test b/mysql-test/suite/galera/t/galera#500.test new file mode 100644 index 00000000..471620b3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera#500.test @@ -0,0 +1,45 @@ +# +# The purpose of this test is to verify that if an exception is +# thrown from gcomm background thread, the provider terminates properly +# and wsrep_ready becomes 0. +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc +--source include/galera_have_debug_sync.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# Force node_2 gcomm background thread to terminate via exception. +--connection node_2 +--let $wsrep_cluster_address = `SELECT @@wsrep_cluster_address` +# Setting gmcast.isolate=2 will force gcomm background thread to +# throw exception. +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options="gmcast.isolate=2"; + +# Wait until wsrep_ready becomes 0. +--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME ='wsrep_ready' +--source include/wait_condition.inc + +# Wait until node_1 ends up in non-prim and rebootstrap the cluster. +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME ='wsrep_cluster_size' +--source include/wait_condition.inc +SHOW STATUS LIKE 'wsrep_cluster_status'; +SET SESSION wsrep_sync_wait = default; +SET GLOBAL wsrep_provider_options="pc.bootstrap=1"; + +# Restart node_2 +--connection node_2 +SET SESSION wsrep_on=0; +--source include/restart_mysqld.inc + +--connection node_2 +CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast.isolate=2."); + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera#505.test b/mysql-test/suite/galera/t/galera#505.test new file mode 100644 index 00000000..67ec1045 --- /dev/null +++ b/mysql-test/suite/galera/t/galera#505.test @@ -0,0 +1,23 @@ +# galera#505 - Change of pc.weight wsrep param will be correctly stored in wsrep_provider_options variable + +--source include/galera_cluster.inc + +--connection node_1 + +SET SESSION wsrep_sync_wait=0; +--let $galera_version=25.3.24 +source ../../wsrep/include/check_galera_version.inc; + +SET SESSION wsrep_sync_wait=DEFAULT; + +# Convert "... pc.weight = N; ..." to "N; ..." +--let $s1 = `SELECT SUBSTR(@@wsrep_provider_options, LOCATE('pc.weight =', @@wsrep_provider_options) + LENGTH('pc.weight = '))` +# Convert "N; ..." to "N" +--let $pc_weight_value = `SELECT SUBSTR('$s1', 1, LOCATE(';', '$s1') - 1)` + +SET GLOBAL wsrep_provider_options = 'pc.weight=3'; + +-- replace_regex /.*(pc\.weight = [0-9]+);.*/\1/ +SHOW GLOBAL VARIABLES LIKE 'wsrep_provider_options'; + +--eval SET GLOBAL wsrep_provider_options = 'pc.weight=$pc_weight_value' diff --git a/mysql-test/suite/galera/t/galera-features#117.cnf b/mysql-test/suite/galera/t/galera-features#117.cnf new file mode 100644 index 00000000..8eaed546 --- /dev/null +++ b/mysql-test/suite/galera/t/galera-features#117.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep-ignore-apply-errors=0 +wsrep-sync-wait=0 diff --git a/mysql-test/suite/galera/t/galera-features#117.test b/mysql-test/suite/galera/t/galera-features#117.test new file mode 100644 index 00000000..0436b201 --- /dev/null +++ b/mysql-test/suite/galera/t/galera-features#117.test @@ -0,0 +1,38 @@ +# +# This test tests voting for DDLs (TOI events) +# +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_2 +SET SESSION wsrep_on=OFF; +CREATE TABLE test.t1 (f2 INTEGER); +SET SESSION wsrep_on=ON; + +--error ER_TABLE_EXISTS_ERROR +CREATE TABLE test.t1 (f1 INTEGER); + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SHOW CREATE TABLE test.t1; +SHOW STATUS LIKE 'wsrep_cluster_status'; +DROP TABLE test.t1; + +--connection node_2 +SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SHOW CREATE TABLE test.t1; +SHOW STATUS LIKE 'wsrep_cluster_status'; +--error ER_UNKNOWN_COM_ERROR +CREATE TABLE test.t2 (f1 INTEGER); +SHOW TABLES IN test; + +--source include/kill_galera.inc +--source include/wait_until_disconnected.inc +--source include/start_mysqld.inc + +CALL mtr.add_suppression("Inconsistent by consensus."); +CALL mtr.add_suppression("WSREP: Failed to execute TOI action"); +CALL mtr.add_suppression("WSREP: TO isolation end failed"); diff --git a/mysql-test/suite/galera/t/galera_FK_duplicate_client_insert.test b/mysql-test/suite/galera/t/galera_FK_duplicate_client_insert.test new file mode 100644 index 00000000..02322fc0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_FK_duplicate_client_insert.test @@ -0,0 +1,161 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_cluster.inc +# +# This test will reproduce regressions of bugs +# https://github.com/codership/mysql-wsrep/issues/335 +# https://github.com/codership/mysql-wsrep/issues/336 +# +# The test will issue duplicate inserts into a table, which has foreign key +# constraint for a parent table. +# The inserts happen in separate nodes, and the +# The test outline is as follows: +# 1. in node 1, an update is done for the FK parent row, in a transaction, +# which is left open. The purpose of this is just to establish a X lock on +# the parent row. +# 2. in node 1, an insert for the child table is sent. The insert will have to wait +# for the parent row X lock, because it needs S lock on the same row. +# However, we have set an DBUG sync point just before the insert will call for +# innodb suspend +# 3. in node 2, a similar insert is issued. This will replicate to node 1 and try to +# abort the conflicting update and blocked insert +# 4. the inserts dbug sync point is relased, and insert should continue and abort +# gracefully +# 5. update is continued to commit, and it should also observe the deadlock +# +# This test is run in 3 phases: +# +# 1. with plain SQL statement +# 2. as SQL prepared statements +# 3. as SQl stored procedures +# +# The test phase 3 is for reproducing the issue in bug #336 specifically +# + +# +# create the test tables and foreign key constraint between them +# +CREATE TABLE user(id int primary key, j int) ENGINE=InnoDB; +CREATE TABLE user_session(id int primary key, fk1 int, fk2 int) ENGINE=InnoDB; +alter table user_session add foreign key (fk1) references user(id); + +# populate a few initial rows +INSERT INTO user values (1,0), (2,0), (3,0), (4,0); +INSERT INTO user_session values (1,1,1); + +# +# prepare test connections, for: +# update of parent row in node1 +# insert of child row in node1 +# insert of child row in node2 + +--connect node_1_u, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_i, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_2_i, 127.0.0.1, root, , test, $NODE_MYPORT_2 + + +# +# test phase 1: plain SQL statements +# +--echo "Phase 1: plain SQL statements" + + +--connection node_1 +let $counter=10; +let $sleep_period=1; + +while($counter > 0) +{ + --connection node_1_u + begin; + update user set j = j + 1 WHERE id > 0; + + --connection node_1_i + set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins'; + send insert into user_session(id,fk1,fk2) values (2, 2, 2); + + --connection node_1 + set debug_sync='now WAIT_FOR ins_waiting'; + + --connection node_2_i + insert into user_session(id,fk1,fk2) values (2, 2, 3); + + --connection node_1 + set debug_sync='now SIGNAL cont_ins'; + + --connection node_1_i + --error 0,ER_LOCK_DEADLOCK,ER_DUP_ENTRY + reap; + + --connection node_1_u + --error 0,ER_LOCK_DEADLOCK + commit; + + --connection node_1 + --error 0,ER_LOCK_DEADLOCK + truncate user_session; + set debug_sync = reset; + + dec $counter; +} + +# +# test phase 2: prepared statements +# +--echo "Phase 2: prepared statements" + +--connection node_1_u +prepare upd from 'update user set j = j + 1 WHERE id > 0'; + +--connection node_1_i +prepare ins1 from 'insert into user_session(id,fk1,fk2) values (2, 2, 2)'; + +--connection node_2_i +prepare ins2 from 'insert into user_session(id,fk1,fk2) values (2, 2, 3)'; + +--connection node_1 +let $counter=10; +let $sleep_period=1; + +while($counter > 0) +{ + --connection node_1_u + begin; + execute upd; + #update user set j = j + 1 WHERE id > 0; + + --connection node_1_i + set debug_sync='lock_wait_suspend_thread_enter SIGNAL ins_waiting WAIT_FOR cont_ins'; + send execute ins1; + + --connection node_1 + set debug_sync='now WAIT_FOR ins_waiting'; + + --connection node_2_i + execute ins2; + + --connection node_1 + set debug_sync='now SIGNAL cont_ins'; + + --connection node_1_i + --error 0,ER_LOCK_DEADLOCK,ER_DUP_ENTRY + reap; + + --connection node_1_u + --error 0,ER_LOCK_DEADLOCK + commit; + + --connection node_1 + + --error 0,ER_LOCK_DEADLOCK + truncate user_session; + set debug_sync = reset; + + dec $counter; +} + + +--connection node_1 + +drop table user_session,user; diff --git a/mysql-test/suite/galera/t/galera_UK_conflict.test b/mysql-test/suite/galera/t/galera_UK_conflict.test new file mode 100644 index 00000000..9978ba9b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_UK_conflict.test @@ -0,0 +1,276 @@ +# +# This test tests the operation of transaction replay with a scenario +# where two subsequent write sets being applied conflict with local transaction +# in commit phase. The conflict is "false positive" confict on GAP lock in +# secondary unique index. +# The first applier will cause BF abort for the local committer, which +# starts replaying because of positive certification. +# In buggy version, the test scenario continues so that while the local transaction +# is replaying, the latter applier experiences similar UK GAP lock conflict +# and forces the replayer to abort second time. +# In fixed version, this latter replayer BF abort should not happen. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + + +--let $expected_wsrep_local_replays = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 int, f3 int, unique key keyj (f2)); +INSERT INTO t1 VALUES (1, 1, 0); +INSERT INTO t1 VALUES (3, 3, 0); +INSERT INTO t1 VALUES (10, 10, 0); + +# we will need 2 appliers threads for applyin two writes ets in parallel in node1 +# and 1 applier thread for handling replaying +SET GLOBAL wsrep_slave_threads = 3; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; + +--connection node_1 +# starting a transaction, which deletes and inserts the middle row in test table +# this will be victim of false positive conflict with appliers +SET SESSION wsrep_sync_wait=0; +START TRANSACTION; + +DELETE FROM t1 WHERE f2 = 3; +INSERT INTO t1 VALUES (3, 3, 1); + +# Control connection to manage sync points for appliers +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait=0; + +# send from node 2 first an INSERT transaction, which will conflict on GAP lock in node 1 +--connection node_2 +INSERT INTO t1 VALUES (5, 5, 2); + +--connection node_1a +# wait to see the INSERT in apply_cb sync point +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +# first applier seen in wait point, set sync point for the second INSERT +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +# send second insert into same GAP in test table +INSERT INTO t1 VALUES (4, 4, 2); + +--connection node_1a +# wait for the second insert to arrive in his sync point +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# both appliers are now waiting in separate sync points + +# Block the local commit, send the COMMIT and wait until it gets blocked +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a +# wait for the local commit to enter in commit monitor wait state +--let $galera_sync_point = apply_monitor_slave_enter_sync commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# release the local transaction to continue with commit +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +# and now release the first applier, it should force local trx to abort +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET GLOBAL debug_dbug = NULL; +SET debug_sync='RESET'; + +# wait for BF abort to happen and replaying begin +--let $wait_condition = SELECT VARIABLE_VALUE= $expected_wsrep_local_replays FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'; +--let $wait_condition_on_error_output= SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'; +--source include/wait_condition_with_debug.inc + +# set another sync point for second applier +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; + +# letting the second appier to move forward +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +# waiting until second applier is in wait state +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +# stopping second applier before commit +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc +--source include/galera_clear_sync_point.inc + +# releasing the second insert, with buggy version it will conflict with +# replayer +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET GLOBAL debug_dbug = NULL; +SET debug_sync='RESET'; + +# with fixed version, second applier has reached comit monitor, and we can +# release it to complete +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +# local commit should succeed +--connection node_1 +--reap + +SELECT * FROM t1; + +# returning original slave thread count +SET GLOBAL wsrep_slave_threads = DEFAULT; + +--connection node_2 +SELECT * FROM t1; + +# replicate some transactions, so that wsrep slave thread count can reach +# original state in node 1 +INSERT INTO t1 VALUES (7,7,7); +INSERT INTO t1 VALUES (8,8,8); + +DROP TABLE t1; + +################################################################################## +# test scenario 2 +# +# commit order is now: INSERT-1, local COMMIT, INSERT-2 +# while local trx is replaying, the latter applier has applied and is waiting +# for commit. +# The point in this scenario is to verify that replayer does not try to abort +# the latter applier +################################################################################# + +--echo test scenario 2 + +--connection node_1 +--let $expected_wsrep_local_replays = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 int, f3 int, unique key keyj (f2)); +INSERT INTO t1 VALUES (1, 1, 0); +INSERT INTO t1 VALUES (3, 3, 0); +INSERT INTO t1 VALUES (10, 10, 0); + +# we will need 2 appliers threads for applyin two writes sets in parallel in node1 +# and 1 applier thread for handling replaying +SET GLOBAL wsrep_slave_threads = 3; + +# set sync point for the first INSERT applier +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +# starting a transaction, which deletes and inserts the middle row in test table +# this will be victim of false positive conflict with appliers +SET SESSION wsrep_sync_wait=0; +START TRANSACTION; + +DELETE FROM t1 WHERE f2 = 3; +INSERT INTO t1 VALUES (3, 3, 1); + +# Control connection to manage sync points for appliers +--connection node_1a +SET SESSION wsrep_sync_wait=0; + +# send from node 2 first an INSERT transaction, which will conflict on GAP lock in node 1 +--connection node_2 +INSERT INTO t1 VALUES (5, 5, 2); + +--connection node_1a +# wait to see the INSERT in apply_cb sync point +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Block the local commit, send the COMMIT and wait until it gets blocked +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a +# wait for the local commit to enter in commit monitor wait state +--let $galera_sync_point = apply_monitor_slave_enter_sync commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# set sync point before replaying +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_replay_cb"; + +# release the local transaction to continue with commit +# it should advance and end up waiting in commit monitor for his turn +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +# and now release the first applier, it should force local trx to abort +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +# wait for BF abort to happen and replaying begin +--let $wait_condition = SELECT VARIABLE_VALUE= $expected_wsrep_local_replays FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'; +--let $wait_condition_on_error_output= SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'; +--source include/wait_condition_with_debug.inc + +# replayer should now be in stopped in sync point +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_replay_cb_reached"; + +# set sync point for the second INSERT +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +# send second insert into same GAP in test table +INSERT INTO t1 VALUES (4, 4, 2); + +--connection node_1a +# wait for the second applier to enter in commit monitor wait state +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# and, letting the second appier to move forward, it will stop naturally +# to wait for commit order after replayer's commit +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +# and now release the replayer, if all is good,it will commit before the second applier +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_replay_cb"; +SET GLOBAL debug_dbug = NULL; +SET debug_sync='RESET'; + +# local commit should succeed +--connection node_1 +--reap + +--let $wait_condition = SELECT COUNT(*)=5 FROM t1; +--source include/wait_condition.inc + +# returning original slave thread count +SET GLOBAL wsrep_slave_threads = DEFAULT; + +--connection node_2 +SELECT * FROM t1; + +# replicate some transactions, so that wsrep slave thread count can reach +# original state in node 1 +INSERT INTO t1 VALUES (7,7,7); +INSERT INTO t1 VALUES (8,8,8); + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_admin.test b/mysql-test/suite/galera/t/galera_admin.test new file mode 100644 index 00000000..e3c43256 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_admin.test @@ -0,0 +1,86 @@ +# +# Test that various admin commands from sql_admin.cc +# Currently, REPAIR, OPTIMIZE and ANALYZE are tested. +# Jira: PXC-390 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +DROP TABLE IF EXISTS x1, x2; +--enable_warnings + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +CREATE TABLE t2 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER); +SET GLOBAL wsrep_replicate_myisam = TRUE; +CREATE TABLE x1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE x2 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO x1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO t2 (f2) SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4; +INSERT INTO x2 (f2) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); + +# Wait until all the data from t2 has been replicated +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 10 FROM x1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 10 FROM x2; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 10 FROM t1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 10000 FROM t2; +--source include/wait_condition.inc + + +--echo # ANALYZE test +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_1 +ANALYZE TABLE t1, t2; + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = $wsrep_last_committed_before + 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--source include/wait_condition.inc + + + +--echo # OPTIMIZE test +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_1 +OPTIMIZE TABLE t1, t2; + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE >= $wsrep_last_committed_before + 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--source include/wait_condition.inc + + + +--echo # REPAIR test +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_1 +REPAIR TABLE x1, x2; + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE >= $wsrep_last_committed_before + 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--source include/wait_condition.inc + + + +--connection node_2 +SELECT COUNT(*) = 10 FROM t1; +SELECT COUNT(*) = 10 FROM x1; +SELECT COUNT(*) = 10000 FROM t2; +SELECT COUNT(*) = 10 FROM x2; + +--connection node_1 +DROP TABLE t1, t2; +DROP TABLE x1, x2; +SET GLOBAL wsrep_replicate_myisam = FALSE; diff --git a/mysql-test/suite/galera/t/galera_alter_engine_innodb.test b/mysql-test/suite/galera/t/galera_alter_engine_innodb.test new file mode 100644 index 00000000..bc914a38 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_alter_engine_innodb.test @@ -0,0 +1,17 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test ALTER ENGINE from InnoDB to InnoDB +# + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +ALTER TABLE t1 ENGINE=InnoDB; + +--connection node_2 +SELECT ENGINE = 'InnoDB' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_alter_engine_myisam.test b/mysql-test/suite/galera/t/galera_alter_engine_myisam.test new file mode 100644 index 00000000..6d41d276 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_alter_engine_myisam.test @@ -0,0 +1,25 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test ALTER ENGINE from MyISAM to InnoDB under wsrep_replicate_myisam +# + +--let $wsrep_replicate_myisam_orig = `SELECT @@wsrep_replicate_myisam` +SET GLOBAL wsrep_replicate_myisam = TRUE; + +CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1); + +ALTER TABLE t1 ENGINE=InnoDB; + +--connection node_2 +SELECT ENGINE = 'InnoDB' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +--disable_query_log +--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_alter_table_force.test b/mysql-test/suite/galera/t/galera_alter_table_force.test new file mode 100644 index 00000000..1fcc9d4b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_alter_table_force.test @@ -0,0 +1,17 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test ALTER TABLE FORCE, a 5.6.3 feature that simply rebuilds the table +# + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +ALTER TABLE t1 FORCE; + +--connection node_2 +SELECT ENGINE = 'InnoDB' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test new file mode 100644 index 00000000..97819384 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table.test @@ -0,0 +1,34 @@ +# +# Test that applying plays well with FLUSH TABLE table_name WITH READ LOCK. The applier +# thread should block until UNLOCK TABLEs. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +FLUSH TABLE t1 WITH READ LOCK; + +--connection node_2 +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = 15; +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt new file mode 100644 index 00000000..6f688b39 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter-master.opt @@ -0,0 +1 @@ +--lock_wait_timeout=5 --innodb_lock_wait_timeout=5 --wait_timeout=60 diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.cnf b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.cnf new file mode 100644 index 00000000..4d93a1b2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +lock_wait_timeout=5 +innodb_lock_wait_timeout=5 +wait_timeout=5 + +[mysqld.2] +lock_wait_timeout=5 +innodb_lock_wait_timeout=5 +wait_timeout=5 + + + diff --git a/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test new file mode 100644 index 00000000..67f2108d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_applier_ftwrl_table_alter.test @@ -0,0 +1,37 @@ +# +# Test that applying a DDL plays well with FLUSH TABLE table_name WITH READ LOCK. The applier +# thread should block until UNLOCK TABLEs. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; + +# Those values are valid only for connection node_1. The global values from the -master.opt file apply to applier threads. +SET SESSION lock_wait_timeout = 60; +SET SESSION innodb_lock_wait_timeout=60; +SET SESSION wait_timeout=60; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +FLUSH TABLE t1 WITH READ LOCK; + +--connection node_2 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1 +SELECT 1 FROM DUAL; +# Sleep for longer than the global timeout ... +--sleep 6 +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; + +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = 15; + +SHOW CREATE TABLE t1; +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_as_master.cnf b/mysql-test/suite/galera/t/galera_as_master.cnf new file mode 100644 index 00000000..52fd3093 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_master.cnf @@ -0,0 +1 @@ +!include ../galera_2nodes_as_master.cnf diff --git a/mysql-test/suite/galera/t/galera_as_master.test b/mysql-test/suite/galera/t/galera_as_master.test new file mode 100644 index 00000000..1c439fff --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_master.test @@ -0,0 +1,69 @@ +# +# Test Galera as a master to a MySQL slave +# +# The galera/galera_2node_master.cnf describes the setup of the nodes +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_1; +--enable_query_log +START SLAVE; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); + +--echo # Disable binary logging for current session +SET SQL_LOG_BIN=OFF; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t2 VALUES(1); +INSERT INTO t1 VALUES(2); +CREATE TABLE test.t3 AS SELECT * from t1; + +SET SQL_LOG_BIN=ON; +INSERT INTO t1 VALUES(3); +CREATE TABLE test.t4 AS SELECT * from t1; + +--connection node_2 +SELECT * FROM t1; +SELECT * FROM t2; +SELECT * FROM t3; +SELECT * FROM t4; + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 2 FROM t1; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 3 FROM t4; +--source include/wait_condition.inc + +SHOW TABLES; + +SELECT * FROM t1; +SELECT * FROM t4; + +--echo # Cleanup +--connection node_1 +DROP TABLE t1, t4; +SET SQL_LOG_BIN=OFF; +DROP TABLE t2, t3; + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't4'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +CALL mtr.add_suppression('You need to use --log-bin to make --binlog-format work'); + +--connection node_1 +set global wsrep_on=OFF; +RESET MASTER; +set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/t/galera_as_master_large.cnf b/mysql-test/suite/galera/t/galera_as_master_large.cnf new file mode 100644 index 00000000..bd8f3819 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_master_large.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes_as_master.cnf + +[mysqld.1] +binlog-cache-size=8192 diff --git a/mysql-test/suite/galera/t/galera_as_master_large.test b/mysql-test/suite/galera/t/galera_as_master_large.test new file mode 100644 index 00000000..fa343cd9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_master_large.test @@ -0,0 +1,46 @@ +--echo # +--echo # MDEV-9044 : Getting binlog corruption on my Galera cluster (10.1.8) +--echo # making it impossible to async slave. +--echo # + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_1; +--enable_query_log +START SLAVE; + +--connection node_1 + +SELECT @@GLOBAL.BINLOG_CACHE_SIZE; +CREATE TABLE t1 (c1 INTEGER PRIMARY KEY, c2 VARCHAR(12000)) ENGINE=INNODB; +CREATE TABLE t2 (c1 INTEGER PRIMARY KEY) ENGINE=INNODB; + +START TRANSACTION; +INSERT INTO t1 VALUES(1, REPEAT('-', 10000)); +COMMIT; +INSERT INTO t2 VALUES(1); +save_master_pos; + +--connection node_2 +SELECT c1, LENGTH(c2) FROM t1; +SELECT * FROM t2; + +--connection node_3 +sync_with_master; + +SELECT c1, LENGTH(c2) FROM t1; +SELECT * FROM t2; + +--echo # Cleanup +--connection node_1 +DROP TABLE t1, t2; +save_master_pos; + +--connection node_3 +sync_with_master; + +STOP SLAVE; +RESET SLAVE ALL; diff --git a/mysql-test/suite/galera/t/galera_as_slave.cnf b/mysql-test/suite/galera/t/galera_as_slave.cnf new file mode 100644 index 00000000..9449ec9c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave.cnf @@ -0,0 +1 @@ +!include ../galera_2nodes_as_slave.cnf diff --git a/mysql-test/suite/galera/t/galera_as_slave.test b/mysql-test/suite/galera/t/galera_as_slave.test new file mode 100644 index 00000000..da92437b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave.test @@ -0,0 +1,51 @@ +# +# Test Galera as a slave to a MySQL master +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +INSERT INTO t1 VALUES (2); + +--connection node_1 +SELECT COUNT(*) = 2 FROM t1; +INSERT INTO t1 VALUES (3); + +--connection node_2 +SELECT COUNT(*) = 3 FROM t1; + +--connection node_3 +DROP TABLE t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +--connection node_3 +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_as_slave_autoinc.cnf b/mysql-test/suite/galera/t/galera_as_slave_autoinc.cnf new file mode 100644 index 00000000..9449ec9c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_autoinc.cnf @@ -0,0 +1 @@ +!include ../galera_2nodes_as_slave.cnf diff --git a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test new file mode 100644 index 00000000..e0c8bf29 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test @@ -0,0 +1,83 @@ +# +# Test Galera as a slave to a MySQL master +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 + +## +## Verify the correct operation of the auto-increment when +## the binlog format set to the 'STATEMENT' on the master node: +## + +SET SESSION binlog_format='STATEMENT'; + +CREATE TABLE t1 ( + i int(11) NOT NULL AUTO_INCREMENT, + c char(32) DEFAULT 'dummy_text', + PRIMARY KEY (i) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +insert into t1(i) values(null); + +select * from t1; + +insert into t1(i) values(null), (null), (null); + +select * from t1; + +SET SESSION auto_increment_increment=7; +insert into t1(i) values(null), (null), (null); + +SET SESSION auto_increment_offset=5; +insert into t1(i) values(null), (null), (null); + +select * from t1; + +show variables like 'binlog_format'; +show variables like 'auto_increment_increment'; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 10 FROM t1; +--source include/wait_condition.inc + +select * from t1; + +show variables like 'binlog_format'; +show variables like 'auto_increment_increment'; + +--connection node_1 +select * from t1; + +show variables like 'binlog_format'; +show variables like 'auto_increment_increment'; + +--connection node_3 +DROP TABLE t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +--connection node_3 +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_as_slave_ctas.cnf b/mysql-test/suite/galera/t/galera_as_slave_ctas.cnf new file mode 100644 index 00000000..eab2a6de --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_ctas.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes_as_slave.cnf + +# make sure master server uses ROW format for replication +[mysqld] +binlog-format=row diff --git a/mysql-test/suite/galera/t/galera_as_slave_ctas.test b/mysql-test/suite/galera/t/galera_as_slave_ctas.test new file mode 100644 index 00000000..eced636c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_ctas.test @@ -0,0 +1,74 @@ +# +# Test Galera as a slave to a MySQL master +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# also, for this test, master server must have binlog_format=ROW +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc +--source include/galera_cluster.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +SELECT @@wsrep_on; + +--connection node_1 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +# make sure master server has binlog_format=ROW +--connection node_3 +SHOW VARIABLES LIKE 'binlog_format'; + +# +# test phase one, issue CTAS with empty source table +# + +CREATE TABLE source (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +CREATE TABLE target AS SELECT * FROM source; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'target'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'target'; +--source include/wait_condition.inc + +# +# test phase two, issue CTAS with populated source table +# +--connection node_3 +DROP TABLE target; +INSERT INTO source VALUES(1); + +CREATE TABLE target AS SELECT * FROM source; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM target; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM target; +--source include/wait_condition.inc + +--connection node_3 +DROP TABLE source; +DROP TABLE target; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'target'; +--source include/wait_condition.inc + +--connection node_1 +STOP SLAVE; +RESET SLAVE ALL; + +--connection node_3 +RESET MASTER; + diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid.cnf b/mysql-test/suite/galera/t/galera_as_slave_gtid.cnf new file mode 100644 index 00000000..01d2eb12 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid.cnf @@ -0,0 +1,6 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid.inc b/mysql-test/suite/galera/t/galera_as_slave_gtid.inc new file mode 100644 index 00000000..ca6cce52 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid.inc @@ -0,0 +1,94 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# suite/galera/t/galera_as_slave_gtid.cnf has the GTID options +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc +--source include/galera_cluster.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); + +SELECT LENGTH(@@global.gtid_binlog_state) > 1; +--let $gtid_binlog_state_node1 = `SELECT @@global.gtid_binlog_state;` + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +--disable_query_log + +--eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; +#--eval SELECT GTID_SUBSET('$gtid_executed_node1', @@global.gtid_executed) AS gtid_executed_equal; + +--enable_query_log + +--connection node_1 +SELECT COUNT(*) = 1 FROM t1; + +--disable_query_log +--eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; +#--eval SELECT GTID_SUBSET('$gtid_executed_node1', @@global.gtid_executed) AS gtid_executed_equal; +--enable_query_log + +--connection node_3 +DROP TABLE t1; + +# +# Unfortunately without the sleep below the following statement fails with "query returned no rows", which +# is difficult to understand given that it is an aggregate query. A "query execution was interrupted" +# warning is also reported by MTR, which is also weird. +# + +--sleep 1 + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +--echo #cleanup +--connection node_1 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--connection node_2 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--connection node_3 +reset master; diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid.test b/mysql-test/suite/galera/t/galera_as_slave_gtid.test new file mode 100644 index 00000000..c5f45031 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid.test @@ -0,0 +1,10 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# suite/galera/t/galera_as_slave_gtid.cnf has the GTID options +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source galera_as_slave_gtid.inc diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.cnf b/mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.cnf new file mode 100644 index 00000000..efabe416 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.cnf @@ -0,0 +1,8 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW + +gtid_pos_auto_engines=InnoDB diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.test b/mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.test new file mode 100644 index 00000000..5ef98573 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid_auto_engine.test @@ -0,0 +1,14 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# suite/galera/t/galera_as_slave_gtid.cnf has the GTID options +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source galera_as_slave_gtid.inc + +--connection node_2 +DROP TABLE mysql.gtid_slave_pos_InnoDB; +CALL mtr.add_suppression("The automatically created table"); diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.cnf b/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.cnf new file mode 100644 index 00000000..01d2eb12 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.cnf @@ -0,0 +1,6 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test b/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test new file mode 100644 index 00000000..8787f864 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test @@ -0,0 +1,90 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# suite/galera/t/galera_as_slave_gtid.cnf has the GTID options +# +# This test will replicate writes to MyISAM table and check that slave node is able +# to apply them. +# mysql.gtid_slave_pos table should be defined as innodb engine, original problem +# by writes to mysql.gtid_slave_pos, whereas the replicated transaction contained +# no innodb writes +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc +--source include/galera_cluster.inc +SELECT @@WSREP_ON; + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +SELECT @@wsrep_on; + +--connection node_1 +# make sure gtid_slave_pos is of innodb engine, mtr does not currently provide that +ALTER TABLE mysql.gtid_slave_pos engine = InnoDB; + +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=MyISAM; +INSERT INTO t1 VALUES(1); + +SELECT LENGTH(@@global.gtid_binlog_state) > 1; +--let $gtid_binlog_state_node1 = `SELECT @@global.gtid_binlog_state;` + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +--disable_query_log +--eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; +--enable_query_log + +--connection node_2 +SELECT COUNT(*) AS EXPECT_0 FROM t1; + +--disable_query_log +--eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; +--enable_query_log + +--echo #cleanup +--connection node_3 +DROP TABLE t1; + +--sleep 1 + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +RESET MASTER; + +--connection node_1 +STOP SLAVE; +RESET SLAVE ALL; +SET GLOBAL WSREP_ON=OFF; +reset master; +SET GLOBAL WSREP_ON=ON; + +--connection node_2 +SET GLOBAL WSREP_ON=OFF; +reset master; +SET GLOBAL WSREP_ON=ON; + +--connection node_3 +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_as_slave_gtid_replicate_do_db_cc.cnf b/mysql-test/suite/galera/t/galera_as_slave_gtid_replicate_do_db_cc.cnf new file mode 100644 index 00000000..edd063b6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_gtid_replicate_do_db_cc.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW + +[mysqld.1] +replicate-do-db=test1 +replicate-wild-do-table=test1.% + +[mysqld.2] +replicate-do-db=test1 +replicate-wild-do-table=test1.% diff --git a/mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf b/mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf new file mode 100644 index 00000000..5a44e566 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_nonprim.cnf @@ -0,0 +1 @@ +!include ../galera_3nodes_as_slave.cnf diff --git a/mysql-test/suite/galera/t/galera_as_slave_nonprim.test b/mysql-test/suite/galera/t/galera_as_slave_nonprim.test new file mode 100644 index 00000000..0d878db2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_nonprim.test @@ -0,0 +1,95 @@ +# +# Test the behavior of a Galera async slave if it goes non-prim. Async replication +# should abort with an error but it should be possible to restart it. +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# + +--source include/have_innodb.inc +--source include/big_test.inc +--source include/galera_cluster.inc + +# Step #1. Establish replication +# +# As node 4 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_4 connection here +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 + + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_4, MASTER_USER='root'; +--enable_query_log +START SLAVE; +SET SESSION wsrep_sync_wait = 0; + +--connection node_4 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +--sleep 1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +# Step #2. Force async slave to go non-primary + +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; + +--connection node_1 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Step #3. Force async replication to fail by creating a replication event while the slave is non-prim + +--connection node_4 +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); + +--connection node_2 +--sleep 5 + +--let $value = query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1) +--connection node_1 +--disable_query_log +--eval SELECT "$value" IN ("Error 'Unknown command' on query. Default database: 'test'. Query: 'BEGIN'", "Node has dropped from cluster") AS expected_error +--enable_query_log + +# Step #4. Bring back the async slave and restart replication +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; + +--connection node_1 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connection node_2 +--source include/wait_until_ready.inc +--source include/wait_until_connected_again.inc + +START SLAVE; + +# Confirm that the replication events have arrived + +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1; +--source include/wait_condition.inc + +--connection node_4 +DROP TABLE t1; + +--sleep 2 +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +STOP SLAVE; +RESET SLAVE ALL; + +CALL mtr.add_suppression("Slave SQL: Error 'Unknown command' on query"); +CALL mtr.add_suppression("Slave: Unknown command Error_code: 1047"); +CALL mtr.add_suppression("Transport endpoint is not connected"); +CALL mtr.add_suppression("Slave SQL: Error in Xid_log_event: Commit could not be completed, 'Deadlock found when trying to get lock; try restarting transaction', Error_code: 1213"); +CALL mtr.add_suppression("Slave SQL: Node has dropped from cluster, Error_code: 1047"); + +--connection node_4 +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_as_slave_replay.cnf b/mysql-test/suite/galera/t/galera_as_slave_replay.cnf new file mode 100644 index 00000000..b1f9d7e9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_replay.cnf @@ -0,0 +1,11 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +binlog-format=row + +[mysqld.1] +wsrep_restart_slave=1 + +[mysqld.2] +wsrep_restart_slave=1 + diff --git a/mysql-test/suite/galera/t/galera_as_slave_replay.test b/mysql-test/suite/galera/t/galera_as_slave_replay.test new file mode 100644 index 00000000..47f70bda --- /dev/null +++ b/mysql-test/suite/galera/t/galera_as_slave_replay.test @@ -0,0 +1,200 @@ +# +# This test tests the operation of transaction replay for async replication slave. +# If a potentially conflicting galera transaction arrives at +# just the right time during the commit and has lock conflict with async replication transaction +# applied by slave SQL thread, then the async replication transaction should either abort +# or rollback and replay (depending on the nature of lock conflict). +# + +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 + +--connection node_2a +--source include/galera_cluster.inc +#--source suite/galera/include/galera_have_debug_sync.inc + +# +# node 3 is native MariaDB server operating as async replication master +# +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +RESET MASTER; + +--connection node_2a +# +# count the number of wsrep replay's done in the node +# +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + + +# +# nodes 1 and 2 form a galera cluster, node 2 operates as slave for native MariaDB naster in node 3 +# +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (3, 'a'); + +# +# use statement format replication to cause a false positive conflict with async replication transaction +# and galera replication. The conflict will be on GAP lock, and slave SQL thread should rollback +# and replay +# +set binlog_format=STATEMENT; + +SET AUTOCOMMIT=ON; +START TRANSACTION; + +SELECT * FROM t1 FOR UPDATE; +UPDATE t1 SET f2 = 'c' WHERE f1 > 1; + +--connection node_2a +# wait for create table and inserts to be replicated from master +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1; +--source include/wait_condition.inc + +# wait for create table and inserts to be replicated in cluster +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1; +--source include/wait_condition.inc + +--connection node_2a +# Block the future commit of async replication +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +# block also the applier before applying begins +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +# +# now inject a conflicting insert from node 3, it will replicate with +# earlier seqno (than async transaction) and pause before applying in node 2 +# +--connection node_1 +INSERT INTO test.t1 VALUES (2, 'b'); + +# +# send the update from master, this will succeed here, beceuase of async replication. +# async replication will apply this in node 2 and pause before commit phase, +--connection node_3 +--error 0 +COMMIT; + +# Wait until async slave commit is blocked in node_2 +--connection node_2a +--source include/galera_wait_sync_point.inc + +# +# release the applier +# note: have to clear wsrep_apply_cb sync point first, as async replication will go for replay +# and as this sync point, after BF applier is released to progress +# +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +# Unblock the async slave commit +--connection node_2a +--source include/galera_clear_sync_point.inc +--source include/galera_signal_sync_point.inc + +--connection node_3 + +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; +SELECT * FROM t1; + +--connection node_2a + +# wsrep_local_replays has increased by 1 +set session wsrep_sync_wait=15; +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +set session wsrep_sync_wait=0; + +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; +--enable_query_log + +# +# replaying of async transaction should be effective, and row 3 having 'c' in f2 +# +SELECT * FROM t1; +SET DEBUG_SYNC = "RESET"; + +#******************************************************************************** +# test phase 2 +#******************************************************************************** + +--echo # +--echo # test phase with real abort +--echo # + +--connection node_3 + +set binlog_format=ROW; + +insert into t1 values (4, 'd'); + +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = 'd' WHERE f1 = 3; + +--connection node_2a +# wait for the last insert to be replicated from master +--let $wait_condition = SELECT COUNT(*) = 4 FROM test.t1; +--source include/wait_condition.inc + +# Block the commit +--let $galera_sync_point = commit_monitor_enter_sync +--source include/galera_set_sync_point.inc + +# block applier +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +# Inject a conflicting update from node 3 +--connection node_1 +UPDATE test.t1 SET f2 = 'e' WHERE f1 = 3; + +# send the update from master +--connection node_3 +--error 0 +COMMIT; + +--connection node_2a + +# release the applier +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + + +# Unblock the async slave commit +--connection node_2a +--source include/galera_clear_sync_point.inc +--source include/galera_signal_sync_point.inc +SET DEBUG_SYNC = "RESET"; + +--connection node_2a + +set session wsrep_sync_wait=15; +SELECT COUNT(*) = 1 FROM test.t1 WHERE f2 = 'e'; +set session wsrep_sync_wait=0; + +STOP SLAVE; +RESET SLAVE; + +DROP TABLE t1; + +--connection node_3 +DROP TABLE t1; +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.cnf b/mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.cnf new file mode 100644 index 00000000..cddb8e0e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.cnf @@ -0,0 +1,11 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=10M;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=10M;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.test b/mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.test new file mode 100644 index 00000000..ff8bdc9c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_mariabackup.test @@ -0,0 +1,71 @@ +# +# Test that autoincrement works correctly while the cluster membership +# is changing and SST takes place. +# +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_mariabackup.inc +--source include/force_restart.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); + +# Kill and restart node #2 +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--source include/kill_galera.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--connection node_1 +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); + +--connection node_2a +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); +INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SELECT COUNT(*) FROM t1; + +--connection node_2a +SELECT COUNT(*) FROM t1; + +--connection node_1 +DROP TABLE t1; + +CALL mtr.add_suppression("gcs_caused\\(\\) returned -1 \\(Operation not permitted\\)"); +CALL mtr.add_suppression("WSREP: Action message in non-primary configuration from member 0"); + +--let $node_1=node_1a +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +--disconnect node_1a +--disconnect node_2a diff --git a/mysql-test/suite/galera/t/galera_backup_stage.test b/mysql-test/suite/galera/t/galera_backup_stage.test new file mode 100644 index 00000000..31d76816 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_backup_stage.test @@ -0,0 +1,120 @@ +# +# Check that BACKUP STAGE BLOCK_DDL desyncs and pauses the node until BACKUP STAGE END: +# - Local DDLs will fail immediately +# - Local DMLs will block until resync +# - Remote txns will be applied after resync (STAGE END). +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_metadata_lock_info.inc + +--connection node_1 +CREATE TABLE t1 (f1 varchar(10)) ENGINE=InnoDB; + +# First, check that BACKUP STAGE END skipping desyncing stages is fine +BACKUP STAGE START; +BACKUP STAGE FLUSH; +BACKUP STAGE END; + +BACKUP STAGE START; +BACKUP STAGE FLUSH; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait=0; +SET SESSION wsrep_retry_autocommit=0; +INSERT INTO t1 (f1) values ("node1_1"); +ALTER TABLE t1 ADD COLUMN (f2 int(10)); + +--connection node_2 +INSERT INTO t1 (f1) values ("node2_1"); +ALTER TABLE t1 ADD COLUMN (f3 int(10)); + +# BLOCK_DDL desyncs and pauses the node +--connection node_1 +BACKUP STAGE BLOCK_DDL; + +--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1c +SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT variable_value="Donor/Desynced" FROM information_schema.global_status WHERE variable_name="wsrep_local_state_comment" +--source include/wait_condition.inc + +--connection node_2 +INSERT INTO t1 (f1) values("node2_2"); +ALTER TABLE t1 ADD COLUMN (f5 int(10)); + +--connection node_1a +--error ER_UNKNOWN_COM_ERROR +ALTER TABLE t1 ADD COLUMN (f4 int(10)); +--let $insert_id = `SELECT CONNECTION_ID()` +--send INSERT INTO t1 (f1) values("node1a"); + +# the insert will block during commit inside the provider, in certify. We can't +# check for sure it is blocked there, so we wait for the thread to at least +# reach commit stage. In the unlikely case the interleaving is different, the +# result of the test should not change. +--connection node_1c +--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE State='Commit' AND ID=$insert_id +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id +--source include/wait_condition.inc + +--connection node_1 +BACKUP STAGE BLOCK_COMMIT; + +# node only resumes/resyncs upon STAGE END +--connection node_1c +SELECT variable_value="Donor/Desynced" FROM information_schema.global_status WHERE variable_name="wsrep_local_state_comment"; + +--connection node_2 +INSERT INTO t1 (f1) values("node2_3"); +ALTER TABLE t1 ADD COLUMN (f6 int(10)); + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +SET SESSION wsrep_sync_wait=0; +SET SESSION wsrep_retry_autocommit=0; +--error ER_UNKNOWN_COM_ERROR +ALTER TABLE t1 ADD COLUMN (f4 int(10)); +--let $insert_id = `SELECT CONNECTION_ID()` +--send INSERT INTO t1 (f1) values("node1b"); + +# wait for insert to get blocked +--connection node_1c +--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE State='Commit' AND ID=$insert_id +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*)=2 FROM information_schema.processlist WHERE Info like 'INSERT INTO t1 (f1) values("node1%")' AND State = 'Commit' +--source include/wait_condition.inc + +# nothing after BLOCK_DDL is applied +SELECT COUNT(*)=2 FROM t1; +SELECT COUNT(*)=3 FROM information_schema.columns WHERE table_name = 't1'; + +# STAGE END resumes and resyncs the node +--connection node_1 +BACKUP STAGE END; + +# Upon resume, blocked inserts will continue but conflict with the applying alters +--connection node_1a +--error ER_LOCK_DEADLOCK +--reap +--connection node_1b +--error ER_LOCK_DEADLOCK +--reap + +--connection node_1 +SELECT COUNT(*)=4 FROM t1; +SELECT COUNT(*)=5 FROM information_schema.columns WHERE table_name = 't1'; + +--connection node_2 +SELECT COUNT(*)=4 FROM t1; +SELECT COUNT(*)=5 FROM information_schema.columns WHERE table_name = 't1'; + +--connection node_1 +DROP TABLE t1; +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); +call mtr.add_suppression("greater than drain seqno"); diff --git a/mysql-test/suite/galera/t/galera_bf_abort.test b/mysql-test/suite/galera/t/galera_bf_abort.test new file mode 100644 index 00000000..f3476fba --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort.test @@ -0,0 +1,34 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test a local transaction being aborted by a slave one +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(6)) ENGINE=InnoDB; +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 + +--connection node_2 +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'node_2'); + +--connection node_1 +INSERT INTO t1 VALUES (1,'node_1'); + +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'node_1' +--source include/wait_condition.inc + +--connection node_2 +--error ER_LOCK_DEADLOCK +INSERT INTO t1 VALUES (2, 'node_2'); + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_at_after_statement.test b/mysql-test/suite/galera/t/galera_bf_abort_at_after_statement.test new file mode 100644 index 00000000..b1fe3e64 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_at_after_statement.test @@ -0,0 +1,37 @@ +# +# This test checks that the client gets an error for a BF abort, +# specifically when it gets detected inside the wsrep_after_statement hook +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +--connection node_1 +CREATE TABLE t1 (id INT PRIMARY KEY, val INT); +INSERT INTO t1 VALUES (1, 1); + +--connection node_2 +START TRANSACTION; +SET DEBUG_SYNC = 'wsrep_after_statement_enter SIGNAL blocked WAIT_FOR continue'; +--send UPDATE t1 SET val=2 WHERE id=1 + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +SET DEBUG_SYNC = 'now WAIT_FOR blocked'; + +--connection node_1 +# cause BF abort on other node +UPDATE t1 SET val=3 WHERE id=1; + +--connection node_2a +SET DEBUG_SYNC = 'now SIGNAL continue'; + +--connection node_2 +# check we get BF aborted +--error ER_LOCK_DEADLOCK +--reap +COMMIT; +SET DEBUG_SYNC = 'RESET'; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test new file mode 100644 index 00000000..fde783e2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_flush_for_export.test @@ -0,0 +1,39 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test that a local FLUSH TABLES FOR EXPORT will NOT be broken by an incoming remote transaction against that table +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +FLUSH TABLES t1 FOR EXPORT; + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +UNLOCK TABLES; + +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +COMMIT; +SET AUTOCOMMIT=ON; +SET SESSION wsrep_sync_wait = 15; +SELECT COUNT(*) = 1 FROM t1; + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 0 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_for_update.test b/mysql-test/suite/galera/t/galera_bf_abort_for_update.test new file mode 100644 index 00000000..13e48f8f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_for_update.test @@ -0,0 +1,56 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test a local transaction being aborted by a slave one while it is running a SELECT FOR UPDATE +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1, 10); + +# Test updating the PK + +--connection node_1 +--let $wsrep_local_bf_aborts_before = `SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts'` +BEGIN; +SELECT * FROM t1 FOR UPDATE; + +--connection node_2 +UPDATE t1 SET f1 = 2; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--let $wait_condition = SELECT COUNT(*) FROM t1 WHERE f1 = 2 +--source include/wait_condition.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +--disable_query_log +--eval SELECT variable_value - $wsrep_local_bf_aborts_before AS wsrep_local_bf_aborts_diff FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts' +--enable_query_log + +# Test updating non-indexed column + +--connection node_1 +--let $wsrep_local_bf_aborts_before = `SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts'` +BEGIN; +SELECT * FROM t1 FOR UPDATE; + +--connection node_2 +UPDATE t1 SET f2 = 20; + +--connection node_1a +--let $wait_condition = SELECT COUNT(*) FROM t1 WHERE f2 = 20 +--source include/wait_condition.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +--disable_query_log +--eval SELECT variable_value - $wsrep_local_bf_aborts_before AS wsrep_local_bf_aborts_diff FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts' +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ftwrl.test b/mysql-test/suite/galera/t/galera_bf_abort_ftwrl.test new file mode 100644 index 00000000..44398e71 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_ftwrl.test @@ -0,0 +1,30 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# A local transaction running FLUSH TABLES WITH READ LOCK will not be aborted by a slave transaction +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +--send FLUSH TABLES WITH READ LOCK; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +--reap + +UNLOCK TABLES; + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +# No aborts should be registered on the counter +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 0 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test b/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test new file mode 100644 index 00000000..72fc1c5b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test a local transaction being aborted by a slave one while it is running a GET_LOCK() +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +SELECT GET_LOCK("foo", 1000); + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +INSERT INTO t1 VALUES (1); +--send SELECT GET_LOCK("foo", 1000); + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +# Check that wsrep_local_bf_aborts has been incremented by exactly 1 +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf new file mode 100644 index 00000000..612418c1 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +# We set repl.commit_order=1 in order to disable provider commit +# ordering. + +[mysqld.1] +log-bin +log-slave-updates +wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;repl.commit_order=1' + +[mysqld.2] + +log-bin +log-slave-updates +wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;repl.commit_order=1' \ No newline at end of file diff --git a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test new file mode 100644 index 00000000..a828701c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test @@ -0,0 +1,77 @@ +# +# This test uses galera_sr_bf_abort.inc to probe various BF abort points +# for SR transactions with wsrep provider commit ordering disabled. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/galera_have_debug_sync.inc + +# Control connection for manipulating sync points on node 1 +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait = 0; + +# SR bf abort on fragment +--let $wsrep_trx_fragment_size = 1 +--echo galera_sr_bf_abort_at_commit = 0 +--let $galera_sr_bf_abort_at_commit = 0 + +--echo after_replicate_sync +--let $galera_sr_bf_abort_sync_point = after_replicate_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo local_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo apply_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo commit_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +# SR bf abort on commit fragment +--let $wsrep_trx_fragment_size = 1 +--echo galera_sr_bf_abort_at_commit = 1 +--let $galera_sr_bf_abort_at_commit = 1 + +--echo after_replicate_sync +--let $galera_sr_bf_abort_sync_point = after_replicate_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo local_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo apply_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo commit_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync +--source suite/galera/t/galera_sr_bf_abort.inc + +# Normal bf abort on commit +--let $wsrep_trx_fragment_size = 0 +--echo galera_sr_bf_abort_at_commit = 1 +--let $galera_sr_bf_abort_at_commit = 1 + +--echo after_replicate_sync +--let $galera_sr_bf_abort_sync_point = after_replicate_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo local_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo apply_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +--echo commit_monitor_master_enter_sync +--let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync +--source ../../suite/galera_sr/t/galera_sr_bf_abort.inc + +CALL mtr.add_suppression("WSREP: fragment replication failed: 1"); diff --git a/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test b/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test new file mode 100644 index 00000000..4582f3f9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_lock_table.test @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test that a local LOCK TABLE will NOT be broken by an incoming remote transaction against that table +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +LOCK TABLE t1 WRITE; + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +UNLOCK TABLES; + +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +COMMIT; +SELECT COUNT(*) = 1 FROM t1; + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 0 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ps.cnf b/mysql-test/suite/galera/t/galera_bf_abort_ps.cnf new file mode 100644 index 00000000..34c1a8cc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_ps.cnf @@ -0,0 +1,3 @@ +!include ../galera_2nodes.cnf +[mysqltest] +ps-protocol \ No newline at end of file diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ps.test b/mysql-test/suite/galera/t/galera_bf_abort_ps.test new file mode 100644 index 00000000..d2dfb926 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_ps.test @@ -0,0 +1,34 @@ +# +# MDEV-24255 +# Test BF abort of a transaction that has ps-protocol enabled +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(6)) ENGINE=InnoDB; +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 + +--connection node_2 +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +START TRANSACTION; +INSERT INTO t1 VALUES (1,'node_2'); + +--connection node_1 +INSERT INTO t1 VALUES (1,'node_1'); + +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'node_1' +--source include/wait_condition.inc + +--connection node_2 +--error ER_LOCK_DEADLOCK +INSERT INTO t1 VALUES (2, 'node_2'); + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.cnf b/mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.cnf new file mode 100644 index 00000000..83baa995 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld] +thread-handling=pool-of-threads + +[mysqltest] +ps-protocol diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.test b/mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.test new file mode 100644 index 00000000..56348a6f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_ps_threadpool.test @@ -0,0 +1,54 @@ +# +# MDEV-24255 +# Test BF abort of a transaction that has ps-protocol enabled +# This test stresses the case where wsrep_before_command() +# finds the transaction in state s_must_abort. This only +# possible when the server is using the thread pool. +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(6)) ENGINE=InnoDB; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 + +--connection node_2 +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +START TRANSACTION; +INSERT INTO t1 VALUES (1,'node_2'); + +--connection node_2a +SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; + +--connection node_1 +INSERT INTO t1 VALUES (1,'node_1'); + +--connection node_2a +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--connection node_2 +SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL signal.wsrep_apply_cb WAIT_FOR bf_abort"; + +# +# The following INSERT is expected to enter +# wsrep_before_command() and find its transaction +# in state s_must_abort. +# Notice that the test appears more complicated +# than it needs to... however we cannot use +# --send for this INSERT, otherwise mysqltest +# will not use ps-protocol +# +--error ER_LOCK_DEADLOCK +INSERT INTO t1 VALUES (2, 'node_2'); + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = DEFAULT; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test b/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test new file mode 100644 index 00000000..c7af8375 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test @@ -0,0 +1,33 @@ +# +# This test verifies that the server can be shut down even if +# some of the wsrep transactions are in QUERY_COMMITTING state. +# In this case the shutdown sequence may do a BF abort for the +# connection. +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY); + +--connection node_2 +SET DEBUG_SYNC = 'wsrep_before_certification WAIT_FOR continue'; +--send INSERT INTO t1 VALUES (1) + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/restart_mysqld.inc + +# Restore original auto_increment_offset values. +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +--connection node_1 + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_abort_sleep.test b/mysql-test/suite/galera/t/galera_bf_abort_sleep.test new file mode 100644 index 00000000..8d135dc7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_abort_sleep.test @@ -0,0 +1,30 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test a local transaction being aborted by a slave one while it is running a SLEEP() +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +INSERT INTO t1 VALUES (1); +--send SELECT SLEEP(1000); + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +# Check that wsrep_local_bf_aborts has been incremented by exactly 1 +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_bf_background_statistics.cnf b/mysql-test/suite/galera/t/galera_bf_background_statistics.cnf new file mode 100644 index 00000000..4101b407 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_background_statistics.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +innodb_stats_persistent=ON + +[mysqld.2] +innodb_stats_persistent=ON + + diff --git a/mysql-test/suite/galera/t/galera_bf_background_statistics.test b/mysql-test/suite/galera/t/galera_bf_background_statistics.test new file mode 100644 index 00000000..a9a98b1b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_background_statistics.test @@ -0,0 +1,49 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test a local transaction being aborted by a slave one while it is running a SLEEP() +# + +SELECT @@innodb_stats_persistent; + +CREATE TABLE t1 (f1 INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, f2 INTEGER DEFAULT 1) ENGINE=InnoDB; +INSERT INTO t1(f1) values (NULL); +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +INSERT INTO t1(f1) select NULL from t1; +SELECT count(1) from t1; + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +INSERT INTO t1 VALUES (9999999,NULL); +--send SELECT SLEEP(1000); + +--connection node_1 +ALTER TABLE t1 CHANGE f2 f2 INTEGER NOT NULL DEFAULT 1; + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +# Check that wsrep_local_bf_aborts has been incremented by exactly 1 +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera_bf_kill.cnf b/mysql-test/suite/galera/t/galera_bf_kill.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/galera_bf_kill.test b/mysql-test/suite/galera/t/galera_bf_kill.test new file mode 100644 index 00000000..c8564bc9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill.test @@ -0,0 +1,141 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test case 1: Start a transaction on node_2a and kill it +# from other connection on same node +# + +--connection node_2 +CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB; +insert into t1 values (NULL,1); + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +begin; +update t1 set a = 5; + +--connection node_2 + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1 +--source include/wait_condition.inc + +--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1` + +--disable_query_log +--eval KILL $k_thread +--enable_query_log + +select * from t1; +--disconnect node_2a + +# +# Test case 2: Start a transaction on node_2a and use +# kill query from other connection on same node +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +begin; +update t1 set a =5; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1 +--source include/wait_condition.inc + +--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1` + +--disable_query_log +--eval KILL QUERY $k_thread +--enable_query_log + +select * from t1; +--disconnect node_2a +# +# Test case 3: Start a transaction on node_2a and start a DDL on other transaction +# that will then abort node_2a transaction +# +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +begin; +update t1 set a =5, b=2; + +--connection node_2 +ALTER TABLE t1 ADD UNIQUE KEY b1(b); +ALTER TABLE t1 DROP KEY b1; + +select * from t1; + +--disconnect node_2a + +# +# Test case 4: Start a transaction on node_2a and conflicting transaction on node_2b +# and start a DDL on other transaction that will then abort node_2a and node_2b +# transactions +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +begin; +update t1 set a =5, b=2; + +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2b +begin; +send update t1 set a =6, b=7; + +--connection node_2 +ALTER TABLE t1 ADD UNIQUE KEY b2(b); +ALTER TABLE t1 DROP KEY b2; + +select * from t1; + +--disconnect node_2a +--disconnect node_2b + +# +# Test case 5: Start a transaction on node_2a with wsrep disabled +# and start a DDL on other transaction that will then abort node_2a +# transactions +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +SET SESSION wsrep_on=OFF; +begin; +update t1 set a =5, b=2; + +--connection node_2 +ALTER TABLE t1 ADD UNIQUE KEY b3(b); + +select * from t1; + +--disconnect node_2a + +# +# Test case 6: Start a transaction on node_2a with wsrep disabled +# and kill it from other connection on same node +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +SET SESSION wsrep_on=OFF; +begin; +update t1 set a =5, b=2; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1 +--source include/wait_condition.inc + +--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1` + +--disable_query_log +--eval KILL $k_thread +--enable_query_log + +select * from t1; + +--disconnect node_2a + +--connection node_1 +drop table t1; diff --git a/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf b/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/galera_bf_kill_debug.test b/mysql-test/suite/galera/t/galera_bf_kill_debug.test new file mode 100644 index 00000000..c322f283 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill_debug.test @@ -0,0 +1,140 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# +# Test case 7: +# 1. Start a transaction on node_2, +# and leave it pending while holding a row locked +# 2. set sync point pause applier +# 3. send a conflicting write on node_1, it will pause +# at the sync point +# 4. though another connection to node_2, kill the local +# transaction +# + +--connection node_2 +CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB; +insert into t1 values (NULL,1); + +# +# connection node_2a runs a local transaction, that is victim of BF abort +# and victim of KILL command by connection node_2 +# +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +truncate t1; +insert into t1 values (1,0); + +# start a transaction that will conflict with later applier +begin; +update t1 set b=2 where a=1; + +--connection node_2 +set session wsrep_sync_wait=0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1 +--source include/wait_condition.inc + +--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1` + +# connection node_2b is for controlling debug syn points +# first set a sync point for applier, to pause during BF aborting +# and before THD::awake would be called +# +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2b +SET GLOBAL debug_dbug = "d,sync.before_wsrep_thd_abort"; + +# +# replicate an update, which will BF abort the victim node_2a +# however, while applier in node 2 is handling the abort, +# it will pause in sync point set by node_2b +# +--connection node_1 +select * from t1; +update t1 set b= 1 where a=1; + +# +# wait until the applying of above update has reached the sync point +# in node 2 +# +--connection node_2b +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.before_wsrep_thd_abort_reached"; + +--connection node_2 +# +# pause KILL execution before awake +# +SET DEBUG_SYNC= 'before_awake_no_mutex SIGNAL awake_reached WAIT_FOR continue_kill'; +--disable_query_log +--send_eval KILL $k_thread +--enable_query_log + + +--connection node_2b +SET DEBUG_SYNC='now WAIT_FOR awake_reached'; + +# release applier and KILL operator +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.before_wsrep_thd_abort"; +SET DEBUG_SYNC = "now SIGNAL continue_kill"; + +--connection node_2 +--reap + +--connection node_2a +--error 0,1213,2013 +select * from t1; + +--connection node_2 +SET DEBUG_SYNC = "RESET"; + +drop table t1; + +--disconnect node_2a +# +# Test case 7: +# run a transaction in node 2, and set a sync point to pause the transaction +# in commit phase. +# Through another connection to node 2, kill the committing transaction by +# KILL QUERY command +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $connection_id = `SELECT CONNECTION_ID()` + +CREATE TABLE t1 (i int primary key); + +# Set up sync point +SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; + +# Send insert which will block in the sync point above +--send INSERT INTO t1 VALUES (1) + +--connection node_2 +SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; + +--disable_query_log +--disable_result_log +# victim has passed the point of no return, kill is not possible anymore +--eval KILL QUERY $connection_id +--enable_result_log +--enable_query_log + +SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; +SET DEBUG_SYNC='RESET'; +--connection node_2a +--error 0,1213 +--reap + +--connection node_2 +# victim was able to complete the INSERT +select * from t1; + +--disconnect node_2a + +--connection node_1 +drop table t1; + diff --git a/mysql-test/suite/galera/t/galera_bf_lock_wait.cnf b/mysql-test/suite/galera/t/galera_bf_lock_wait.cnf new file mode 100644 index 00000000..e68f8917 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_lock_wait.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/galera_bf_lock_wait.test b/mysql-test/suite/galera/t/galera_bf_lock_wait.test new file mode 100644 index 00000000..0562b436 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_lock_wait.test @@ -0,0 +1,90 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +--connection node_2 +call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); + +--connection node_1 +call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); + +CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; +ALTER TABLE t1 add primary key(a); + +DELIMITER |; + +CREATE PROCEDURE p1(repeat_count INT) +BEGIN + DECLARE current_num int; + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION rollback; + SET current_num = 0; + + WHILE current_num < repeat_count DO + start transaction; + update t1 set b=connection_id() where a=1; + commit; + SET current_num = current_num + 1; + END WHILE; +END| + + +DELIMITER ;| + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME = 'p1' +--source include/wait_condition.inc + +--connect node_1_p1, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait=0; +send call p1(1000); +--connect node_1_p2, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait=0; +send call p1(1000); +--connect node_2_p1, 127.0.0.1, root, , test, $NODE_MYPORT_2 +SET SESSION wsrep_sync_wait=0; +send call p1(1000); +--connect node_2_p2, 127.0.0.1, root, , test, $NODE_MYPORT_2 +SET SESSION wsrep_sync_wait=0; +send call p1(1000); + +connection node_1; +let $counter=10; +let $sleep_period=10; + +echo checking error log for 'BF lock wait long' message for $counter times every $sleep_period seconds ...; +while($counter > 0) +{ +--disable_query_log +--disable_result_log + eval do sleep($sleep_period); +--enable_query_log +--enable_result_log + +# use error 0,1 instead if want test to continue + --error 1 + exec grep 'BF lock wait long' $MYSQLTEST_VARDIR/log/mysqld.*.err; + dec $counter; +} + +--connection node_1_p1 +--error 0,1213 +--reap +--connection node_1_p2 +--error 0,1213 +--reap +--connection node_2_p1 +--error 0,1213 +--reap +--connection node_2_p2 +--error 0,1213 +--reap + +--connection node_1 +drop table t1; +drop procedure p1; + +--disconnect node_1_p1 +--disconnect node_1_p2 +--disconnect node_2_p1 +--disconnect node_2_p2 + diff --git a/mysql-test/suite/galera/t/galera_binlog_cache_size.test b/mysql-test/suite/galera/t/galera_binlog_cache_size.test new file mode 100644 index 00000000..6ce9072d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_cache_size.test @@ -0,0 +1,35 @@ +# +# Test that Galera, like the stock MySQL, returns an error on transactions +# larger than max_binlog_cache_size +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 VARCHAR(767)) ENGINE=InnoDB; +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +--let $max_binlog_cache_size_orig = `SELECT @@max_binlog_cache_size` +--let $binlog_cache_size_orig = `SELECT @@binlog_cache_size` + +SET GLOBAL binlog_cache_size=4096; +SET GLOBAL max_binlog_cache_size=4096; + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1a +SET AUTOCOMMIT=ON; +START TRANSACTION; +INSERT INTO t1 SELECT REPEAT('a', 767) FROM ten; +--error ER_TRANS_CACHE_FULL +INSERT INTO t1 SELECT REPEAT('a', 767) FROM ten; + +--disable_query_log +--eval SET GLOBAL max_binlog_cache_size = $max_binlog_cache_size_orig +--eval SET GLOBAL binlog_cache_size = $binlog_cache_size_orig +--enable_query_log + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_binlog_checksum.cnf b/mysql-test/suite/galera/t/galera_binlog_checksum.cnf new file mode 100644 index 00000000..bd61ee67 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_checksum.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +binlog-checksum=CRC32 +master-verify-checksum=1 +slave-sql-verify-checksum=1 + +[mysqld.2] +binlog-checksum=CRC32 +master-verify-checksum=1 +slave-sql-verify-checksum=1 + + diff --git a/mysql-test/suite/galera/t/galera_binlog_checksum.test b/mysql-test/suite/galera/t/galera_binlog_checksum.test new file mode 100644 index 00000000..09d7a02f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_checksum.test @@ -0,0 +1,43 @@ +# +# Test that Galera works with binary log checksums. +# The galera_binlog_checksum-master.opt file is used to enable checksums. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +UPDATE t1 SET f1 = 2 WHERE f1 = 1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2; + +DROP TABLE t1; + +--echo # +--echo # MDEV-11149: wsrep_replicate_mysaim: DML fails when binlog checksum +--echo # enabled +--echo # + +--connection node_1 +let $wsrep_replicate_myisam_saved= `SELECT @@wsrep_replicate_myisam`; +SET @@global.wsrep_replicate_myisam=1; + +CREATE TABLE t1 (i INT) ENGINE=MYISAM; +INSERT INTO t1 VALUES(1); + +--connection node_2 +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1; +eval SET @@global.wsrep_replicate_myisam=$wsrep_replicate_myisam_saved; + +--echo # End of tests. diff --git a/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.cnf b/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.cnf new file mode 100644 index 00000000..9315086a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +binlog-row-event-max-size=4294967040 + +[mysqld.2] + + + diff --git a/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test b/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test new file mode 100644 index 00000000..d0cc2344 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_event_max_size_max.test @@ -0,0 +1,21 @@ +# +# Test that replication works event with the maximum value of binlog-row-event-max-size - 4294967295 (on 32-bit platforms) +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 VARCHAR(1000)); + +# Insert 10K records, 1K bytes each +INSERT INTO t1 SELECT REPEAT('x', 1000) FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_2 +SELECT COUNT(*) = 10000 FROM t1; + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_binlog_event_max_size_min.cnf b/mysql-test/suite/galera/t/galera_binlog_event_max_size_min.cnf new file mode 100644 index 00000000..798435d8 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_event_max_size_min.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +binlog-row-event-max-size=256 + +[mysqld.2] + + + diff --git a/mysql-test/suite/galera/t/galera_binlog_event_max_size_min.test b/mysql-test/suite/galera/t/galera_binlog_event_max_size_min.test new file mode 100644 index 00000000..00b55339 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_event_max_size_min.test @@ -0,0 +1,15 @@ +# +# Test that replication works event with the minimum value of binlog-row-event-max-size - 256 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 VARCHAR(1000)); +INSERT INTO t1 VALUES (REPEAT('x', 1000)); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = REPEAT('x', 1000); + +DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera_binlog_row_image.test b/mysql-test/suite/galera/t/galera_binlog_row_image.test new file mode 100644 index 00000000..70262ec4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_row_image.test @@ -0,0 +1,100 @@ +# +# Test the operation on the different values of the binlog_row_image option +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# binlog_row_image = minimal +# + +--connection node_1 +SET SESSION binlog_row_image=minimal; + +# Create a table with a PK, with a unique key and with no key +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER NOT NULL UNIQUE) ENGINE=InnoDB; +CREATE TABLE t3 (f1 VARCHAR(1)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); +INSERT INTO t3 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 1; +SELECT COUNT(*) = 1 FROM t2 WHERE f1 = 1; +SELECT COUNT(*) = 1 FROM t3 WHERE f1 = 1; + +--connection node_1 +UPDATE t1 SET f1 = 2 WHERE f1 = 1; +UPDATE t2 SET f1 = 2 WHERE f1 = 1; +UPDATE t3 SET f1 = 2 WHERE f1 = 1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2; +SELECT COUNT(*) = 1 FROM t2 WHERE f1 = 2; +SELECT COUNT(*) = 1 FROM t3 WHERE f1 = 2; + +--connection node_1 +DELETE FROM t1; +DELETE FROM t2; +DELETE FROM t3; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 0 FROM t2; +SELECT COUNT(*) = 0 FROM t3; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; + +# +# binlog_row_image = noblob +# + +# A table with only a blob, and a table with a PK and a blob + +--connection node_1 +SET SESSION binlog_row_image=noblob; + +CREATE TABLE t1 (f1 BLOB, f2 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (f1 BLOB) ENGINE=InnoDB; + +INSERT INTO t1 VALUES ('abc', 1); +INSERT INTO t2 VALUES ('abc'); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 'abc'; +SELECT COUNT(*) = 1 FROM t2 WHERE f1 = 'abc'; + +--connection node_1 +UPDATE t1 SET f1 = 'xyz'; +UPDATE t2 SET f1 = 'xyz'; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 'xyz'; +SELECT COUNT(*) = 1 FROM t2 WHERE f1 = 'xyz'; + +--connection node_1 +UPDATE t1 SET f2 = 2 WHERE f2 = 1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 2; +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 'xyz'; + +--connection node_1 +DELETE FROM t1; +DELETE FROM t2; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 0 FROM t2; + +DROP TABLE t1; +DROP TABLE t2; + + + + diff --git a/mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.cnf b/mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.cnf new file mode 100644 index 00000000..889c81b4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +auto_increment_offset=1 + +[mysqld.2] +auto_increment_offset=2 diff --git a/mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.test b/mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.test new file mode 100644 index 00000000..817f4f82 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_binlog_stmt_autoinc.test @@ -0,0 +1,232 @@ +## +## Tests the auto-increment with binlog in STATEMENT mode. +## + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +## +## Verify the correct operation of the auto-increment when the binlog +## format artificially set to the 'STATEMENT' (although this mode is +## not recommended in the current version): +## + +--connection node_2 +SET GLOBAL wsrep_forced_binlog_format='STATEMENT'; + +--connection node_1 +SET GLOBAL wsrep_forced_binlog_format='STATEMENT'; + +CREATE TABLE t1 ( + i int(11) NOT NULL AUTO_INCREMENT, + c char(32) DEFAULT 'dummy_text', + PRIMARY KEY (i) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +insert into t1(i) values(null); + +select * from t1; + +insert into t1(i) values(null), (null), (null); + +select * from t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc +select * from t1; + +SET GLOBAL wsrep_forced_binlog_format='none'; + +--connection node_1 + +SET GLOBAL wsrep_forced_binlog_format='none'; + +drop table t1; + +## +## Check the operation when the automatic control over the auto-increment +## settings is switched off, that is, when we use the increment step and +## the offset specified by the user. In the current session, the binlog +## format is set to 'STATEMENT'. It is important that the values of the +## auto-increment options does not changed on other node - it allows us +## to check the correct transmission of the auto-increment options to +## other nodes: +## + +--disable_warnings +SET SESSION binlog_format='STATEMENT'; +--enable_warnings + +show variables like 'binlog_format'; + +SET GLOBAL wsrep_auto_increment_control='OFF'; + +let $increment_node1 = `SELECT @@session.auto_increment_increment`; +let $offset_node1 = `SELECT @@session.auto_increment_offset`; +SET SESSION auto_increment_increment = 3; +SET SESSION auto_increment_offset = 1; + +CREATE TABLE t1 ( + i int(11) NOT NULL AUTO_INCREMENT, + c char(32) DEFAULT 'dummy_text', + PRIMARY KEY (i) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +insert into t1(i) values(null); + +select * from t1; + +insert into t1(i) values(null), (null), (null); + +select * from t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc + +select * from t1; + +--connection node_1 + +## +## Verify the return to automatic calculation of the step +## and offset of the auto-increment: +## + +SET GLOBAL wsrep_auto_increment_control='ON'; + +SET SESSION binlog_format='ROW'; + +show variables like 'binlog_format'; +show variables like '%auto_increment%'; + +## +## Verify the recovery of original user-defined values after +## stopping the automatic control over auto-increment: +## + +SET GLOBAL wsrep_auto_increment_control='OFF'; + +show variables like '%auto_increment%'; + +## +## Restore original options and drop test table: +## + +SET GLOBAL wsrep_auto_increment_control='ON'; + +drop table t1; + +## +## Verify the correct operation of the auto-increment when the binlog +## format set to the 'ROW': +## + +--connection node_2 +SET GLOBAL wsrep_forced_binlog_format='ROW'; + +--connection node_1 +SET GLOBAL wsrep_forced_binlog_format='ROW'; + +CREATE TABLE t1 ( + i int(11) NOT NULL AUTO_INCREMENT, + c char(32) DEFAULT 'dummy_text', + PRIMARY KEY (i) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +insert into t1(i) values(null); + +select * from t1; + +insert into t1(i) values(null), (null), (null); + +select * from t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc + +select * from t1; + +SET GLOBAL wsrep_forced_binlog_format='none'; + +--connection node_1 + +SET GLOBAL wsrep_forced_binlog_format='none'; + +drop table t1; + +## +## Check the operation when the automatic control over the auto-increment +## settings is switched off, that is, when we use the increment step and +## the offset specified by the user. In the current session, the binlog +## format is set to 'ROW'. It is important that the values of the +## auto-increment options does not changed on other node - it allows us +## to check the correct transmission of the auto-increment options to +## other nodes: +## + +SET SESSION binlog_format='ROW'; + +show variables like 'binlog_format'; + +SET GLOBAL wsrep_auto_increment_control='OFF'; + +SET SESSION auto_increment_increment = 3; +SET SESSION auto_increment_offset = 1; + +CREATE TABLE t1 ( + i int(11) NOT NULL AUTO_INCREMENT, + c char(32) DEFAULT 'dummy_text', + PRIMARY KEY (i) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +insert into t1(i) values(null); + +select * from t1; + +insert into t1(i) values(null), (null), (null); + +select * from t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc + +select * from t1; + +--connection node_1 + +## +## Verify the return to automatic calculation of the step +## and offset of the auto-increment: +## + +SET GLOBAL wsrep_auto_increment_control='ON'; + +show variables like 'binlog_format'; +show variables like '%auto_increment%'; + +## +## Verify the recovery of original user-defined values after +## stopping the automatic control over auto-increment: +## + +SET GLOBAL wsrep_auto_increment_control='OFF'; + +show variables like '%auto_increment%'; + +## +## Restore original options and drop test table: +## + +SET GLOBAL wsrep_auto_increment_control='ON'; + +drop table t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_can_run_toi.test b/mysql-test/suite/galera/t/galera_can_run_toi.test new file mode 100644 index 00000000..a0087be4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_can_run_toi.test @@ -0,0 +1,34 @@ +--source include/galera_cluster.inc +# +# MDEV-24833 : Signal 11 on wsrep_can_run_in_toi at wsrep_mysqld.cc:1994 +# +SET sql_mode=''; +CREATE TABLE t3 (c1 VARCHAR(10)); +ALTER TABLE t3 ENGINE=NonExistentEngine; +SHOW CREATE TABLE t3; +INSERT INTO t3 values (1); +SET sql_mode=default; +--error ER_UNKNOWN_STORAGE_ENGINE +ALTER TABLE t3 engine=innodbCLUSTER; +SHOW CREATE TABLE t3; +DROP TABLE t3; +# +# Test default_storage_engine to engine that is not supported by Galera +# +SET sql_mode=''; +SET SESSION default_storage_engine=MyISAM; +SELECT @@default_storage_engine; +SET GLOBAL wsrep_replicate_myisam=OFF; +SET GLOBAL wsrep_strict_ddl=ON; +CREATE TABLE t3 (c1 VARCHAR(10)) ENGINE=InnoDB; +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +ALTER TABLE t3 ENGINE=NonExistentEngine; +SHOW CREATE TABLE t3; +DROP TABLE t3; + +--disable_query_log +SET GLOBAL sql_mode=default; +SET GLOBAL default_storage_engine=default; +SET GLOBAL wsrep_replicate_myisam=default; +SET GLOBAL wsrep_strict_ddl=default; +--enable_query_log diff --git a/mysql-test/suite/galera/t/galera_change_user.test b/mysql-test/suite/galera/t/galera_change_user.test new file mode 100644 index 00000000..89efef1d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_change_user.test @@ -0,0 +1,29 @@ +# +# Check that change user works with Galera +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE USER user1; +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +# Change user in idle connection +--connect node_1a, 127.0.0.1, root, , test, $MYPORT_NODE_1 +change_user 'user1'; +reset_connection; +--disconnect node_1a + +# Change user with transaction open +--connect node_1a, 127.0.0.1, root, , test, $MYPORT_NODE_1 +START TRANSACTION; +INSERT INTO t1 VALUES (1); +change_user 'user1'; +reset_connection; +--disconnect node_1a + +--connection node_1 +DROP TABLE t1; +DROP USER user1; + diff --git a/mysql-test/suite/galera/t/galera_commit_empty.test b/mysql-test/suite/galera/t/galera_commit_empty.test new file mode 100644 index 00000000..4e1a1e4e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_commit_empty.test @@ -0,0 +1,35 @@ +# Test empty transactions. +# +# Check that the empty transaction gets terminated by starting and new +# transaction after it. If the empty transaction is not terminated +# appropriately, the following START TRANSACTION will fail. +# +# Also check that empty transactions don't generate any write sets. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +START TRANSACTION; +COMMIT; + +START TRANSACTION; +COMMIT; + +START TRANSACTION READ ONLY; +COMMIT; + +START TRANSACTION; +COMMIT; + +START TRANSACTION; +START TRANSACTION; +COMMIT; + +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff +--enable_query_log diff --git a/mysql-test/suite/galera/t/galera_concurrent_ctas.test b/mysql-test/suite/galera/t/galera_concurrent_ctas.test new file mode 100644 index 00000000..61038664 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_concurrent_ctas.test @@ -0,0 +1,57 @@ +--source include/galera_cluster.inc +--source include/big_test.inc + +--write_file $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.1); +DROP table t1; +CREATE table t1 as SELECT SLEEP(0.2); +CREATE table t2 as SELECT SLEEP(0.2); +CREATE table t3 as SELECT SLEEP(0.2); +CREATE table t4 as SELECT SLEEP(0.2); +CREATE table t5 as SELECT SLEEP(0.2); +CREATE table t6 as SELECT SLEEP(0.2); +CREATE table t7 as SELECT SLEEP(0.2); +CREATE table t8 as SELECT SLEEP(0.2); +CREATE table t9 as SELECT SLEEP(0.2); +DROP table t1; +DROP table t2; +DROP table t3; +DROP table t4; +DROP table t5; +DROP table t6; +DROP table t7; +DROP table t8; +DROP table t9; +EOF + +let $run=10; + +while($run) +{ + --error 0,1 + exec $MYSQL --user=root --host=127.0.0.1 --port=$NODE_MYPORT_1 test \ + < $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql & \ + $MYSQL --user=root --host=127.0.0.1 --port=$NODE_MYPORT_2 test \ + < $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql; + dec $run; +} + +--remove_file $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql + +--source include/galera_end.inc +--echo # End of test + diff --git a/mysql-test/suite/galera/t/galera_create_function.test b/mysql-test/suite/galera/t/galera_create_function.test new file mode 100644 index 00000000..0d7cec01 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_create_function.test @@ -0,0 +1,53 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test CREATE FUNCTION +# + +--connection node_1 +CREATE USER 'user1'; + +CREATE +DEFINER = 'user1' +FUNCTION f1 (param INTEGER) +RETURNS VARCHAR(200) +COMMENT 'f1_comment' +LANGUAGE SQL +NOT DETERMINISTIC +MODIFIES SQL DATA +SQL SECURITY DEFINER +RETURN 'abc'; +GRANT EXECUTE ON FUNCTION f1 TO user1; + +CREATE +DEFINER = CURRENT_USER +FUNCTION f2 (param VARCHAR(100)) +RETURNS INTEGER +DETERMINISTIC +NO SQL +SQL SECURITY INVOKER +RETURN 123; + +--connection node_1 +SHOW CREATE FUNCTION f1; + +--connection node_2 +# Work around codership/mysql-wsrep#228 - SHOW CREATE FUNCTION not covered by wsrep_sync_wait +SELECT 1 FROM DUAL; +SHOW CREATE FUNCTION f1; + +--connection node_1 +SHOW CREATE FUNCTION f2; + +--connection node_2 +SHOW CREATE FUNCTION f2; + +SELECT f1(1) = 'abc'; +SELECT f2('abc') = 123; + +--connection node_1 +DROP FUNCTION f1; +DROP FUNCTION f2; + +DROP USER 'user1'; diff --git a/mysql-test/suite/galera/t/galera_create_procedure.test b/mysql-test/suite/galera/t/galera_create_procedure.test new file mode 100644 index 00000000..30bc85fc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_create_procedure.test @@ -0,0 +1,52 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test CREATE PROCEDURE +# + +--connection node_1 +CREATE USER 'user1'; +CREATE TABLE t1 (f1 INTEGER); + +CREATE +DEFINER = 'user1' +PROCEDURE p1 (IN param1 INTEGER, OUT param2 INTEGER, INOUT param3 INTEGER) +COMMENT 'p1_comment' +LANGUAGE SQL +NOT DETERMINISTIC +MODIFIES SQL DATA +SQL SECURITY DEFINER +INSERT INTO t1 VALUES (1); +GRANT EXECUTE ON PROCEDURE p1 TO user1; + +CREATE +DEFINER = CURRENT_USER +PROCEDURE p2 (param VARCHAR(100)) +DETERMINISTIC +NO SQL +SQL SECURITY INVOKER BEGIN END ; + +--connection node_1 +SHOW CREATE PROCEDURE p1; + +--connection node_2 +# Perform causal wait +SELECT 1 FROM DUAL; +SHOW CREATE PROCEDURE p1; + +--connection node_1 +SHOW CREATE PROCEDURE p2; + +--connection node_2 +SHOW CREATE PROCEDURE p2; + +CALL p1(@a, @b, @c); +CALL p2('abc'); + +--connection node_1 +DROP PROCEDURE p1; +DROP PROCEDURE p2; + +DROP USER 'user1'; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_create_table_as_select.test b/mysql-test/suite/galera/t/galera_create_table_as_select.test new file mode 100644 index 00000000..a6c1f657 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_create_table_as_select.test @@ -0,0 +1,145 @@ +# +# CREATE TABLE AS SELECT tests +# + +--source include/galera_cluster.inc + +--connection node_1 +SET SESSION default_storage_engine=InnoDB; + +# Left table already exists + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +--error ER_TABLE_EXISTS_ERROR +CREATE TABLE t1 AS SELECT * FROM t2; +DROP TABLE t1,t2; + +# Right table does not exist +--error ER_NO_SUCH_TABLE +CREATE TABLE t1 AS SELECT * FROM t2; + +# No right table at all +CREATE TABLE t1 AS SELECT 1 FROM DUAL; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +DROP TABLE t1; + +# Empty right table +--connection node_1 +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t1 AS SELECT * FROM t2; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +DROP TABLE t1,t2; + +# Right table is MyISAM + +CREATE TABLE t2 (f1 INTEGER) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1),(2),(3),(4),(5); +CREATE TABLE t1 AS SELECT * FROM t2; +SELECT COUNT(*) = 5 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 5 FROM t1; + +--connection node_1 +DROP TABLE t1,t2; + +# Right side is a subquery + +--connection node_1 +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),(2),(3),(4),(5); +CREATE TABLE t1 AS SELECT MAX(f1) AS f1 FROM t2; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT f1 = 5 FROM t1; + +--connection node_1 +DROP TABLE t1,t2; + +# Inside a stored procedure + +--connection node_1 +DELIMITER |; +CREATE PROCEDURE sp1 () +BEGIN + CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; + INSERT INTO t2 VALUES (1),(2),(3),(4),(5); + CREATE TABLE t1 AS SELECT * FROM t2; +END| +DELIMITER ;| +CALL sp1(); +SELECT COUNT(*) = 5 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 5 FROM t1; + +--connection node_1 +DROP TABLE t1, t2; +DROP PROCEDURE sp1; + +# Inside a prepared statement + +--connection node_1 +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),(2),(3),(4),(5); + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT * FROM t2'; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; +DROP TABLE t1, t2; + +# +# Multi-master conflict +# + +--connection node_1 + +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),(2),(3),(4),(5); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +LOCK TABLE t2 WRITE; + +--connection node_1 +--send CREATE TABLE t1 AS SELECT * FROM t2; + +--connection node_2 +SELECT COUNT(*) = 5 FROM t2; +CREATE TABLE t1 AS SELECT * FROM t2; + +--connection node_1a +UNLOCK TABLES; + +--connection node_1 +--error ER_TABLE_EXISTS_ERROR,ER_LOCK_DEADLOCK +--reap + +DROP TABLE t1, t2; + +# +# Temporary table +# + +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),(2),(3),(4),(5); + +CREATE TEMPORARY TABLE t1 AS SELECT * FROM t2; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SELECT * FROM t1; + +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t1'' on query"); + +--connection node_1 +DROP TABLE t1, t2; diff --git a/mysql-test/suite/galera/t/galera_create_table_like.test b/mysql-test/suite/galera/t/galera_create_table_like.test new file mode 100644 index 00000000..0e0e8b0f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_create_table_like.test @@ -0,0 +1,50 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test the various forms of CREATE TABLE LIKE ... , since Galera has special handling +# for them, especially when one of the tables is a temporary one. +# + +CREATE SCHEMA schema1; +CREATE SCHEMA schema2; + +USE schema1; +CREATE TABLE real_table (f1 INTEGER) ENGINE=InnoDB; +CREATE TEMPORARY TABLE temp_table (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE myisam_table (f1 INTEGER) ENGINE=MyISAM; + +USE schema2; +CREATE TABLE real_table1 LIKE schema1.real_table; +CREATE TABLE real_table2 LIKE schema1.temp_table; +CREATE TABLE real_table3 LIKE schema1.myisam_table; + +CREATE TEMPORARY TABLE temp_table1 LIKE schema1.real_table; +CREATE TEMPORARY TABLE temp_table2 LIKE schema1.temp_table; +CREATE TEMPORARY TABLE temp_table3 LIKE schema1.myisam_table; + +--connection node_2 +# Only the non-temporary tables are replicated, regardless of the type of table they are based on + +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'real_table' AND TABLE_SCHEMA = 'schema1'; +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'myisam_table' AND TABLE_SCHEMA = 'schema1'; +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'temp_table' AND TABLE_SCHEMA = 'schema1'; + +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'real_table1' AND TABLE_SCHEMA = 'schema2'; +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'real_table2' AND TABLE_SCHEMA = 'schema2'; +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'real_table3' AND TABLE_SCHEMA = 'schema2'; + +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'temp_table1' AND TABLE_SCHEMA = 'schema2'; +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'temp_table2' AND TABLE_SCHEMA = 'schema2'; +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'temp_table3' AND TABLE_SCHEMA = 'schema2'; + +--connection node_1 +DROP TABLE schema1.real_table; +DROP TABLE schema1.myisam_table; + +DROP TABLE schema2.real_table1; +DROP TABLE schema2.real_table2; +DROP TABLE schema2.real_table3; + +DROP SCHEMA schema1; +DROP SCHEMA schema2; diff --git a/mysql-test/suite/galera/t/galera_create_trigger.test b/mysql-test/suite/galera/t/galera_create_trigger.test new file mode 100644 index 00000000..6708e30b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_create_trigger.test @@ -0,0 +1,43 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test CREATE TRIGGER, especially with different DEFINER +# + +CREATE TABLE definer_root (f1 INTEGER, trigger_user VARCHAR(100)) ENGINE=InnoDB; +CREATE TABLE definer_user (f1 INTEGER, trigger_user VARCHAR(100)) ENGINE=InnoDB; +CREATE TABLE definer_current_user (f1 INTEGER, trigger_user VARCHAR(100)) ENGINE=InnoDB; +CREATE TABLE definer_default (f1 INTEGER, trigger_user VARCHAR(100)) ENGINE=InnoDB; + +CREATE USER 'user1'; +CREATE DEFINER=root@localhost TRIGGER definer_root BEFORE INSERT ON definer_root FOR EACH ROW SET NEW.trigger_user = CURRENT_USER(); +CREATE DEFINER=user1 TRIGGER definer_user BEFORE INSERT ON definer_user FOR EACH ROW SET NEW.trigger_user = CURRENT_USER(); +CREATE DEFINER=current_user TRIGGER definer_current_user BEFORE INSERT ON definer_current_user FOR EACH ROW SET NEW.trigger_user = CURRENT_USER(); +CREATE TRIGGER definer_default BEFORE INSERT ON definer_default FOR EACH ROW SET NEW.trigger_user = CURRENT_USER(); + +--connection node_2 +INSERT INTO definer_root (f1) VALUES (1); +SELECT DEFINER = 'root@localhost' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'definer_root'; +SELECT trigger_user = 'root@localhost' FROM definer_root; + +INSERT INTO definer_user (f1) VALUES (1); +SELECT DEFINER = 'user1@%' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'definer_user'; +SELECT trigger_user = 'user1@%' FROM definer_user; + +INSERT INTO definer_current_user (f1) VALUES (1); +SELECT DEFINER = 'root@localhost' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'definer_current_user'; +SELECT trigger_user = 'root@localhost' FROM definer_current_user; + +INSERT INTO definer_default (f1) VALUES (1); +SELECT DEFINER = 'root@localhost' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'definer_default'; +SELECT trigger_user = 'root@localhost' FROM definer_default; + +--connection node_1 +DROP TABLE definer_current_user; +DROP TABLE definer_user; +DROP TABLE definer_root; +DROP TABLE definer_default; + +DROP USER 'user1'; + diff --git a/mysql-test/suite/galera/t/galera_create_view.test b/mysql-test/suite/galera/t/galera_create_view.test new file mode 100644 index 00000000..69b96a95 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_create_view.test @@ -0,0 +1,6 @@ +--source include/galera_cluster.inc + +CREATE OR REPLACE VIEW v AS WITH cte AS ( SELECT 1 ) SELECT * FROM cte; + +# Cleanup +DROP VIEW v; diff --git a/mysql-test/suite/galera/t/galera_ctas.test b/mysql-test/suite/galera/t/galera_ctas.test new file mode 100644 index 00000000..8b9ad9c4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ctas.test @@ -0,0 +1,39 @@ +--source include/galera_cluster.inc + +--connection node_1 +create table t1_Aria(a int, count int, b int, key(b)) engine=Aria; +INSERT INTO t1_Aria values (1,1,1); +create table t1_MyISAM(a int, count int, b int, key(b)) engine=MyISAM; +INSERT INTO t1_MyISAM values (1,1,1); +create table t1_InnoDB(a int, count int, b int, key(b)) engine=InnoDB; +INSERT INTO t1_InnoDB values (1,1,1); + +SET SESSION default_storage_engine=MyISAM; +CREATE TABLE t2 AS SELECT * FROM t1_Aria; +CREATE TABLE t3 AS SELECT * FROM t1_MyISAM; +CREATE TABLE t4 AS SELECT * FROM t1_InnoDB; +SHOW CREATE TABLE t2; +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; +DROP TABLE t2, t3,t4; + +SET SESSION default_storage_engine=Aria; +CREATE TABLE t2 AS SELECT * FROM t1_Aria; +CREATE TABLE t3 AS SELECT * FROM t1_MyISAM; +CREATE TABLE t4 AS SELECT * FROM t1_InnoDB; +SHOW CREATE TABLE t2; +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; +DROP TABLE t2, t3,t4; + +SET SESSION default_storage_engine=InnoDB; +CREATE TABLE t2 AS SELECT * FROM t1_Aria; +CREATE TABLE t3 AS SELECT * FROM t1_MyISAM; +CREATE TABLE t4 AS SELECT * FROM t1_InnoDB; +SHOW CREATE TABLE t2; +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +DROP TABLE t2, t3,t4; +DROP TABLE t1_MyISAM, t1_Aria,t1_InnoDB; + diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc new file mode 100644 index 00000000..06b7bbe4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc @@ -0,0 +1,192 @@ +# +# Test for MDL BF-BF lock conflict +# There are some DDL statements, which take extensive MDL lock for +# a table referenced by foreign key constraint from the actual affetec table. +# This extensive MDL lock may cause MDL BF-BF confclict situations, if the +# FK parent table is not listed as certification key in the replication write set. +# i.e. if replication allows such DDL to apply in parallel with regular DML operating +# on the FK parent table. +# +# This test has two scenarios, where DML modifies FK parent table in node 1, +# and offending DDL for FK child table is sent from node 2. +# +# param: $table_admin_command +# DDL table command to test, script will build full SQL statement: +# $table_admin_command TABLE c; +# +# param: $table_admin_command_end +# Optional additional SQL syntax to end the SQL statement, if any +# $table_admin_command TABLE c $table_admin_command_end; +# +# scenario 1, can be used to test if a DDL statement causes such MDL locking vulnerability. +# call this test script with some table DDL command in $table_admin_command +# if scenario 1 passes (especially COMMIT does fail for ER_LOCK_DEADLOCK), +# then this particular DDL is vulnerable. scenraio 2 should fail for this DDL +# unless code has not been fixed to append parent table certification keys for it. +# + +--echo ###################################################################### +--echo # Test for $table_admin_command $table_admin_command_end +--echo ###################################################################### + + +--echo ###################################################################### +--echo # +--echo # Scenario #1: DML working on FK parent table BF aborted by DDL +--echo # over child table +--echo # +--echo ###################################################################### + +--connection node_1 +SET SESSION wsrep_sync_wait=0; + +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); + + +CREATE TABLE p2 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p2 VALUES (1, 'INITIAL VALUE'); +INSERT INTO p2 VALUES (2, 'INITIAL VALUE'); + +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); + +CREATE TABLE c2 (pk INTEGER PRIMARY KEY, fk1 INTEGER, fk2 INTEGER, FOREIGN KEY (fk1) REFERENCES p1(pk), FOREIGN KEY (fk2) REFERENCES p2(pk)); +INSERT INTO c2 VALUES (1,1,1), (2,1,2); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; + +--connection node_2 +SET SESSION wsrep_sync_wait=0; +# wait for tables to be created in node 2 and all rows inserted as well +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/c%' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM c2 +--source include/wait_condition.inc + +# replicate the DDL to be tested +--eval $table_admin_command TABLE c1 $table_admin_command_end + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; + +--echo ###################################################################### +--echo # +--echo # Scenario #2: DML working on FK parent table tries to replicate, but +--echo # fails in certification for earlier DDL on child table +--echo # +--echo ###################################################################### + +--connection node_1 +BEGIN; + +# Block the applier on node #1 and issue DDL on node 2 +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +--eval $table_admin_command TABLE c1 $table_admin_command_end + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc +--let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +--connection node_1 +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +--send COMMIT + +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +SELECT 'I deadlocked'; + +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; + + +--echo ###################################################################### +--echo # +--echo # Scenario #3: 2 DMLs working on two FK parent tables try to replicate, +--echo # but fails in certification for earlier DDL on child table +--echo # which is child to both FK parents +--echo # +--echo ###################################################################### + +--connection node_1 +BEGIN; + +--connection node_1b +BEGIN; + +--connection node_1a +# Block the applier on node #1 and issue DDL on node 2 +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +--eval $table_admin_command TABLE c2 $table_admin_command_end + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc +--let $expected_cert_failures = `SELECT VARIABLE_VALUE+2 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +--connection node_1 +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +--send COMMIT + +--connection node_1b +UPDATE p2 SET f2 = 'TO DEADLOCK' WHERE pk = 2; +--send COMMIT + +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap +SELECT 'I deadlocked'; + +--connection node_1b +--error ER_LOCK_DEADLOCK +--reap +SELECT 'I deadlocked'; + +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; + +DROP TABLE c1, c2; +DROP TABLE p1, p2; diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test new file mode 100644 index 00000000..88837933 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test @@ -0,0 +1,37 @@ +# +# MDL BF-BF lock conflict +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +# sync point controlling session +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait=0; + +# secondary conflicting DML victim session +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +SET SESSION wsrep_sync_wait=0; + +--let $table_admin_command = OPTIMIZE +--source galera_ddl_fk_conflict.inc +--source galera_ddl_fk_conflict_with_tmp.inc + +--let $table_admin_command = REPAIR +--source galera_ddl_fk_conflict.inc +--source galera_ddl_fk_conflict_with_tmp.inc + +--let $table_admin_command = ALTER +--let $table_admin_command_end = ENGINE=INNODB +--source galera_ddl_fk_conflict.inc + +--let $table_admin_command = TRUNCATE +--let $table_admin_command_end = +--source galera_ddl_fk_conflict.inc + +# CHECK and ANALYZE are not affected + diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc b/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc new file mode 100644 index 00000000..acf3c541 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc @@ -0,0 +1,69 @@ +--echo ###################################################################### +--echo # Test for $table_admin_command $table_admin_command_end +--echo ###################################################################### + + +--connection node_1 +SET SESSION wsrep_sync_wait=0; + +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); + + +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); + +--echo ###################################################################### +--echo # +--echo # Scenario #4: DML working on FK parent table tries to replicate, but +--echo # fails in certification for earlier DDL on child table +--echo # and another temporary table. TMP table should be skipped +--echo # but FK child table should be replicated with proper keys +--echo # +--echo ###################################################################### + +--connection node_1 +BEGIN; + +# Block the applier on node #1 and issue DDL on node 2 +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +# wait for tables to be created in node 2 and all rows inserted as well +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/c1' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM c1 +--source include/wait_condition.inc +CREATE TEMPORARY TABLE tmp (i int); +--eval $table_admin_command TABLE c1, tmp $table_admin_command_end +DROP TABLE tmp; + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc +--let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +--connection node_1 +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +--send COMMIT + +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +SELECT 'I deadlocked'; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; + +DROP TABLE c1; +DROP TABLE p1; diff --git a/mysql-test/suite/galera/t/galera_ddl_multiline.test b/mysql-test/suite/galera/t/galera_ddl_multiline.test new file mode 100644 index 00000000..c7155d06 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_multiline.test @@ -0,0 +1,54 @@ +# +# Test that Galera works correctly with multiline statements, in particular involving DDLs +# + +--source include/galera_cluster.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; + +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +--connection node_2 +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; + +--connection node_1 +--send CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; CREATE TABLE t4 (f1 INTEGER) ENGINE=InnoDB; +--reap + +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +--connection node_2 +SHOW CREATE TABLE t3; +SHOW CREATE TABLE t4; + +--connection node_1 +INSERT INTO t1 VALUES (1); CREATE TABLE t5 (f1 INTEGER) ENGINE=InnoDB; + +SELECT COUNT(*) = 1 FROM t1; +SHOW CREATE TABLE t5; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SHOW CREATE TABLE t5; + +--connection node_1 +--send CREATE TABLE t6 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1); +--reap + +SELECT COUNT(*) = 1 FROM t2; +SHOW CREATE TABLE t6; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t2; +SHOW CREATE TABLE t6; + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +--connection node_1 +DROP TABLE t1, t2, t3, t4, t5, t6; + diff --git a/mysql-test/suite/galera/t/galera_defaults.cnf b/mysql-test/suite/galera/t/galera_defaults.cnf new file mode 100644 index 00000000..fb143baf --- /dev/null +++ b/mysql-test/suite/galera/t/galera_defaults.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.segment=1' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.segment=1' diff --git a/mysql-test/suite/galera/t/galera_defaults.test b/mysql-test/suite/galera/t/galera_defaults.test new file mode 100644 index 00000000..28e6f0cc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_defaults.test @@ -0,0 +1,37 @@ +# +# The purpose of this test is to preserve the current state of the following: +# * SHOW VARIABLES LIKE 'wsrep%' +# * The names of the Galera status variables +# +# Note that wsrep_provider_options contains paths and other non-deterministic parts +# +# This way, if there is any change, inadvertent or not, the test will fail and the +# developer and QA will be alerted. +# + +--source include/galera_cluster.inc +--source include/force_restart.inc + +# Make sure that the test is operating on the right version of galera library. +--let $galera_version=26.4.6 +source ../wsrep/include/check_galera_version.inc; + +# Global Variables + +SELECT COUNT(*) `expect 49` FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; + +SELECT VARIABLE_NAME, VARIABLE_VALUE +FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES +WHERE VARIABLE_NAME LIKE 'wsrep_%' +AND VARIABLE_NAME NOT IN ( + 'WSREP_PROVIDER_OPTIONS', + 'WSREP_SST_RECEIVE_ADDRESS', + 'WSREP_NODE_ADDRESS', + 'WSREP_NODE_NAME', + 'WSREP_PROVIDER', + 'WSREP_DATA_HOME_DIR', + 'WSREP_NODE_INCOMING_ADDRESS', + 'WSREP_START_POSITION', + 'WSREP_PATCH_VERSION' +) +ORDER BY VARIABLE_NAME; diff --git a/mysql-test/suite/galera/t/galera_delete_limit.test b/mysql-test/suite/galera/t/galera_delete_limit.test new file mode 100644 index 00000000..4cbadbd3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_delete_limit.test @@ -0,0 +1,52 @@ +# +# DELETE LIMIT should not cause any issues with row-based Galera replication +# regardless of the order in which the rows were deleted +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# With a PK +# + +--connection node_1 +CREATE TABLE ten (f1 INTEGER) Engine=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 SELECT f1 FROM ten ORDER BY RAND(); + +--connection node_2 +DELETE FROM t1 ORDER BY RAND() LIMIT 5; +--let $sum_remaining = `SELECT SUM(f1) FROM t1` +--let $max_remaining = `SELECT MAX(f1) FROM t1` + +--connection node_1 +--disable_query_log +--eval SELECT (SELECT SUM(f1) FROM t1) = $sum_remaining AS sum_matches; +--eval SELECT f1 = $max_remaining AS max_matches FROM t1 WHERE f1 = $max_remaining; +--enable_query_log + +DROP TABLE t1; + +# +# Without a PK +# + +CREATE TABLE t2 (f1 INTEGER) Engine=InnoDB; +INSERT INTO t2 SELECT f1 FROM ten ORDER BY RAND(); + +--connection node_2 +DELETE FROM t2 ORDER BY RAND() LIMIT 5; +--let $sum_remaining = `SELECT SUM(f1) FROM t2` +--let $max_remaining = `SELECT MAX(f1) FROM t2` + +--connection node_1 +--disable_query_log +--eval SELECT (SELECT SUM(f1) FROM t2) = $sum_remaining AS sum_matches; +--eval SELECT f1 = $max_remaining AS max_matches FROM t2 WHERE f1 = $max_remaining; +--enable_query_log + +DROP TABLE t2; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_desync_overlapped.test b/mysql-test/suite/galera/t/galera_desync_overlapped.test new file mode 100644 index 00000000..8b78e8cd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_desync_overlapped.test @@ -0,0 +1,59 @@ +# +# Test for overlapped transactions under manual desync. +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_1 + +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +CREATE TABLE t1 (f1 INTEGER, PRIMARY KEY (f1)) Engine=InnoDB; +CREATE TABLE t2 (f1 INTEGER, PRIMARY KEY (f1)) Engine=InnoDB; + +SET GLOBAL wsrep_desync = 1; +show status like 'wsrep_desync_count'; +SET DEBUG_SYNC='before_execute_sql_command SIGNAL alter1 WAIT_FOR alter2'; +send INSERT INTO t1 (f1) SELECT 0000 + (100 * a1.f1) + (10 * a2.f1) + a3.f1 FROM ten AS a1, ten AS a2, ten AS a3; + +--connection node_1a + +SET GLOBAL wsrep_desync = 1; +show status like 'wsrep_desync_count'; +SET DEBUG_SYNC='now WAIT_FOR alter1'; +SET DEBUG_SYNC='before_execute_sql_command SIGNAL alter2'; +send INSERT INTO t2 (f1) SELECT 0000 + (100 * a1.f1) + (10 * a2.f1) + a3.f1 FROM ten AS a1, ten AS a2, ten AS a3; + +--connection node_1 +reap; + +--connection node_1a +reap; + +--connection node_1 + +SET DEBUG_SYNC='RESET'; + +SET GLOBAL wsrep_desync = 0; +show status like 'wsrep_desync_count'; +SET GLOBAL wsrep_desync = 0; +show status like 'wsrep_desync_count'; + +--disable_query_log +call mtr.add_suppression("Trying to make wsrep_desync = OFF on the node that is already synchronized."); +--enable_query_log +show status like 'wsrep_desync_count'; +SET GLOBAL wsrep_desync = 0; + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t2; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_drop_database.test b/mysql-test/suite/galera/t/galera_drop_database.test new file mode 100644 index 00000000..8dc73c1c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_drop_database.test @@ -0,0 +1,67 @@ +# +# This test tests a DROP empty database +# +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# Create test database with two sets of the FTS indexes: +CREATE DATABASE fts; +USE fts; +CREATE TABLE fts_t1 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 VARCHAR(100), FULLTEXT (f2)) ENGINE=InnoDB; +CREATE TABLE fts_t2 (f2 VARCHAR(100), FULLTEXT (f2)) ENGINE=InnoDB; + +# Insert 1K rows +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); +INSERT INTO fts_t1 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3; +INSERT INTO fts_t2 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3; +DROP TABLE ten; +UPDATE fts_t1 SET f2 = 'abcd'; +UPDATE fts_t2 SET f2 = 'efjh'; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t1; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t2; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t1 where f2 = 'abcd'; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t2 where f2 = 'efjh'; + +# Restart the second node: +--connection node_2 +--source include/restart_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--source include/wait_until_ready.inc +--let $wait_condition = SELECT COUNT(*) = 1000 FROM fts_t1 where f2 = 'abcd'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1000 FROM fts_t2 where f2 = 'efjh'; +--source include/wait_condition.inc +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t1; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t2; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t1 where f2 = 'abcd'; +SELECT COUNT(*) AS EXPECT_1000 FROM fts_t2 where f2 = 'efjh'; + +# Drop the tables and database after nodes restarted: +--connection node_1 +USE fts; +DROP TABLE fts_t1; +DROP TABLE fts_t2; +SHOW TABLES; +DROP DATABASE fts; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'fts_t1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'fts_t2'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'fts'; +--source include/wait_condition.inc + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_drop_multi.test b/mysql-test/suite/galera/t/galera_drop_multi.test new file mode 100644 index 00000000..44b1b619 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_drop_multi.test @@ -0,0 +1,41 @@ +# +# Test that multi-table DROP TABLE statements are properly replicated +# See http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TEMPORARY TABLE t2 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE t3 (f1 INTEGER) ENGINE=InnoDB; +CREATE TEMPORARY TABLE t4 (f1 INTEGER) ENGINE=InnoDB; + +CREATE TABLE t5 (f1 INTEGER); + +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +DROP TABLE t1, t2, t3, t4; + +INSERT INTO t5 VALUES (1); + +COMMIT; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t2; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t3; + +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t4; + +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t2,test.t4'' on query\. Default database: 'test'\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); + +--connection node_1 +DROP TABLE t5; diff --git a/mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf new file mode 100644 index 00000000..0f7f80b7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf @@ -0,0 +1,8 @@ +!include ../galera_2nodes.cnf +[mysqld] + +encrypt-tmp-files = 1 +plugin-load-add= @ENV.FILE_KEY_MANAGEMENT_SO +file-key-management +loose-file-key-management-filename= @ENV.MYSQL_TEST_DIR/std_data/keys.txt +log-bin diff --git a/mysql-test/suite/galera/t/galera_encrypt_tmp_files.test b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.test new file mode 100644 index 00000000..c42c3dbd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.test @@ -0,0 +1,57 @@ +# This file tests that mariadb cluster should not crash when encrypt_tmp_file +# is enabled + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +--connection node_1 + +CREATE TABLE `t1` ( + `col1` int(11) NOT NULL, + `col2` varchar(64) NOT NULL DEFAULT '', + `col3` varchar(32) NOT NULL DEFAULT '0', + `col4` varchar(64) NOT NULL DEFAULT '', + `col5` tinyint(4) NOT NULL DEFAULT '0', + `col6` int(11) NOT NULL DEFAULT '0', + `col7` varchar(64) NOT NULL DEFAULT '', + `col8` tinyint(4) NOT NULL DEFAULT '0', + `col9` tinyint(4) NOT NULL DEFAULT '0', + `col10` text NOT NULL, + `col11` varchar(255) NOT NULL DEFAULT '', + `col12` tinyint(4) NOT NULL DEFAULT '1' +) ; + +#Although we just need $counter >= 907 for IO_CACHE to use +#encrypted temp file. Just on safe side I am using $counter +# = 1100 +--disable_query_log +--let $counter=1100 +--let $query= (1,'test','test','test',0,0,'-1',0,0,'','',-1) +while($counter) +{ + --let $query= $query ,(1,'test','test','test',0,0,'-1',0,0,'','',-1) + --dec $counter +} +--let $query= INSERT INTO t1 values $query ; +--eval $query +--enable_query_log +#INSERT INTO `t1` VALUE + +create table t2 (test int); +insert into t2 values (1); + +drop table t1,t2; diff --git a/mysql-test/suite/galera/t/galera_enum.test b/mysql-test/suite/galera/t/galera_enum.test new file mode 100644 index 00000000..ecca615b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_enum.test @@ -0,0 +1,68 @@ +# +# Test the ENUM column type, as it is frequently an unwanted child +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# ENUM as key +# + +--connection node_1 +CREATE TABLE t1 (f1 ENUM('', 'one', 'two'), KEY (f1)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (''); +INSERT INTO t1 VALUES ('one'), ('two'); +INSERT IGNORE INTO t1 VALUES (0), (1), (2); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t1 where f1 = ''; +SELECT COUNT(*) FROM t1 where f1 = 'one'; + +DROP TABLE t1; + +# +# ENUM as PK +# + +--connection node_1 +CREATE TABLE t1 (f1 ENUM('', 'one', 'two', 'three', 'four') PRIMARY KEY) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (''), ('one'), ('two'); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t1 WHERE f1 = ''; + +# Conflict + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'three' where f1 = ''; + +--connection node_2 +SET AUTOCOMMIt=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'four' where f1 = ''; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +--connection node_1 + +SELECT COUNT(*) FROM t1 WHERE f1 = 'three'; +SELECT * FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_events.test b/mysql-test/suite/galera/t/galera_events.test new file mode 100644 index 00000000..ae9940fc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_events.test @@ -0,0 +1,53 @@ +# +# Test that the replication of MySQL events conforms to the behavior of stock MySQL replication as described here +# http://dev.mysql.com/doc/refman/5.6/en/replication-features-invoked.html +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $event_scheduler_orig = `SELECT @@event_scheduler;` + +# +# Events arrive on slave as SLAVESIDE_DISABLED +# + +--connection node_1 +CREATE EVENT event1 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT 1; + +--connection node_2 +SELECT DEFINER= 'root@localhost', ORIGINATOR = 1, STATUS = 'SLAVESIDE_DISABLED', EVENT_TYPE = 'ONE TIME', ON_COMPLETION = 'NOT PRESERVE' FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'event1'; + +--connection node_1 +ALTER EVENT event1 DISABLE; + +--connection node_2 +# The definition on node 2 should still say SLAVESIDE_DISABLED +SELECT DEFINER= 'root@localhost', ORIGINATOR = 1, STATUS = 'SLAVESIDE_DISABLED', EVENT_TYPE = 'ONE TIME', ON_COMPLETION = 'NOT PRESERVE' FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'event1'; + +# +# Expired event should be dropped from the slave +# + +--connection node_2 +SET GLOBAL event_scheduler = ON; +CREATE EVENT event2 ON SCHEDULE AT CURRENT_TIMESTAMP ON COMPLETION NOT PRESERVE DO SELECT 1; +--sleep 1 + +--connection node_1 +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'event2'; + +# +# DROP EVENT causes event to be dropped everywhere +# + +--connection node_1 +DROP EVENT event1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'event1'; + +# Cleanup + +--connection node_2 +--eval SET GLOBAL event_scheduler = $event_scheduler_orig; diff --git a/mysql-test/suite/galera/t/galera_events2.test b/mysql-test/suite/galera/t/galera_events2.test new file mode 100644 index 00000000..3dfbe406 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_events2.test @@ -0,0 +1,148 @@ +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# +# Test case 1: "ONE TIME" events should be dropped on slave nodes after expiring on master (event creator node) +# + +--connection node_1 + +CREATE TABLE event_table(a int) engine=innodb; + +CREATE EVENT event_2 ON SCHEDULE EVERY 1 SECOND +ENDS NOW() + INTERVAL 6 SECOND +ON COMPLETION NOT PRESERVE +DO + INSERT INTO event_table VALUES (1); + +--echo # node_1 event should be there +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='event_2'; + +--connection node_2 +set global wsrep_sync_wait=15; +--echo # node_2 event should be there +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='event_2'; + +--connection node_1 +SET GLOBAL event_scheduler=ON; +SHOW VARIABLES LIKE 'event_scheduler'; + +# Let event_2 reach the end of its execution interval +let $wait_condition=select count(*) = 0 from information_schema.events where event_name='event_2'; +--source include/wait_condition.inc + +--echo # node_1 event should be removed +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='event_2'; + +--connection node_2 +--echo # node_2 event should be removed +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='event_2'; + +--connection node_1 +SET GLOBAL event_scheduler=OFF; +DROP TABLE event_table; + +# +# Test case 2: After doing ALTER EVENT, slave nodes should have same definer as master +# + +--connection node_1 + +CREATE DATABASE IF NOT EXISTS events_test; +use events_test; +CREATE USER ev_test@localhost; +GRANT ALL ON events_test.* to ev_test@localhost; +connect (ev_con1,localhost,ev_test,,events_test); + +CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123; +--replace_column 8 # 9 # +SHOW EVENTS; +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS ORDER BY EVENT_SCHEMA, EVENT_NAME; +ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND; +--echo "The definer should be ev_test@localhost" +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; +--source include/wait_condition.inc + +use events_test; +--echo "The definer should be ev_test@localhost" +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; + +--connection node_1 +--disconnect ev_con1 +use test; +DROP EVENT events_test.one_event; +DROP USER ev_test@localhost; +DROP DATABASE events_test; + +# +# Test case 3: After SST from master node (the one where event is ENABLED) , slave event status should be 'SLAVESIDE_DISABLED' +# + +--connection node_1 +use test; +CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123; + +--echo # node_1 Event should be enabled +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; + +--connection node_2 +use test; +--echo # node_2 Event should be SERVERSIDE_DISABLED +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=InnoDB; +INSERT INTO t1 VALUES (1, 'a'), (2, 'a'), (3, 'a'); + +SELECT * FROM t1; + +# Initiate normal shutdown on the node 2 and wait until shutdown has been completed: + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +UPDATE t1 SET f2 = 'b' WHERE f1 > 1; +UPDATE t1 SET f2 = 'c' WHERE f1 > 2; + +SELECT * FROM t1; + +--connection node_2 + +# Remove the "grastate.dat" file (to initiate new SST) and restart node 2 + +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--echo # Force SST from node_1 to node_2 +--let $start_mysqld_params= +--echo Starting server ... +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Sanity check (node 2 is running now and can perform SQL operators): + +SELECT * FROM t1; +--echo # node_2 Event should be SERVERSIDE_DISABLED +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; + +--connection node_1 +SELECT * FROM t1; +--echo # node_1 Event should be ENABLED +SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; + +DROP TABLE t1; +DROP EVENT one_event; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_fk_cascade_delete.test b/mysql-test/suite/galera/t/galera_fk_cascade_delete.test new file mode 100644 index 00000000..49b54f0f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_cascade_delete.test @@ -0,0 +1,70 @@ +# +# Test Foreign Key Cascading DELETEs +# + +--source include/galera_cluster.inc + +--echo # +--echo # test phase with cascading foreign key through 3 tables +--echo # + +--connection node_1 + +CREATE TABLE grandparent ( + id INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; + +CREATE TABLE parent ( + id INT NOT NULL PRIMARY KEY, + grandparent_id INT, + FOREIGN KEY (grandparent_id) + REFERENCES grandparent(id) + ON DELETE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT NOT NULL PRIMARY KEY, + parent_id INT, + FOREIGN KEY (parent_id) + REFERENCES parent(id) + ON DELETE CASCADE +) ENGINE=InnoDB; + +INSERT INTO grandparent VALUES (1),(2); +INSERT INTO parent VALUES (1,1), (2,2); +INSERT INTO child VALUES (1,1), (2,2); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'grandparent' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'parent' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'child' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM child; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM parent; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM grandparent; +--source include/wait_condition.inc +DELETE FROM grandparent WHERE id = 1; + +SELECT * FROM grandparent; +SELECT * FROM parent; +SELECT * FROM child; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM child; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM parent; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM grandparent; +--source include/wait_condition.inc + +SELECT * FROM grandparent; +SELECT * FROM parent; +SELECT * FROM child; + +DROP TABLE child; +DROP TABLE parent; +DROP TABLE grandparent; diff --git a/mysql-test/suite/galera/t/galera_fk_cascade_delete_debug.test b/mysql-test/suite/galera/t/galera_fk_cascade_delete_debug.test new file mode 100644 index 00000000..d902783e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_cascade_delete_debug.test @@ -0,0 +1,116 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--echo # +--echo # test phase with foreign key of varchar type +--echo # +--connection node_1 + CREATE TABLE parent ( + `id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + + + CREATE TABLE child ( + `id` int NOT NULL, + `parent_id` varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `parent_id` (`parent_id`), + CONSTRAINT `ipallocations_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + + +INSERT INTO parent VALUES ('row one'), ('row two'); +INSERT INTO child VALUES (1,'row one'), (2,'row two'); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'parent' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'child' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM parent; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM child; +--source include/wait_condition.inc + +DELETE FROM parent; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM parent; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM child; +--source include/wait_condition.inc + +SELECT * FROM parent; +SELECT * FROM child; + +DROP TABLE child; +DROP TABLE parent; + +--echo # +--echo # test phase with MM conflict in FK cascade +--echo # + +--connection node_1 +set wsrep_retry_autocommit=0; +CREATE TABLE parent ( + id INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT NOT NULL PRIMARY KEY, + j int default 0, + parent_id INT, + FOREIGN KEY (parent_id) + REFERENCES parent(id) + ON DELETE CASCADE +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1); +INSERT INTO child VALUES (1,0,1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'parent' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'child' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM parent; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM child; +--source include/wait_condition.inc + +# block applier before applying +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +--connection node_2 +DELETE FROM parent; + +--connection node_1a +# wait until applier has reached the sync point +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--connection node_1 +# issue conflicting write to child table, it should fail in certification +--error ER_LOCK_DEADLOCK +--send update child set j=2; + +--connection node_1a +# release the applier +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "RESET"; + +--connection node_1 +--reap +--let $wait_condition = SELECT COUNT(*) = 0 FROM parent; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM child; +--source include/wait_condition.inc + +SELECT * FROM parent; +SELECT * FROM child; + +DROP TABLE child; +DROP TABLE parent; diff --git a/mysql-test/suite/galera/t/galera_fk_cascade_update.test b/mysql-test/suite/galera/t/galera_fk_cascade_update.test new file mode 100644 index 00000000..e736803a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_cascade_update.test @@ -0,0 +1,41 @@ +# +# Test Foreign Key Cascading UPDATEs +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE grandparent ( + id INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; + +CREATE TABLE parent ( + id INT NOT NULL PRIMARY KEY, + grandparent_id INT, + FOREIGN KEY (grandparent_id) + REFERENCES grandparent(id) + ON UPDATE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT NOT NULL PRIMARY KEY, + grandparent_id INT, + FOREIGN KEY (grandparent_id) + REFERENCES parent(grandparent_id) + ON UPDATE CASCADE +) ENGINE=InnoDB; + +INSERT INTO grandparent VALUES (1),(2); +INSERT INTO parent VALUES (1,1), (2,2); +INSERT INTO child VALUES (1,1), (2,2); + +--connection node_2 +UPDATE grandparent SET id = 3 WHERE id = 1; + +--connection node_1 +SELECT COUNT(*) = 1 FROM parent WHERE grandparent_id = 3; +SELECT COUNT(*) = 1 FROM child WHERE grandparent_id = 3; + +DROP TABLE child; +DROP TABLE parent; +DROP TABLE grandparent; diff --git a/mysql-test/suite/galera/t/galera_fk_conflict.test b/mysql-test/suite/galera/t/galera_fk_conflict.test new file mode 100644 index 00000000..cb6f95ee --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_conflict.test @@ -0,0 +1,41 @@ +# +# Test two transactions on separate nodes which conflict on a FK +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE parent ( + id INT PRIMARY KEY, + KEY (id) +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT PRIMARY KEY, + parent_id INT, + FOREIGN KEY (parent_id) + REFERENCES parent(id) +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1), (2); +INSERT INTO child VALUES (1,1); + +--connection node_1 +SET AUTOCOMMIT = OFF; +START TRANSACTION; +DELETE FROM parent WHERE id = 2; + +--connection node_2 +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO child VALUES (2, 2); + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE child; +DROP TABLE parent; diff --git a/mysql-test/suite/galera/t/galera_fk_lock_wait.test b/mysql-test/suite/galera/t/galera_fk_lock_wait.test new file mode 100644 index 00000000..150c7397 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_lock_wait.test @@ -0,0 +1,40 @@ +--source include/galera_cluster.inc + +CREATE TABLE parent(parent_id int not null AUTO_INCREMENT PRIMARY KEY, +parent_name varchar(80)) ENGINE=InnoDB; + +CREATE TABLE child(child_id int not null AUTO_INCREMENT PRIMARY KEY, +child_name varchar(80), +child_parent_id int not null, +CONSTRAINT `fk_child_parent` + FOREIGN KEY (child_parent_id) REFERENCES parent (parent_id) + ON DELETE CASCADE + ON UPDATE CASCADE) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1, 'first'),(2,'second'),(3,'foo'),(4,'tmp'); +INSERT INTO child VALUES (NULL,'first_child',1); +INSERT INTO child VALUES (NULL,'second_child',1); +INSERT INTO child VALUES (NULL,'first_child2',2); +INSERT INTO child VALUES (NULL,'first_child3',2); +INSERT INTO child VALUES (NULL,'first_child4',3); + +BEGIN; +UPDATE parent SET parent_name = 'bar' WHERE parent_id = 2; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION innodb_lock_wait_timeout=2; +--error ER_LOCK_WAIT_TIMEOUT +UPDATE child SET child_parent_id = 5 where child_parent_id = 2; + +--connection node_1 +COMMIT; +SELECT * FROM parent; +SELECT * FROM child; + +--connection node_2 + +SELECT * FROM parent; +SELECT * FROM child; +DROP TABLE child, parent; + +--disconnect node_1a diff --git a/mysql-test/suite/galera/t/galera_fk_mismatch.test b/mysql-test/suite/galera/t/galera_fk_mismatch.test new file mode 100644 index 00000000..bded4138 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_mismatch.test @@ -0,0 +1,38 @@ +# +# Test the operation where the definition of the FK is different from the one of the underlying key +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE parent ( + id1 INT, + id2 INT, + PRIMARY KEY (id1, id2) /* Multipart PK */ +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT PRIMARY KEY, + parent_id1 INT, + FOREIGN KEY (parent_id1) + REFERENCES parent(id1) /* FK is subset of PK above */ + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1, 2); +INSERT INTO child VALUES (1, 1); + +--connection node_2 +UPDATE parent SET id1 = 3 WHERE id1 = 1; + +--connection node_1 +SELECT COUNT(*) = 1 FROM child WHERE parent_id1 = 3; + +DELETE FROM parent WHERE id1 = 3; + +--connection node_2 +SELECT COUNT(*) = 0 FROM child WHERE parent_id1 = 3; + +DROP TABLE child; +DROP TABLE parent; diff --git a/mysql-test/suite/galera/t/galera_fk_multicolumn.test b/mysql-test/suite/galera/t/galera_fk_multicolumn.test new file mode 100644 index 00000000..ad42f659 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_multicolumn.test @@ -0,0 +1,42 @@ +# +# Test UPDATE on multiple columns with multiple FKs +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t0 ( + f1 INT PRIMARY KEY, + f2 INT UNIQUE +); + +CREATE TABLE t1 ( + f1 INT PRIMARY KEY, + FOREIGN KEY (f1) + REFERENCES t0(f1) + ON UPDATE CASCADE +); + +CREATE TABLE t2 ( + f2 INT PRIMARY KEY, + FOREIGN KEY (f2) + REFERENCES t0(f2) + ON UPDATE CASCADE +); + +INSERT INTO t0 VALUES (0, 0); +INSERT INTO t1 VALUES (0); +INSERT INTO t2 VALUES (0); + +--connection node_2 +UPDATE t0 SET f1 = 1, f2 = 2; + +--connection node_1 +SELECT f1 = 1 FROM t1 WHERE f1 = 1; +SELECT f2 = 2 FROM t2 WHERE f2 = 2; +SELECT f1 = 1 FROM t1; +SELECT f2 = 2 FROM t2; + +DROP TABLE t2; +DROP TABLE t1; +DROP TABLE t0; diff --git a/mysql-test/suite/galera/t/galera_fk_multitable.test b/mysql-test/suite/galera/t/galera_fk_multitable.test new file mode 100644 index 00000000..6adfb819 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_multitable.test @@ -0,0 +1,32 @@ +# +# Test multi-table DELETE in the presence of FKs +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t0 ( + f0 INT PRIMARY KEY +); + +CREATE TABLE t1 ( + f1 INT PRIMARY KEY, + f0 INTEGER, + FOREIGN KEY (f0) + REFERENCES t0(f0) + ON DELETE CASCADE +); + +INSERT INTO t0 VALUES (0), (1); +INSERT INTO t1 VALUES (0, 0); +INSERT INTO t1 VALUES (1, 0); + +--connection node_2 +DELETE t0.*, t1.* FROM t0, t1 WHERE t0.f0 = 0 AND t1.f1 = 0; + +--connection node_1 +SELECT COUNT(*) = 1 FROM t0; +SELECT COUNT(*) = 0 FROM t1; + +DROP TABLE t1; +DROP TABLE t0; diff --git a/mysql-test/suite/galera/t/galera_fk_no_pk.test b/mysql-test/suite/galera/t/galera_fk_no_pk.test new file mode 100644 index 00000000..d1f9c267 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_no_pk.test @@ -0,0 +1,37 @@ +# +# Test foreign keys if no PK is present +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE parent ( + id INT, + KEY (id) +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT, + parent_id INT, + FOREIGN KEY (parent_id) + REFERENCES parent(id) + ON UPDATE CASCADE + ON DELETE CASCADE +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1), (1), (2), (2); +INSERT INTO child VALUES (1,1), (2,2), (1,1), (2,2); + +--connection node_2 +DELETE FROM parent WHERE id = 1; +SELECT COUNT(*) = 0 FROM child WHERE id = 1; + +--connection node_1 +UPDATE parent SET id = 3 WHERE id = 2; + +--connection node_2 +SELECT COUNT(*) = 0 FROM child WHERE parent_id = 1; +SELECT parent_id = 3 FROM child WHERE id = 2; + +DROP TABLE child; +DROP TABLE parent; diff --git a/mysql-test/suite/galera/t/galera_fk_selfreferential.test b/mysql-test/suite/galera/t/galera_fk_selfreferential.test new file mode 100644 index 00000000..e2c19001 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_selfreferential.test @@ -0,0 +1,24 @@ +# +# Test self-referential foreign keys +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 ( + f1 INT NOT NULL PRIMARY KEY, + f2 INT, + FOREIGN KEY (f2) + REFERENCES t1(f1) + ON DELETE CASCADE +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1, 1), (2, 1); + +--connection node_2 +DELETE FROM t1 WHERE f1 = 1; + +--connection node_1 +SELECT COUNT(*) = 0 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_fk_setnull.test b/mysql-test/suite/galera/t/galera_fk_setnull.test new file mode 100644 index 00000000..46ba82db --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fk_setnull.test @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE parent ( + id INT NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT, + parent_id INT, + FOREIGN KEY (parent_id) + REFERENCES parent(id) + ON UPDATE SET NULL + ON DELETE SET NULL +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1),(2); +INSERT INTO child VALUES (1,1),(2,2); + +--connection node_2 +DELETE FROM parent WHERE id = 1; +SELECT parent_id IS NULL FROM child WHERE id = 1; + +--connection node_1 +SELECT parent_id IS NULL FROM child WHERE id = 1; + +UPDATE parent SET id = 3 WHERE id = 2; +SELECT parent_id IS NULL FROM child WHERE id = 2; + +--connection node_2 +SELECT parent_id IS NULL FROM child WHERE id = 2; + +--connection node_1 +DROP TABLE child; +DROP TABLE parent; diff --git a/mysql-test/suite/galera/t/galera_flush_local.test b/mysql-test/suite/galera/t/galera_flush_local.test new file mode 100644 index 00000000..24acd9ec --- /dev/null +++ b/mysql-test/suite/galera/t/galera_flush_local.test @@ -0,0 +1,143 @@ +# +# Test that various FLUSH LOCAL commands are replicated. Whenever possible, check the slave for the effects. +# PXC-391 + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_query_cache.inc +--source include/have_wsrep_replicate_myisam.inc + +--disable_warnings +DROP TABLE IF EXISTS t1, t2, x1, x2; +--enable_warnings +# +# The following FLUSH LOCAL statements should *not* be replicated +# +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +CREATE TABLE t2 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER); +CREATE TABLE x1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE x2 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO x1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO t2 (f2) SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4; +INSERT INTO x2 (f2) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); + +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +FLUSH LOCAL DES_KEY_FILE; +FLUSH LOCAL HOSTS; +FLUSH LOCAL QUERY CACHE; +FLUSH LOCAL STATUS; +FLUSH LOCAL PRIVILEGES; +FLUSH LOCAL USER_RESOURCES; +FLUSH LOCAL TABLES; +FLUSH LOCAL TABLES t2; +FLUSH LOCAL ERROR LOGS; +FLUSH LOCAL SLOW LOGS; +FLUSH LOCAL GENERAL LOGS; +FLUSH LOCAL ENGINE LOGS; +FLUSH LOCAL RELAY LOGS; +FLUSH LOCAL CLIENT_STATISTICS; +FLUSH LOCAL INDEX_STATISTICS; +FLUSH LOCAL TABLE_STATISTICS; +FLUSH LOCAL USER_STATISTICS; +FLUSH LOCAL LOGS; +FLUSH LOCAL BINARY LOGS; +FLUSH LOCAL TABLES WITH READ LOCK; +UNLOCK TABLES; +FLUSH LOCAL TABLES t1 WITH READ LOCK; +UNLOCK TABLES; +FLUSH LOCAL TABLES t1 FOR EXPORT; +UNLOCK TABLES; +LOCK TABLES t1 WRITE; +FLUSH LOCAL TABLES t1; +UNLOCK TABLES; +LOCK TABLES t1 READ; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +FLUSH LOCAL TABLES t1; +UNLOCK TABLES; +FLUSH LOCAL TABLES t1; +ANALYZE LOCAL TABLE t1, t2; +OPTIMIZE LOCAL TABLE t1, t2; +REPAIR LOCAL TABLE x1, x2; +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +SELECT COUNT(*) = 10 FROM t1; +SELECT COUNT(*) = 10 FROM x1; +SELECT COUNT(*) = 10000 FROM t2; +SELECT COUNT(*) = 10 FROM x2; + + +--connection node_1 +DROP TABLE t1, t2, x1, x2; +CREATE TABLE t1 (f1 INTEGER); +CREATE TABLE t2 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER); +CREATE TABLE x1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE x2 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO x1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO t2 (f2) SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4; +INSERT INTO x2 (f2) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); + + +--connection node_2 +--let $wsrep_last_committed_before2 = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--connection node_1 +set wsrep_on=0; +FLUSH DES_KEY_FILE; +FLUSH HOSTS; +FLUSH QUERY CACHE; +FLUSH STATUS; +FLUSH PRIVILEGES; +FLUSH USER_RESOURCES; +FLUSH TABLES; +FLUSH TABLES t2; +FLUSH ERROR LOGS; +FLUSH SLOW LOGS; +FLUSH GENERAL LOGS; +FLUSH ENGINE LOGS; +FLUSH RELAY LOGS; +FLUSH CLIENT_STATISTICS; +FLUSH INDEX_STATISTICS; +FLUSH TABLE_STATISTICS; +FLUSH USER_STATISTICS; +FLUSH LOGS; +FLUSH BINARY LOGS; +FLUSH TABLES WITH READ LOCK; +UNLOCK TABLES; +FLUSH TABLES t1 WITH READ LOCK; +UNLOCK TABLES; +FLUSH TABLES t1 FOR EXPORT; +UNLOCK TABLES; +LOCK TABLES t1 WRITE; +FLUSH TABLES t1; +UNLOCK TABLES; +LOCK TABLES t1 READ; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +FLUSH TABLES t1; +UNLOCK TABLES; +FLUSH TABLES t1; +ANALYZE TABLE t1, t2; +OPTIMIZE TABLE t1, t2; +REPAIR TABLE x1, x2; +--connection node_2 +--let $wsrep_last_committed_after2 = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after2 = $wsrep_last_committed_before2 AS wsrep_last_committed_diff; +--eval SELECT $wsrep_last_committed_after2 = $wsrep_last_committed_before + 9 AS wsrep_last_committed_diff2; +--enable_query_log + +SELECT COUNT(*) = 10 FROM t1; +SELECT COUNT(*) = 10 FROM x1; +SELECT COUNT(*) = 10000 FROM t2; +SELECT COUNT(*) = 10 FROM x2; + +--connection node_1 +set wsrep_on=1; +DROP TABLE t1, t2, x1, x2; diff --git a/mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt b/mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt new file mode 100644 index 00000000..8c58b59b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_forced_binlog_format-master.opt @@ -0,0 +1 @@ +--log-bin --wsrep_forced_binlog_format=ROW diff --git a/mysql-test/suite/galera/t/galera_forced_binlog_format.test b/mysql-test/suite/galera/t/galera_forced_binlog_format.test new file mode 100644 index 00000000..78683723 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_forced_binlog_format.test @@ -0,0 +1,52 @@ +# +# Test that wsrep_forced_binlog_format=ROW indeed prevents the log to be switched to STATEMENT format on a per-connection basis +# + +--source include/have_log_bin.inc +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--connection node_1 +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; +FLUSH BINARY LOGS; + +--disable_warnings +SET SESSION binlog_format = 'STATEMENT'; +--enable_warnings + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--disable_warnings +SET SESSION binlog_format = 'MIXED'; +--enable_warnings + +INSERT INTO t1 VALUES (2); + +--replace_regex /xid=[0-9]+/xid=###/ /table_id: [0-9]+/table_id: ###/ +--replace_column 2 5 +SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM 256; + +DROP TABLE t1; + +--echo # +--echo # MDEV-9401: wsrep_forced_binlog_format with binlog causes crash +--echo # +SET SESSION binlog_format = 'ROW'; +CREATE DATABASE testdb_9401; +USE testdb_9401; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE USER dummy@localhost; +GRANT ALL PRIVILEGES ON testdb_9401.t1 TO dummy@localhost; +FLUSH PRIVILEGES; +SHOW GRANTS FOR dummy@localhost; +# Cleanup +REVOKE ALL PRIVILEGES, GRANT OPTION FROM dummy@localhost; +DROP USER dummy@localhost; +DROP DATABASE testdb_9401; + +#--source include/galera_end.inc +--echo # End of tests + diff --git a/mysql-test/suite/galera/t/galera_ftwrl.test b/mysql-test/suite/galera/t/galera_ftwrl.test new file mode 100644 index 00000000..73925560 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ftwrl.test @@ -0,0 +1,39 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# At this time, issing a FLUSH TABLES WITH READ LOCK causes SELECT and SHOW to +# hang if causality can not be ensured because another node issued a statement +# in the meantime which could not be applied because FTWRL blocks the applier +# as well +# +# See LP bug 1271177 +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options;` +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S"; +FLUSH TABLES WITH READ LOCK; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +--error ER_LOCK_WAIT_TIMEOUT +SHOW TABLES; + +--error ER_LOCK_WAIT_TIMEOUT +SELECT * FROM t1; + +UNLOCK TABLES; + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig"; +--enable_query_log + +SHOW TABLES; +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ftwrl_drain.test b/mysql-test/suite/galera/t/galera_ftwrl_drain.test new file mode 100644 index 00000000..c8cdda5d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ftwrl_drain.test @@ -0,0 +1,69 @@ +# +# Test the following sequence of events: +# +# 1. issue a remote transaction +# 2. applier is blocked from applying the transaction locally using apply_monitor_slave_enter_sync +# 3. FTWRL is issued and blocks in ApplyOrder>::drain_common +# 4. applier is unblocked +# 5. remote transaction is applied +# 6. FTWRL is granted +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connection node_1 +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 + +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; + +# Wait until applier has blocked +--source include/galera_wait_sync_point.inc + +SELECT COUNT(*) = 0 FROM t1; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--send FLUSH TABLES WITH READ LOCK; + +--connection node_2 +--sleep 1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE = 'Init' OR STATE = 'starting') AND INFO = 'FLUSH TABLES WITH READ LOCK' +--source include/wait_condition.inc + +--source include/galera_clear_sync_point.inc +--source include/galera_signal_sync_point.inc + +--connection node_2a +--reap + +--connection node_2 + +SET SESSION lock_wait_timeout = 1; +SET SESSION innodb_lock_wait_timeout=1; +SET SESSION wait_timeout=1; + +--error ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1 VALUES (2); + +--connection node_2a +UNLOCK TABLES; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +INSERT INTO t1 VALUES (3); + +--connection node_1 +SELECT COUNT(*) = 2 FROM t1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_fulltext.test b/mysql-test/suite/galera/t/galera_fulltext.test new file mode 100644 index 00000000..19aa4f7a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_fulltext.test @@ -0,0 +1,85 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# InnoDB FULLTEXT indexes +# + +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +# +# Fulltext index creation causes the creation of multiple system tables +# + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 VARCHAR(100), FULLTEXT (f2)) ENGINE=InnoDB; + +--connection node_2 +SELECT COUNT(*) = 13 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE name LIKE 'test/%'; + +# +# Fulltext insertion causes a flurry of updates on those system tables +# + +--connection node_1 +# Insert 1K rows +INSERT INTO t1 (f2) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3; + +--connection node_2 +SELECT COUNT(f2) = 1000 FROM t1 WHERE MATCH(f2) AGAINST ('foobarbaz'); + +UPDATE t1 SET f2 = 'abcdefjhk'; + +--connection node_1 +SELECT COUNT(f2) = 1000 FROM t1 WHERE MATCH(f2) AGAINST ('abcdefjhk'); + +--connection node_2 + +DROP TABLE t1; + +# +# Same on a table with no PK +# + +--connection node_1 +CREATE TABLE t1 (f1 VARCHAR(100), FULLTEXT (f1)) ENGINE=InnoDB; + +--connection node_2 +# We insert only 1K rows here, because updates without a PK are very slow +INSERT INTO t1 (f1) SELECT 'foobarbaz' FROM ten AS a1, ten AS a2, ten AS a3; + +--connection node_1 +SELECT COUNT(f1) = 1000 FROM t1 WHERE MATCH(f1) AGAINST ('foobarbaz'); + +UPDATE t1 SET f1 = 'abcdefjhk'; + +--connection node_2 +SELECT COUNT(f1) = 1000 FROM t1 WHERE MATCH(f1) AGAINST ('abcdefjhk'); + +DROP TABLE t1; +DROP TABLE ten; +# +# MDEV-24978 : SIGABRT in __libc_message +# +--connection node_1 +SET @value=REPEAT (1,5001); +CREATE TABLE t (a VARCHAR(5000),FULLTEXT (a)) engine=innodb; +INSERT IGNORE INTO t VALUES(@value); +SELECT COUNT(*) FROM t; + +--connection node_2 +SELECT COUNT(*) FROM t; + +--connection node_1 +DROP TABLE t; +CREATE TABLE t (a VARCHAR(5000)) engine=innodb; +INSERT IGNORE INTO t VALUES(@value); +SELECT COUNT(*) FROM t; + +--connection node_2 +SELECT COUNT(*) FROM t; + +--connection node_1 +DROP TABLE t; diff --git a/mysql-test/suite/galera/t/galera_gcache_recover.cnf b/mysql-test/suite/galera/t/galera_gcache_recover.cnf new file mode 100644 index 00000000..34c757de --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcache_recover.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.recover=yes;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.recover=yes' diff --git a/mysql-test/suite/galera/t/galera_gcache_recover.test b/mysql-test/suite/galera/t/galera_gcache_recover.test new file mode 100644 index 00000000..e1bfe517 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcache_recover.test @@ -0,0 +1,77 @@ +# +# Kill entire cluster while gcache.recover=yes. Expect that node #2 will rejoin using IST +# + +--source include/galera_cluster.inc +--source include/big_test.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET SESSION wsrep_sync_wait = 0; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) > 0 FROM t1; +--source include/wait_condition.inc + +SET SESSION wsrep_sync_wait = 0; +--source include/kill_galera.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +INSERT INTO t1 VALUES (2); + +--source include/kill_galera.inc + +--sleep 1 + +--connection node_1 +--let $galera_wsrep_recover_server_id=1 +--source suite/galera/include/galera_wsrep_recover.inc + +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--source include/start_mysqld.inc + +INSERT INTO t1 VALUES (3); + +--connection node_2 +--let $galera_wsrep_recover_server_id=2 +--source suite/galera/include/galera_wsrep_recover.inc + +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--source include/start_mysqld.inc + +--connection node_1 +--source include/wait_until_connected_again.inc +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +--connection node_1 +# Warning happens when the cluster is started for the first time +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); + +# Confirm that IST took place +--let $assert_text = async IST sender starting to serve +--let $assert_select = async IST sender starting to serve +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = starting as process +--source include/assert_grep.inc + +--connection node_2 +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); + +# Confirm that gcache recovery took place + +--let $assert_text = Recovering GCache ring buffer: found gapless sequence +--let $assert_select = Recovering GCache ring buffer: found gapless sequence +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = starting as process +--source include/assert_grep.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.cnf b/mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.cnf new file mode 100644 index 00000000..0157d2f0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +max_allowed_packet=10M +innodb_log_file_size=220M +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.recover=yes;pc.ignore_sb=true;gcache.size=10M' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.recover=yes;pc.ignore_sb=true;gcache.size=10M' diff --git a/mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.test b/mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.test new file mode 100644 index 00000000..6b3e56d8 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcache_recover_full_gcache.test @@ -0,0 +1,73 @@ +# +# Attempt gcache recovery on a full gcache. Node will not be able to join via IST due to gcache rollover +# + +--source include/galera_cluster.inc +--source include/big_test.inc + +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 LONGBLOB) ENGINE=InnoDB; + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--source include/kill_galera.inc + +--connection node_1 + +# +# Wait until the configuration change is over in order to avoid +# replication error due to configuration change. +# +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024 * 10)); +INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024 * 10)); +INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024 * 10)); +INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024 * 10)); +INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024 * 10)); +--source include/kill_galera.inc + +--connection node_1 +--let $galera_wsrep_recover_server_id=1 +--source suite/galera/include/galera_wsrep_recover.inc + +--let $_expect_file_name = $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--source include/start_mysqld.inc +--connection node_2 +--let $galera_wsrep_recover_server_id=2 +--source suite/galera/include/galera_wsrep_recover.inc + +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--source include/start_mysqld.inc + +--connection node_1 +--source include/wait_until_connected_again.inc +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +SELECT COUNT(*) FROM t1; + +--connection node_2 +SET SESSION wsrep_sync_wait = 15; +SELECT COUNT(*) FROM t1; + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +--connection node_1 +DROP TABLE t1; + +# Warning always happens when the cluster is started for the first time +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); + +# Confirm that IST did not take place +--let $assert_text = not found from cache, falling back to SST +--let $assert_select = not found from cache, falling back to SST +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = starting as process +--source include/assert_grep.inc + +--connection node_2 +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); diff --git a/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.cnf b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.cnf new file mode 100644 index 00000000..c6432f36 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +innodb_log_file_size=220M +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.recover=yes;pc.ignore_sb=true;' + +[mysqld.2] +innodb_log_file_size=220M +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.recover=yes;pc.ignore_sb=true;' diff --git a/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test new file mode 100644 index 00000000..08165f30 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test @@ -0,0 +1,225 @@ +# +# Kill entire cluster while various transactions are in progress +# restore the cluster and expect that node #2 will rejoin using IST +# + +--source include/galera_cluster.inc +--source include/big_test.inc +--source include/have_log_bin.inc + +SET SESSION wsrep_sync_wait = 0; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 LONGBLOB) ENGINE=InnoDB; +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +DELIMITER |; +CREATE PROCEDURE insert_simple () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + INSERT INTO t1 (f1, f2) VALUES (DEFAULT,'abcdef'); + END WHILE; +END| + +CREATE PROCEDURE insert_multi () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + INSERT INTO t1 (f1) VALUES (DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT); + END WHILE; +END| + +CREATE PROCEDURE insert_transaction () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + SET AUTOCOMMIT = OFF; + WHILE 1 DO + START TRANSACTION; + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + INSERT INTO t1 (f1) VALUES (DEFAULT); + COMMIT; + END WHILE; +END| + +DELIMITER ;| +DELIMITER |; + +CREATE PROCEDURE update_simple () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + UPDATE t1 SET f2 = CONCAT(f2,f2); + END WHILE; +END| + +CREATE PROCEDURE insert_1k () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024)); + END WHILE; +END| + +CREATE PROCEDURE insert_1m () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024)); + END WHILE; +END| + +CREATE PROCEDURE insert_10m () +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SET SESSION wsrep_sync_wait = 0; + WHILE 1 DO + INSERT INTO t1 (f2) VALUES (REPEAT('x', 1024 * 1024 * 10)); + END WHILE; +END| + +DELIMITER ;| + +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connect node_1_insert_simple, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_insert_multi, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_insert_transaction, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_update_simple, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_insert_1k, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_insert_1m, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1_insert_10m, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1_insert_simple +--send CALL insert_simple(); + +--connection node_1_insert_multi +--send CALL insert_multi(); + +--connection node_1_insert_transaction +--send CALL insert_transaction (); + +--connection node_1_update_simple +--send CALL update_simple (); + +--connection node_1_insert_1k +--send CALL insert_1k (); + +--connection node_1_insert_1m +--send CALL insert_1m (); + +--connection node_1_insert_10m +--send CALL insert_10m (); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; + +# Make sure that node_2 is not killed while TOIs are applied. +# Otherwhise we risk that grastate file is marked unsafe, and +# as a consequence the node cannot rejoin with IST. +--let $wait_condition = SELECT VARIABLE_VALUE > $wsrep_last_committed_before FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--source include/wait_condition.inc + +--source include/kill_galera.inc + +--sleep 10 +--connection node_1 +--source include/kill_galera.inc + +--connection node_1_insert_simple +--error 2013 +--reap + +--connection node_1_insert_multi +--error 2013 +--reap + +--connection node_1_insert_transaction +--error 2013 +--reap + +--connection node_1_update_simple +--error 2013 +--reap + +--connection node_1_insert_1k +--error 2013 +--reap + +--connection node_1_insert_1m +--error 2013 +--reap + +--connection node_1_insert_10m +--error 2013 +--reap + +--connection node_1 +--let $galera_wsrep_recover_server_id=1 +--source suite/galera/include/galera_wsrep_recover.inc + +--let $_expect_file_name = $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--source include/start_mysqld.inc +--connection node_2 +--let $galera_wsrep_recover_server_id=2 +--source suite/galera/include/galera_wsrep_recover.inc + +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--source include/start_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +--connection node_1 +DROP TABLE t1; +DROP TABLE ten; +DROP PROCEDURE insert_simple; +DROP PROCEDURE insert_multi; +DROP PROCEDURE insert_transaction; +DROP PROCEDURE update_simple; +DROP PROCEDURE insert_1k; +DROP PROCEDURE insert_1m; + +--connection node_1 +CALL mtr.add_suppression("conflict state 7 after post commit"); + +# Warning happens when the cluster is started for the first time +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); + +# Confirm that IST took place +--let $assert_text = async IST sender starting to serve +--let $assert_select = async IST sender starting to serve +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = starting as process +--source include/assert_grep.inc + +--connection node_2 +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); + +# Confirm that gcache recovery took place + +--let $assert_text = Recovering GCache ring buffer: found gapless sequence +--let $assert_select = Recovering GCache ring buffer: found gapless sequence +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = starting as process +--source include/assert_grep.inc diff --git a/mysql-test/suite/galera/t/galera_gcs_fc_limit.test b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test new file mode 100644 index 00000000..d73286dc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcs_fc_limit.test @@ -0,0 +1,61 @@ +# +# Test that under gcs.fc_limit=1 on the slave, transactions on the master can not commit. +# + +--source include/galera_cluster.inc +--source include/big_test.inc +--source include/force_restart.inc + +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,B INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*)=1 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; + +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'gcs.fc_limit=1'; + +# Block the slave applier thread +LOCK TABLE t1 WRITE; + +--connection node_1 +FLUSH STATUS; +INSERT INTO t1 VALUES (2,2); +INSERT INTO t1 VALUES (3,3); +INSERT INTO t1 VALUES (4,4); + +# This query will hang because flow control will kick in +--send +INSERT INTO t1(B) SELECT B FROM t1; + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1a + +--echo # In node_1 either insert or commit should be stuck +--let $wait_condition = SELECT VARIABLE_VALUE > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_flow_control_paused'; +--source include/wait_condition.inc + +--connection node_2 +# Unblock the slave applier thread +UNLOCK TABLES; + +--connection node_1 +--reap + +INSERT INTO t1 VALUES (NULL,6); + +--connection node_2 +# Replication catches up and continues normally +SELECT COUNT(*) FROM t1; + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log +--source include/wait_until_connected_again.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_gcs_fragment.cnf b/mysql-test/suite/galera/t/galera_gcs_fragment.cnf new file mode 100644 index 00000000..aae3fee5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcs_fragment.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcs.max_packet_size=64' +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcs.max_packet_size=64' diff --git a/mysql-test/suite/galera/t/galera_gcs_fragment.test b/mysql-test/suite/galera/t/galera_gcs_fragment.test new file mode 100644 index 00000000..d2593fec --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcs_fragment.test @@ -0,0 +1,74 @@ +# Test fragmentation over configuration changes +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/galera_have_debug_sync.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# Prepare table +CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 TEXT); + +# Stop node2 + +# Disconnect node_2 from group +--connection node_2 +--let $wsrep_cluster_address_orig = `select @@wsrep_cluster_address` +SET GLOBAL wsrep_cluster_address=''; + +# Connection for sync points +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait=0; + +# Set breakpoint in gcs after first fragment send + +--let $galera_sync_point = gcs_core_after_frag_send +--source include/galera_set_sync_point.inc + +--connection node_1 +SET SESSION wsrep_retry_autocommit=0; +--send INSERT INTO t1 VALUES (1, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + + +# Restart node_2, wait until it joins the group and then make INSERT +--connection node_2 +--disable_query_log +--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig' +--enable_query_log +SET SESSION wsrep_on = 0; +--source include/galera_wait_ready.inc +SET SESSION wsrep_on = 1; + +INSERT INTO t1 VALUES (2, "bbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + +# Signal node_1 to continue +--connection node_1a +--source include/galera_signal_sync_point.inc + +# Deadlock error should be returned since write set send was +# interrupted by gcs +--connection node_1 +--error ER_ERROR_DURING_COMMIT +--reap + +# Do additional insert to verify that node_1 remain operational +INSERT INTO t1 VALUES (3, "cccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + + +# Nodes node_1 and node_2 should now contain rows 2 and 3 +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; + +--connection node_1 + +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_gcs_max_packet_size.cnf b/mysql-test/suite/galera/t/galera_gcs_max_packet_size.cnf new file mode 100644 index 00000000..6bb11e59 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcs_max_packet_size.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcs.max_packet_size=64;gcache.size=10M' +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcs.max_packet_size=64;gcache.size=10M' diff --git a/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test b/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test new file mode 100644 index 00000000..98be4f6a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gcs_max_packet_size.test @@ -0,0 +1,26 @@ +# +# Test fragmentation by setting gcs.max_packet_size to a low value +# The actual setting is performed in galera_gcs_max_packet_size.cnf +# as gcs.max_packet_size is not a dynamic variable +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); + +CREATE TABLE t1 (f1 INT PRIMARY KEY AUTO_INCREMENT, f2 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 VARCHAR(512) UNIQUE) ENGINE=InnoDB; + +INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +INSERT INTO t2 VALUES (REPEAT('x', 512)); + +--connection node_2 +SELECT COUNT(*) = 10000 FROM t1; +SELECT LENGTH(f1) = 512 FROM t2 WHERE f1 = REPEAT('x', 512); + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_gra_log.test b/mysql-test/suite/galera/t/galera_gra_log.test new file mode 100644 index 00000000..23561d9a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gra_log.test @@ -0,0 +1,49 @@ +# +# Test that GRA_* files are generated on applier failure and are readable. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +--exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log +let $restore_wsrep_ignore_apply_errors = `SELECT @@GLOBAL.wsrep_ignore_apply_errors`; +SET GLOBAL wsrep_ignore_apply_errors=0; + +# Create applier failure +SET SESSION wsrep_on=OFF; +CREATE TABLE t1 (f1 INTEGER); + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); + +# node 2 should detect an error and leave the cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Make sure the GRA file produced is readable and contains the failure + +--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /pseudo_thread_id=[0-9]+/pseudo_thread_id=/ +--exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log + +# restart and reconnect node_2 +--source include/kill_galera.inc +--source include/wait_until_disconnected.inc +--source include/start_mysqld.inc + +--eval SET GLOBAL wsrep_ignore_apply_errors = $restore_wsrep_ignore_apply_errors +DROP TABLE t1; + +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on"); + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_gtid-master.opt b/mysql-test/suite/galera/t/galera_gtid-master.opt new file mode 100644 index 00000000..30317469 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid-master.opt @@ -0,0 +1 @@ +--log-bin --log-slave-updates --loose-new-servers-for-galera_gtid-test diff --git a/mysql-test/suite/galera/t/galera_gtid.cnf b/mysql-test/suite/galera/t/galera_gtid.cnf new file mode 100644 index 00000000..8f6a760d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin +log-slave-updates + +[mysqld.2] +log-bin +log-slave-updates + diff --git a/mysql-test/suite/galera/t/galera_gtid.test b/mysql-test/suite/galera/t/galera_gtid.test new file mode 100644 index 00000000..560a3202 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid.test @@ -0,0 +1,31 @@ +# +# Test GTID for basic Galera operations +# + +--source include/have_log_bin.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY); + +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1 +--source include/wait_condition.inc + +UPDATE t1 SET f1 = 2; + +--let $gtid_binlog_state_node2 = `SELECT @@global.gtid_binlog_state;` + +--connection node_1 +SET SESSION wsrep_sync_wait = 15; +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2 +--source include/wait_condition.inc +SELECT * from t1; + +--disable_query_log +--eval SELECT '$gtid_binlog_state_node2' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_gtid_slave.cnf b/mysql-test/suite/galera/t/galera_gtid_slave.cnf new file mode 100644 index 00000000..112c4878 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW +[mysqld.1] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 +[mysqld.2] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 +[mysqld.3] +gtid-domain-id=2 diff --git a/mysql-test/suite/galera/t/galera_gtid_slave.test b/mysql-test/suite/galera/t/galera_gtid_slave.test new file mode 100644 index 00000000..df55ea03 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave.test @@ -0,0 +1,92 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# suite/galera/t/galera_as_slave_gtid.cnf has the GTID options +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); + +#multi stmt trans +begin; +insert into t2 values(21); +insert into t2 values(22); +commit; + +SELECT @@global.gtid_binlog_state; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 2 FROM t2; +--source include/wait_condition.inc + +INSERT INTO t1 VALUES(2); +INSERT INTO t1 VALUES(3); +SELECT @@global.gtid_binlog_state; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 3 FROM t1; +--source include/wait_condition.inc + +INSERT INTO t1 VALUES(4); +SELECT @@global.gtid_binlog_state; + +--connection node_3 +DROP TABLE t1,t2; + +# +# Unfortunately without the sleep below the following statement fails with "query returned no rows", which +# is difficult to understand given that it is an aggregate query. A "query execution was interrupted" +# warning is also reported by MTR, which is also weird. +# + +--sleep 1 + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_2 +STOP SLAVE; +RESET SLAVE ALL; +SET GLOBAL wsrep_on=OFF; +reset master; +SET GLOBAL wsrep_on=ON; + +--connection node_1 +SET GLOBAL wsrep_on=OFF; +reset master; +SET GLOBAL wsrep_on=ON; + +--connection node_3 +reset master; diff --git a/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf new file mode 100644 index 00000000..efeb536d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf @@ -0,0 +1,18 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW +wsrep_sst_method=rsync +[mysqld.1] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 +[mysqld.2] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 +[mysqld.3] +gtid-domain-id=2 + diff --git a/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test new file mode 100644 index 00000000..d03445d5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test @@ -0,0 +1,199 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source include/big_test.inc +--source include/have_innodb.inc +--source include/galera_cluster.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--echo #Connection 2 +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3,master_use_gtid=slave_pos; +--enable_query_log +START SLAVE; +--sleep 1 + +--echo #Connection 3 +--connection node_3 +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 int unique) ENGINE=InnoDB; +INSERT INTO t2 VALUES(1,11); +INSERT INTO t2 VALUES(2,22); +INSERT INTO t2 VALUES(3,33); + +SELECT @@global.gtid_binlog_state; +--source include/save_master_gtid.inc +--echo #Connection 2 +--connection node_2 +--source include/sync_with_master_gtid.inc +SELECT @@global.gtid_binlog_state; + +INSERT INTO t2 VALUES(4,44); +INSERT INTO t2 VALUES(5,55); +INSERT INTO t2 VALUES(6,66); +SELECT @@global.gtid_binlog_state; +--echo #Connection 1 +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= 't2'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 6 FROM t2; +--source include/wait_condition.inc + +INSERT INTO t2 VALUES(7,77); +INSERT INTO t2 VALUES(8,88); +SELECT @@global.gtid_binlog_state; + +#Perform SST +--echo #Connection 3 +--connection node_3 +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +--source include/save_master_gtid.inc +--echo #Connection 2 +--connection node_2 +--source include/sync_with_master_gtid.inc +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +--echo #Connection 1 +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc +--let $node_1= node_1 +--let $node_2= node_2 +--source include/auto_increment_offset_save.inc +--echo #Connection 2 +--connection node_2 +--echo Shutting down server ... +--source include/shutdown_mysqld.inc +--echo #Connection 1 +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +--echo #Connection 2 +--connection node_2 +--echo Starting server ... +--source include/start_mysqld.inc + +--source include/wait_until_ready.inc +--source include/auto_increment_offset_restore.inc + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +--echo #Connection 1 +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 8 FROM t1; +--source include/wait_condition.inc +Select * from t1 order by f1; +--echo #Connection 2 +--connection node_2 +Select * from t1 order by f1; + +#SST Done +--sleep 1 +--echo #Connection 1 +--connection node_1 +SELECT @@global.gtid_binlog_state; +--echo #Connection 2 +--connection node_2 +SELECT @@global.gtid_binlog_state; +--echo #Connection 3 +--connection node_3 +SET AUTOCOMMIT=ON; +#drop table t1; +#CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +--echo #Connection 2 +--connection node_2 +SET AUTOCOMMIT=ON; +--echo #Connection 1 +--connection node_1 +SET AUTOCOMMIT=ON; + +# +#stop slave on node 2 +--echo #Connection 2 +--connection node_2 +STOP slave; +--sleep 1 +INSERT INTO t1 VALUES ('node2_slave_stoped'); +--echo #Connection 3 +--connection node_3 +INSERT INTO t1 VALUES ('node3_normal_entry'); +--source include/save_master_gtid.inc + +#start slave +--echo #Connection 2 +--connection node_2 +INSERT INTO t1 VALUES ('node2_slave_stoped_inserted'); +start slave; +--source include/sync_with_master_gtid.inc +INSERT INTO t1 VALUES ('node2_slave_started'); +SELECT count(*) from t1; +SELECT @@global.gtid_binlog_state; +--echo #Connection 1 +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 12 FROM t1; +--source include/wait_condition.inc +SELECT count(*) from t1; +SELECT @@global.gtid_binlog_state; +--echo #Connection 3 +--connection node_3 +DROP TABLE t2,t1; + +# Unfortunately without the sleep below the following statement fails with "query returned no rows", which +# is difficult to understand given that it is an aggregate query. A "query execution was interrupted" +# warning is also reported by MTR, which is also weird. +# + +--sleep 3 +--echo #Connection 2 +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc +--echo #Connection 1 +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--echo #Connection 2 +--connection node_2 +STOP SLAVE; +RESET SLAVE ALL; +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--disable_warnings +set global gtid_slave_pos=""; +--enable_warnings + +--echo #Connection 1 +--connection node_1 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; +--echo #Connection 3 +--connection node_3 +reset master; diff --git a/mysql-test/suite/galera/t/galera_gtid_trx_conflict.cnf b/mysql-test/suite/galera/t/galera_gtid_trx_conflict.cnf new file mode 100644 index 00000000..5f129e7c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_trx_conflict.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW +[mysqld.1] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 +[mysqld.2] +gtid-domain-id=1 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=1 diff --git a/mysql-test/suite/galera/t/galera_gtid_trx_conflict.test b/mysql-test/suite/galera/t/galera_gtid_trx_conflict.test new file mode 100644 index 00000000..27539b2a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_trx_conflict.test @@ -0,0 +1,56 @@ +# +# Test galera GTID with conflicting trx and @@wsrep_gtid_seq_no set on one node. +# + +--source include/galera_cluster.inc +--source include/have_log_bin.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_1 +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO t1 VALUES(1); + +--connection node_2 +SET AUTOCOMMIT = OFF; +SET @@wsrep_gtid_seq_no = 100; +START TRANSACTION; +INSERT INTO t1 VALUES(1); + +--connection node_1 +COMMIT; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +--echo # Expected GTID value 1-1-2 on both nodes +SELECT @@gtid_binlog_state; + +SET AUTOCOMMIT = ON; +INSERT INTO t1 VALUES(2); + +--echo # Expected GTID value 1-1-100 on both nodes, seqno is set with wsrep_gtid_seq_no +SELECT @@gtid_binlog_state; + +--connection node_1 +SELECT @@gtid_binlog_state; + +SET AUTOCOMMIT = ON; +INSERT INTO t1 VALUES(3); + +--echo # Expected GTID value 1-1-101 on both nodes +SELECT @@gtid_binlog_state; + +--connection node_2 +SELECT @@gtid_binlog_state; + + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_inject_bf_long_wait.test b/mysql-test/suite/galera/t/galera_inject_bf_long_wait.test new file mode 100644 index 00000000..f4aac7fd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_inject_bf_long_wait.test @@ -0,0 +1,25 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1(id int not null primary key, b int) engine=InnoDB; +INSERT INTO t1 VALUES (0,0),(1,1),(2,2),(3,3); + +BEGIN; +--send UPDATE t1 set b = 100 where id between 1 and 2; + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +SET @save_dbug = @@SESSION.debug_dbug; +SET @@SESSION.innodb_lock_wait_timeout=2; +SET @@SESSION.debug_dbug = '+d,wsrep_instrument_BF_lock_wait'; +--error ER_LOCK_WAIT_TIMEOUT +UPDATE t1 set b = 200 WHERE id = 1; +SET @@SESSION.debug_dbug = @save_dbug; + +--connection node_1 +--reap +COMMIT; +SELECT * FROM t1; +--disconnect node_1b +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_insert_ignore.test b/mysql-test/suite/galera/t/galera_insert_ignore.test new file mode 100644 index 00000000..027f70e9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_insert_ignore.test @@ -0,0 +1,60 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_sync_wait_orig = (SELECT @@wsrep_sync_wait) +SET GLOBAL wsrep_sync_wait = 15; + +--connection node_2 +SET GLOBAL wsrep_sync_wait = 15; + + +# +# INSERT IGNORE with PRIMARY KEY +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +INSERT IGNORE INTO t1 VALUES (1), (2); +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; + +# +# INSERT IGNORE ... SELECT +# + +--connection node_2 +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0), (2), (3); +INSERT IGNORE INTO t1 SELECT f1 FROM t2; + +SELECT * FROM t1; +--connection node_1 +SELECT * FROM t1; + +# +# INSERT IGNORE with UNIQUE + NULLs +# + +--connection node_2 +CREATE TABLE t3 (f1 INTEGER UNIQUE) Engine=InnoDB; +INSERT INTO t3 VALUES (NULL); + +--connection node_1 +INSERT IGNORE INTO t3 VALUES (1), (NULL), (2); +SELECT * FROM t3; + +--connection node_2 +SELECT * FROM t3; + +--eval SET GLOBAL wsrep_sync_wait = $wsrep_sync_wait_orig + +--connection node_1 +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +--eval SET GLOBAL wsrep_sync_wait = $wsrep_sync_wait_orig + diff --git a/mysql-test/suite/galera/t/galera_insert_multi.test b/mysql-test/suite/galera/t/galera_insert_multi.test new file mode 100644 index 00000000..d62283af --- /dev/null +++ b/mysql-test/suite/galera/t/galera_insert_multi.test @@ -0,0 +1,122 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Multi-row INSERT with a PK +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2); + +--connection node_2 +INSERT INTO t1 VALUES (3),(4); + +--connection node_1 +SELECT COUNT(*) = 4 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 4 FROM t1; + +DROP TABLE t1; + +# +# Multi-row INSERT without a PK +# + +--connection node_2 +CREATE TABLE t1 (f1 INTEGER, KEY (f1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(1); + +--connection node_1 +INSERT INTO t1 VALUES (2),(2); + +--connection node_2 +SELECT COUNT(*) = 4 FROM t1; + +--connection node_1 +SELECT COUNT(*) = 4 FROM t1; + +DROP TABLE t1; + +# +# Error in the middle of a multi-row INSERT +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (1); + +SELECT COUNT(*) = 0 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +DROP TABLE t1; + +# +# Deadlock +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO t1 VALUES (1), (2); + +--connection node_2 +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO t1 VALUES (2), (1); + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +# Workaround for mysql-wsrep#39 Transaction receives deadlock error twice in row +--error 0,ER_LOCK_DEADLOCK +ROLLBACK; + +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (1), (2); + +DROP TABLE t1; + +# +# Rollback +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +START TRANSACTION; +INSERT INTO t1 VALUES (1), (2); + +--connection node_2 +START TRANSACTION; +INSERT INTO t1 VALUES (2), (1); + +--connection node_1 +ROLLBACK; + +--connection node_2 +COMMIT; +SELECT COUNT(*) = 2 FROM t1; + +--connection node_1 +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; + + + + + + + diff --git a/mysql-test/suite/galera/t/galera_ist_mariabackup.cnf b/mysql-test/suite/galera/t/galera_ist_mariabackup.cnf new file mode 100644 index 00000000..f03527dc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_mariabackup.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth=root: + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=mbstream diff --git a/mysql-test/suite/galera/t/galera_ist_mariabackup.test b/mysql-test/suite/galera/t/galera_ist_mariabackup.test new file mode 100644 index 00000000..6ef4f65c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_mariabackup.test @@ -0,0 +1,16 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_disconnect_slave.inc +--source suite/galera/include/galera_st_shutdown_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.cnf b/mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.cnf new file mode 100644 index 00000000..e4f52aaa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth=root: + +innodb_flush_log_at_trx_commit=0 + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.test b/mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.test new file mode 100644 index 00000000..fd362a26 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_mariabackup_innodb_flush_logs.test @@ -0,0 +1,13 @@ +# +# This test performs server kill and IST while innodb_flush_logs_on_trx_commit = 0 +# This confirms that IST can properly catch up even in the face of relaxed single-node durability +# +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc diff --git a/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf b/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf new file mode 100644 index 00000000..807829f0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_mysqldump.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +# We do not set mysqldump-related SST options here because doing so on startup +# causes the first MTR connection to be forefully dropped by Galera, which in turn confuses MTR + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_ist_mysqldump.test b/mysql-test/suite/galera/t/galera_ist_mysqldump.test new file mode 100644 index 00000000..7bfca033 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_mysqldump.test @@ -0,0 +1,24 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--source suite/galera/include/galera_sst_set_mysqldump.inc + +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*"); + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# mysql-wsrep#33 - nnoDB: Failing assertion: xid_seqno > trx_sys_cur_xid_seqno in trx_sys_update_wsrep_checkpoint with mysqldump IST +# --source suite/galera/include/galera_st_disconnect_slave.inc + +# We set the required mysqldump SST options here so that they are used every time the server is restarted during the test +--let $start_mysqld_params = --wsrep_sst_auth=sst:sst --wsrep_sst_method=mysqldump --wsrep-sst-receive-address=127.0.0.1:$NODE_MYPORT_2 --skip-grant-tables + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +--source include/auto_increment_offset_restore.inc +--source suite/galera/include/galera_sst_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ist_progress.cnf b/mysql-test/suite/galera/t/galera_ist_progress.cnf new file mode 100644 index 00000000..0a26f6d6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_progress.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/galera_ist_progress.test b/mysql-test/suite/galera/t/galera_ist_progress.test new file mode 100644 index 00000000..3d7c53bd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_progress.test @@ -0,0 +1,77 @@ +# +# Test progress output during IST +# + +--source include/galera_cluster.inc +# This could cause out of storage if run /dev/shm +--source include/big_test.inc +--source include/force_restart.inc + +# Isolate node #2 +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +SET SESSION wsrep_on = OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SET SESSION wsrep_on = ON; + +# Node #2 is now isolated. Run some transactions to accumulate writesets for IST + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); + +# Restore node #2, IST is performed + +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# +# Grep for expected IST output in joiner log +# + +--connection node_1 + +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = Need state transfer + +--let $assert_text = Receiving IST: 13 writesets, seqnos 3-15 +--let $assert_select = Receiving IST: 13 writesets, seqnos 3-15 +--source include/assert_grep.inc + +--let $assert_text = Receiving IST\.\.\. 0\.0% \( 0/13 events\) complete +--let $assert_select = Receiving IST\.\.\. 0\.0% \( 0/13 events\) complete +--source include/assert_grep.inc + +--let $assert_text = Receiving IST\.\.\.100\.0% \(13/13 events\) complete +--let $assert_select = Receiving IST\.\.\.100\.0% \(13/13 events\) complete +--source include/assert_grep.inc + +# Cleanup + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ist_recv_bind.cnf b/mysql-test/suite/galera/t/galera_ist_recv_bind.cnf new file mode 100644 index 00000000..2628f05e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_recv_bind.cnf @@ -0,0 +1,8 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;ist.recv_bind=127.0.0.1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;ist.recv_bind=127.0.0.1' + diff --git a/mysql-test/suite/galera/t/galera_ist_recv_bind.test b/mysql-test/suite/galera/t/galera_ist_recv_bind.test new file mode 100644 index 00000000..a339684c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_recv_bind.test @@ -0,0 +1,55 @@ +# +# Test ist.recv_bind option. Since MTR can not do proper testing with multiple interfaces and such, we +# simply confirm that the option can be set (in the galera_ist_recv_bind.cnf file) and that IST works as expected +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +--connection node_1 +SELECT @@wsrep_provider_options LIKE '%ist.recv_bind = 127.0.0.1%'; + +--connection node_2 +SELECT @@wsrep_provider_options LIKE '%ist.recv_bind = 127.0.0.1%'; + +# Isolate node #2 + +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +SET SESSION wsrep_on = OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SET SESSION wsrep_on = ON; + +# Node #2 is now isolated. Run some transactions to accumulate writesets for IST + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +# Restore node #2 + +--connection node_2 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# Confirm that IST has taken place + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +# Cleanup + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ist_restart_joiner.cnf b/mysql-test/suite/galera/t/galera_ist_restart_joiner.cnf new file mode 100644 index 00000000..10958aad --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_restart_joiner.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_ist_restart_joiner.test b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test new file mode 100644 index 00000000..f56d0e65 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_restart_joiner.test @@ -0,0 +1,111 @@ +# +# Test that a joiner performing IST can be killed and restarted with no adverse consequences. +# This is achieved by using the recv_IST_after_apply_trx Galera dbug sync point to block IST after +# one transaction has been applied. When IST blocks, we kill and restart the joiner +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc +# This could cause out of storage if run /dev/shm +--source include/big_test.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); +INSERT INTO t1 VALUES (1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a'),(6, 'a'); + +# Disconnect node #2 +--connection node_2 +SET SESSION wsrep_sync_wait=0; +--source suite/galera/include/galera_stop_replication.inc + +--connection node_1 +UPDATE t1 SET f2 = 'b' WHERE f1 > 1; + +# Wait until node #1 has left +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +UPDATE t1 SET f2 = 'c' WHERE f1 > 2; + +--connection node_2 +# Write file to make mysql-test-run.pl expect the crash, but don't start it +--let $_server_id= `SELECT @@server_id` +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect +--exec echo "wait" > $_expect_file_name + +--let KILL_NODE_PIDFILE = `SELECT @@pid_file` + +# ... and restart provider to force IST +--echo Loading wsrep_provider ... +--disable_query_log +# Make sure IST will block ... +--let $galera_sync_point = recv_IST_after_apply_trx +--source include/galera_set_sync_point.inc +--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; +--enable_query_log + +SET SESSION wsrep_on=OFF; +--let $wait_condition = SELECT VARIABLE_VALUE = 'recv_IST_after_apply_trx' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters'; +--source include/wait_condition.inc +SET SESSION wsrep_on=ON; + +--connection node_1 +# Perform DML while IST is in progress +UPDATE t1 SET f2 = 'd' WHERE f1 > 3; + +# Kill node #2 while IST is in progress +--connection node_2 + +# Kill the connected server +--disable_reconnect + +--perl + my $pid_filename = $ENV{'KILL_NODE_PIDFILE'}; + my $mysqld_pid = `cat $pid_filename`; + chomp($mysqld_pid); + system("kill -9 $mysqld_pid"); + exit(0); +EOF + +--source include/wait_until_disconnected.inc + +--connection node_1 +--source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Perform DML while node #2 is down +UPDATE t1 SET f2 = 'e' WHERE f1 > 4; + +--connection node_2 + +--let $galera_wsrep_recover_server_id=2 +--source suite/galera/include/galera_wsrep_recover.inc + +--echo Starting server ... +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connection node_1 +UPDATE t1 SET f2 = 'f' WHERE f1 > 5; +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc + diff --git a/mysql-test/suite/galera/t/galera_ist_rsync.cnf b/mysql-test/suite/galera/t/galera_ist_rsync.cnf new file mode 100644 index 00000000..7a3da6da --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_rsync.cnf @@ -0,0 +1,12 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' +wsrep_sync_wait=1 + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' +wsrep_sync_wait=1 diff --git a/mysql-test/suite/galera/t/galera_ist_rsync.test b/mysql-test/suite/galera/t/galera_ist_rsync.test new file mode 100644 index 00000000..1da79cd4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ist_rsync.test @@ -0,0 +1,13 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc +--source suite/galera/include/galera_st_disconnect_slave.inc +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_kill_applier.test b/mysql-test/suite/galera/t/galera_kill_applier.test new file mode 100644 index 00000000..4136bac5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_applier.test @@ -0,0 +1,46 @@ +# +# This test checks that applier threads are immune to KILL QUERY and KILL STATEMENT +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/force_restart.inc + +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +--let $wait_condition = SELECT COUNT(*) >= 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; +--let $wait_condition_on_error_output = SELECT COUNT(*), 2 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist +--source include/wait_condition_with_debug.inc + +--let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle' LIMIT 1` + +--disable_query_log +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL $applier_thread + +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL QUERY $applier_thread + +--let $aborter_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep aborter idle' LIMIT 1` + +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL $aborter_thread + +--error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--eval KILL QUERY $aborter_thread +--enable_query_log + +SET GLOBAL wsrep_slave_threads=1; + +--connection node_1 +create table t1(a int not null primary key) engine=innodb; +insert into t1 values (1); +insert into t1 values (2); + +--connection node_2 +set global wsrep_sync_wait=15; +select count(*) from t1; + +--connection node_1 +drop table t1; diff --git a/mysql-test/suite/galera/t/galera_kill_ddl.test b/mysql-test/suite/galera/t/galera_kill_ddl.test new file mode 100644 index 00000000..1034b81e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_ddl.test @@ -0,0 +1,53 @@ +# +# This test kill -9-s a slave while small updates have been performed on the master. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +call mtr.add_suppression("WSREP: Last Applied Action message in non-primary configuration from member .*"); + +# Enable the master to continue running during the split-brain situation that +# occurs when the slave is killed +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; + +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +--source include/kill_galera.inc + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_2 +--source include/start_mysqld.inc + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='t1'; + +--connection node_1 +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_kill_largechanges.test b/mysql-test/suite/galera/t/galera_kill_largechanges.test new file mode 100644 index 00000000..c671764f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_largechanges.test @@ -0,0 +1,50 @@ +# +# This test kill -9-s a slave while a large update has been performed on the master. SST is performed. +# + +--source include/big_test.inc +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +# Enable the master to continue running during the split-brain situation that +# occurs when the slave is killed +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; + +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10),(11); +CREATE TABLE t1 (f1 VARCHAR(128)) ENGINE=InnoDB; + +--connection node_2 +--source include/kill_galera.inc + +--connection node_1 +# We create a 128Mb (or so) transaction that is larger than gcache. The size of the gcache is not adjustable dynamically +INSERT INTO t1 SELECT REPEAT('a', 128) FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6; + +--connection node_2 +--source include/start_mysqld.inc + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a + +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log + +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_kill_nochanges.test b/mysql-test/suite/galera/t/galera_kill_nochanges.test new file mode 100644 index 00000000..aa1648ca --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_nochanges.test @@ -0,0 +1,40 @@ +# +# This test kill -9-s a slave while no updates have been performed on the master. +# + +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--source include/kill_galera.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status' +--source include/wait_condition.inc + +SET SESSION wsrep_sync_wait = DEFAULT; + +--connection node_2 +--source include/start_mysqld.inc + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a + +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_kill_smallchanges.test b/mysql-test/suite/galera/t/galera_kill_smallchanges.test new file mode 100644 index 00000000..15e1727d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_smallchanges.test @@ -0,0 +1,46 @@ +# +# This test kill -9-s a slave while small updates have been performed on the master. +# + +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 + +# Enable the master to continue running during the split-brain situation that +# occurs when the slave is killed +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; + +--connection node_2 +--source include/kill_galera.inc + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +--source include/start_mysqld.inc + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a + +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log + +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_last_committed_id.cnf b/mysql-test/suite/galera/t/galera_last_committed_id.cnf new file mode 100644 index 00000000..375d2480 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_last_committed_id.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=100 + +[mysqld.2] +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=100 diff --git a/mysql-test/suite/galera/t/galera_last_committed_id.combinations b/mysql-test/suite/galera/t/galera_last_committed_id.combinations new file mode 100644 index 00000000..dd92b9fa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_last_committed_id.combinations @@ -0,0 +1,6 @@ +[binlogoff] + +[binlogon] +--log-bin=master-bin +--log-bin-index=master-bin +--log-slave-updates diff --git a/mysql-test/suite/galera/t/galera_last_committed_id.test b/mysql-test/suite/galera/t/galera_last_committed_id.test new file mode 100644 index 00000000..b6e3e1f7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_last_committed_id.test @@ -0,0 +1,66 @@ +# +# Tests functions WSREP_LAST_WRITTEN_GTID and WSREP_LAST_SEEN_GTID +# + +--source include/galera_cluster.inc + +# Returns domain-server-0 if no transactions have been run + +SELECT WSREP_LAST_WRITTEN_GTID(); + +# WSREP_LAST_WRITTEN_GTID() should not be influenced by transactions written +# on other nodes or connections + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--disable_query_log +--let $wsrep_last_written_id_conn_1 = `SELECT WSREP_LAST_WRITTEN_GTID()` +--enable_query_log + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +--connection node_1a +--eval SELECT WSREP_LAST_WRITTEN_GTID() != '$wsrep_last_written_id_conn_1' AS wsrep_written_does_not_match_different_conn + +--connection node_2 +--eval SELECT WSREP_LAST_WRITTEN_GTID() != '$wsrep_last_written_id_conn_1' AS wsrep_written_does_not_match_different_nodes + +# WSREP_LAST_SEEN_GTID() should be influenced by transactions written +# on other connections + +--connection node_1 +INSERT INTO t1 VALUES (1); +--disable_query_log +--let $wsrep_last_written_id_conn_1 = `SELECT WSREP_LAST_WRITTEN_GTID()` +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SELECT WSREP_LAST_SEEN_GTID() = '$wsrep_last_written_id_conn_1' AS wsrep_last_written_seen_id_match +--enable_query_log + +# Should not advance while a transaction is in progress + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +--disable_query_log +--let $wsrep_last_written_id_before = `SELECT WSREP_LAST_WRITTEN_GTID()` +--enable_query_log +INSERT INTO t1 VALUES (1); +--disable_query_log +--eval SELECT WSREP_LAST_SEEN_GTID() = '$wsrep_last_written_id_before' +--eval SELECT WSREP_LAST_WRITTEN_GTID() = '$wsrep_last_written_id_before' AS wsrep_last_written_id_match +--enable_query_log + +# Should only advance after the transaction has been commited + +COMMIT; +--disable_query_log +--eval SELECT WSREP_LAST_WRITTEN_GTID() != 'wsrep_last_written_id_before' AS wsrep_last_written_id_advanced +--enable_query_log +SET AUTOCOMMIT=ON; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_load_data.cnf b/mysql-test/suite/galera/t/galera_load_data.cnf new file mode 100644 index 00000000..7d152b21 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_load_data.cnf @@ -0,0 +1,17 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +secure-file-priv = "" +innodb_file_per_table = ON +innodb_stats_persistent=ON +innodb_stats_auto_recalc=ON +innodb_stats_persistent_sample_pages=20 +innodb_stats_transient_sample_pages=8 + +[mysqld.2] +secure-file-priv = "" +innodb_file_per_table = ON +innodb_stats_persistent=ON +innodb_stats_auto_recalc=ON +innodb_stats_persistent_sample_pages=20 +innodb_stats_transient_sample_pages=8 diff --git a/mysql-test/suite/galera/t/galera_load_data.test b/mysql-test/suite/galera/t/galera_load_data.test new file mode 100644 index 00000000..c37920a4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_load_data.test @@ -0,0 +1,100 @@ +--source include/galera_cluster.inc + +--connection node_1 + +create database cardtest02; +use cardtest02; + +CREATE TABLE cardtest_tbl ( + `id` bigint(18) NOT NULL AUTO_INCREMENT, + `course` bigint(18) NOT NULL, + `name` varchar(200) DEFAULT NULL, + `intro` longtext DEFAULT NULL, + `introformat` smallint(4) DEFAULT 0, + `timecreated` bigint(18) NOT NULL, + `timemodified` bigint(18) NOT NULL, + `grademethod` varchar(255) DEFAULT NULL, + `grade` decimal(10,5) DEFAULT NULL, + `updategradeoncompletion` tinyint(2) DEFAULT 1, + `competencyoncompletion` varchar(255) DEFAULT NULL, + `evaluationmethod` varchar(255) DEFAULT NULL, + `completionmethod` varchar(255) DEFAULT NULL, + `alloweddates` varchar(1024) DEFAULT NULL, + `allowedslots` varchar(1024) DEFAULT NULL, + `permissions` smallint(4) DEFAULT NULL, + `notifications` varchar(1024) DEFAULT NULL, + `type` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1324 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED; + +LOCK TABLES cardtest_tbl WRITE; +ALTER TABLE cardtest_tbl DISABLE KEYS; + +INSERT INTO cardtest_tbl VALUES (1,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(2,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(3,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(4,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(5,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(6,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(7,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(8,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(9,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(10,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(11,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(12,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(13,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(14,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(15,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(16,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(17,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(18,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(19,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(20,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(21,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(22,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(23,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(24,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(25,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(26,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(27,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(28,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(29,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(30,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(31,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(32,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(33,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(34,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(35,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(36,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(37,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(38,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(39,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(40,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(41,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(42,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(43,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(44,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(45,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(46,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(47,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(48,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(49,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(50,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(51,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(52,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(53,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(54,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(55,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(56,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(57,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(58,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(59,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(60,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(61,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(62,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(63,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(64,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(65,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(66,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(67,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(68,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(69,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(70,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(71,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(72,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(73,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(74,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(75,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(76,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(77,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(78,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(79,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(80,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(81,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(82,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(83,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(84,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(85,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(86,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(87,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(88,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(89,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(90,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(91,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(92,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(93,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(94,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(95,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(96,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(97,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(98,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(99,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(100,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(101,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(102,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(103,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(104,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(105,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(106,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(107,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(108,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(109,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(110,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(111,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(112,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(113,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(114,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(115,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(116,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(117,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(118,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(119,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(120,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(121,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(122,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(123,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(124,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(125,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(126,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(127,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(128,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(129,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(130,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(131,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(132,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(133,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(134,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(135,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(136,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(137,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(138,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(139,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(140,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(141,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(142,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(143,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(144,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(145,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(146,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(147,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(148,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(149,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(150,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(151,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(152,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(153,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(154,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(155,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(156,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(157,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(158,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(159,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(160,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(161,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(162,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(163,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(164,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(165,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(166,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(167,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(168,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(169,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(170,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(171,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(172,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(173,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(174,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(175,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(176,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(177,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(178,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(179,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(180,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(181,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(182,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(183,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(184,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(185,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(186,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(187,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(188,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(189,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(190,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(191,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(192,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(193,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(194,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(195,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(196,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(197,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(198,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(199,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(200,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(201,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(202,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(203,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(204,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(205,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(206,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(207,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(208,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(209,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(210,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(211,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(212,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(213,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(214,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(215,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(216,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(217,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(218,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(219,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(220,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(221,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(222,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(223,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(224,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(225,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(226,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(227,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(228,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(229,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(230,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(231,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(232,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(233,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(234,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(235,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(236,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(237,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(238,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(239,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(240,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(241,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(242,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(243,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(244,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(245,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(246,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(247,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(248,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(249,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(250,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(251,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(252,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(253,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(254,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(255,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(256,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(257,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(258,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(259,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(260,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(261,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(262,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(263,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(264,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(265,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(266,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(267,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(268,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(269,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(270,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(271,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(272,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(273,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(274,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(275,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(276,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(277,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(278,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(279,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(280,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(281,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(282,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(283,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(284,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(285,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(286,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(287,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(288,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(289,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(290,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(291,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(292,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(293,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(294,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(295,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(296,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(297,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(298,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(299,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(300,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(301,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL); + + +ALTER TABLE cardtest_tbl ENABLE KEYS; +UNLOCK TABLES; + +use cardtest02; +--sleep 20 + +let $cardinality1 = `SELECT cardinality from information_schema.statistics WHERE TABLE_NAME = 'cardtest_tbl'`; +let $table_rows1 = `SELECT table_rows from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`; +let $avg_row_length1 = `SELECT avg_row_length from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`; +let $data_length1 = `SELECT data_length from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`; + +--let $wait_timeout=600 +--let $wait_condition = SELECT COUNT(*) = 301 from cardtest_tbl; +--source include/wait_condition.inc + +ANALYZE TABLE cardtest_tbl; + +--let $wait_condition = SELECT table_rows = 301 from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_301 FROM cardtest_tbl; + +let $cardinality1 = `SELECT cardinality from information_schema.statistics WHERE TABLE_NAME = 'cardtest_tbl'`; +let $table_rows1 = `SELECT table_rows from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`; +let $avg_row_length1 = `SELECT avg_row_length from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`; +let $data_length1 = `SELECT data_length from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`; + +--connection node_2 +use cardtest02; + +--let $wait_timeout=600 +--let $wait_condition = SELECT COUNT(*) = 301 from cardtest_tbl; +--source include/wait_condition.inc + +ANALYZE TABLE cardtest_tbl; + +--source include/wait_condition.inc +--let $wait_condition = SELECT table_rows = 301 from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'; +--source include/wait_condition.inc +--let $wait_condition = SELECT cardinality = 301 from information_schema.statistics WHERE TABLE_NAME = 'cardtest_tbl'; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_301 FROM cardtest_tbl; + +if (`SELECT cardinality <> $cardinality1 from information_schema.statistics WHERE TABLE_NAME = 'cardtest_tbl'`) +{ +SELECT cardinality from information_schema.statistics WHERE TABLE_NAME = 'cardtest_tbl'; +} +if (`SELECT table_rows <> $table_rows1 from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`) +{ +SELECT table_rows from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'; +} +if (`SELECT avg_row_length <> $avg_row_length1 from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`) +{ +SELECT avg_row_length from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'; +} +if (`SELECT data_length <> $data_length1 from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'`) +{ +SELECT data_length from information_schema.tables WHERE TABLE_NAME = 'cardtest_tbl'; +} + +--connection node_1 +use test; +drop database cardtest02; + diff --git a/mysql-test/suite/galera/t/galera_lock_table.test b/mysql-test/suite/galera/t/galera_lock_table.test new file mode 100644 index 00000000..3e365036 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_lock_table.test @@ -0,0 +1,52 @@ +# +# Test that a LOCK TABLE on the slave will cause the applier thread to block, so no subsequent updates +# are replicated on the slave until UNLOCK TABLE is issued. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_sync_wait_orig = `SELECT @@wsrep_sync_wait` + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--sleep 1 + +--connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + +LOCK TABLE t1 READ; + +--connection node_1 +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +# We use a separate connection here so that we can SELECT from both tables +# without running into "table t2 was not locked" error. + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +SET SESSION wsrep_sync_wait=0; +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 0 FROM t2; + +--connection node_2 +UNLOCK TABLES; + +--disable_query_log +--eval SET SESSION wsrep_sync_wait=$wsrep_sync_wait_orig; +--enable_query_log + +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test b/mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test new file mode 100644 index 00000000..5cb73476 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_lock_tables_in_transaction.test @@ -0,0 +1,21 @@ +# +# Check `LOCK TABLES` command with or without existing table in database. +# Test case for MDEV-22222 / MDEV-22223 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +--error ER_NO_SUCH_TABLE +LOCK TABLES t2 READ; + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +LOCK TABLES t1 READ; +UNLOCK TABLES; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_log_bin.cnf b/mysql-test/suite/galera/t/galera_log_bin.cnf new file mode 100644 index 00000000..98e724fb --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin +log-slave-updates + +[mysqld.2] +log-bin +log-slave-updates diff --git a/mysql-test/suite/galera/t/galera_log_bin.inc b/mysql-test/suite/galera/t/galera_log_bin.inc new file mode 100644 index 00000000..cc78367b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin.inc @@ -0,0 +1,46 @@ +--source include/galera_cluster.inc +--source include/force_restart.inc + +--connection node_1 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; +--connection node_2 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +# +# Test Galera with --log-bin --log-slave-updates . +# This way the actual MySQL binary log is used, +# rather than Galera's own implementation +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TABLE t2 (id INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1); +INSERT INTO t2 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 2 FROM t2; + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +--let $MASTER_MYPORT=$NODE_MYPORT_1 +--source include/show_binlog_events.inc + +--connection node_2 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +--let $MASTER_MYPORT=$NODE_MYPORT_2 +--source include/show_binlog_events.inc + +DROP TABLE t1; +DROP TABLE t2; + +--echo #cleanup +--connection node_1 +SET GLOBAL wsrep_on=OFF; +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_log_bin.test b/mysql-test/suite/galera/t/galera_log_bin.test new file mode 100644 index 00000000..923bd623 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin.test @@ -0,0 +1 @@ +--source galera_log_bin.inc diff --git a/mysql-test/suite/galera/t/galera_log_bin_opt-master.opt b/mysql-test/suite/galera/t/galera_log_bin_opt-master.opt new file mode 100644 index 00000000..03fcb5d0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin_opt-master.opt @@ -0,0 +1 @@ +--log-slave-updates --log-bin diff --git a/mysql-test/suite/galera/t/galera_log_bin_opt.cnf b/mysql-test/suite/galera/t/galera_log_bin_opt.cnf new file mode 100644 index 00000000..3c14cde7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin_opt.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=mbstream diff --git a/mysql-test/suite/galera/t/galera_log_bin_opt.test b/mysql-test/suite/galera/t/galera_log_bin_opt.test new file mode 100644 index 00000000..f3d0afbc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin_opt.test @@ -0,0 +1,2 @@ +--source include/have_mariabackup.inc +--source galera_log_bin.inc diff --git a/mysql-test/suite/galera/t/galera_log_output_csv-master.opt b/mysql-test/suite/galera/t/galera_log_output_csv-master.opt new file mode 100644 index 00000000..2f71b140 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_output_csv-master.opt @@ -0,0 +1 @@ +--log-output=TABLE --log-queries-not-using-indexes --general-log --slow-query-log diff --git a/mysql-test/suite/galera/t/galera_log_output_csv.test b/mysql-test/suite/galera/t/galera_log_output_csv.test new file mode 100644 index 00000000..eeccc953 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_output_csv.test @@ -0,0 +1,26 @@ +# +# Test that --log-output=FILE works with Galera. +# The relevant options are set using a -master.opt file +# wsrep_replicate_myisam is not used as it crashes in MTR with mysql-wsrep#14 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +SELECT COUNT(*) > 0 FROM mysql.general_log; + +SELECT 1 = 1 FROM t1; +SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 1 = 1 FROM t1'; + +--connection node_2 + +SELECT 2 = 2 FROM t1; +SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 2 = 2 FROM t1'; + +--connection node_1 +DROP TABLE t1; +truncate table mysql.slow_log; +truncate table mysql.general_log; diff --git a/mysql-test/suite/galera/t/galera_many_columns.test b/mysql-test/suite/galera/t/galera_many_columns.test new file mode 100644 index 00000000..3f596179 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_many_columns.test @@ -0,0 +1,63 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--disable_query_log +SET @create_var1 = ""; +--let $count = 1017 +while ($count) +{ + --eval SET @create_var1 = CONCAT(@create_var1, "f", $count, " VARCHAR(3) DEFAULT 'ABC', ") + --dec $count +} + +--let $create_var = `SELECT @create_var1` +--eval CREATE TABLE t1 ($create_var PRIMARY KEY (f1, f1017)) ENGINE=InnoDB; +--enable_query_log + +INSERT INTO t1 (f1) VALUES (DEFAULT); + +--connection node_2 +SELECT f1 = 'ABC', f1017 = 'ABC' FROM t1; +UPDATE t1 SET f1 = 'XYZ', f1017 = 'XYZ' ; + +--connection node_1 +SELECT f1 = 'XYZ', f1017 = 'XYZ' FROM t1 WHERE f1 = 'XYZ' AND f1017 = 'XYZ'; + + +# Deadlock + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f2 = 'KLM' WHERE f1 = 'XYZ' AND f1017 = 'XYZ'; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f2 = 'CDE' WHERE f1 = 'XYZ' AND f1017 = 'XYZ'; +COMMIT; + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; +ROLLBACK; + +--connection node_2 +ROLLBACK; + +# Rollback + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 (f1, f1017) VALUES ('BCE','BCE'); +INSERT INTO t1 (f1, f1017) VALUES ('CED','CED'); +INSERT INTO t1 (f1, f1017) VALUES ('EDF','EDF'); +INSERT INTO t1 (f1, f1017) VALUES ('FED','FED'); +ROLLBACK; +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_many_indexes.test b/mysql-test/suite/galera/t/galera_many_indexes.test new file mode 100644 index 00000000..e01d0b23 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_many_indexes.test @@ -0,0 +1,74 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 VARCHAR(767) PRIMARY KEY) ENGINE=InnoDB; + +# MySQL complains about multiple identical indexes on the same column +--disable_warnings + +--let $count = 63 +while ($count) +{ + --disable_query_log + --eval SET @ddl_var1 = CONCAT("CREATE UNIQUE INDEX i", $count, " ON t1(f1)") + --let $ddl_var = `SELECT @ddl_var1` + --enable_query_log + --eval $ddl_var + --dec $count +} +--enable_warnings + +INSERT INTO t1 VALUES (REPEAT('a', 767)); +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT LENGTH(f1) = 767 FROM t1; + +EXPLAIN SELECT COUNT(*) = 1 FROM t1 FORCE KEY (PRIMARY) WHERE f1 = REPEAT('a', 767); +SELECT COUNT(*) = 1 FROM t1 FORCE KEY (PRIMARY) WHERE f1 = REPEAT('a', 767); + +EXPLAIN SELECT COUNT(*) = 1 FROM t1 FORCE KEY (i1) WHERE f1 = REPEAT('a', 767); +SELECT COUNT(*) = 1 FROM t1 FORCE KEY (i1) WHERE f1 = REPEAT('a', 767); + +EXPLAIN SELECT COUNT(*) = 1 FROM t1 FORCE KEY (i63) WHERE f1 = REPEAT('a', 767); +SELECT COUNT(*) = 1 FROM t1 FORCE KEY (i63) WHERE f1 = REPEAT('a', 767); + +INSERT INTO t1 VALUES (REPEAT('b', 767)); +ANALYZE TABLE t1; + +--connection node_1 +SELECT COUNT(*) = 2 FROM t1; +ANALYZE TABLE t1; +DELETE FROM t1 WHERE f1 = REPEAT('b', 767); + +# Rollback +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +SELECT COUNT(*) = 1 FROM t1; +INSERT INTO t1 (f1) VALUES (REPEAT('c', 767)); +ROLLBACK; +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +START TRANSACTION; +SET AUTOCOMMIT=OFF; +SELECT COUNT(*) = 1 FROM t1; + +# Deadlock +--connection node_1 +START TRANSACTION; +--connection node_2 +START TRANSACTION; + +--connection node_1 +UPDATE t1 SET f1 = REPEAT('e', 767); +--connection node_2 +UPDATE t1 SET f1 = REPEAT('f', 767); + +--connection node_1 +COMMIT; +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_many_rows.cnf b/mysql-test/suite/galera/t/galera_many_rows.cnf new file mode 100644 index 00000000..4e1022cf --- /dev/null +++ b/mysql-test/suite/galera/t/galera_many_rows.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf + +[mysqld] +innodb-status-output=ON +innodb-status-output-locks=ON diff --git a/mysql-test/suite/galera/t/galera_many_rows.test b/mysql-test/suite/galera/t/galera_many_rows.test new file mode 100644 index 00000000..bc9e99db --- /dev/null +++ b/mysql-test/suite/galera/t/galera_many_rows.test @@ -0,0 +1,59 @@ +--source include/big_test.inc +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +SET SESSION innodb_lock_wait_timeout=600; +SET SESSION lock_wait_timeout=600; + +CREATE TABLE ten (f1 INTEGER) engine=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB; +INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--let $wsrep_provider_options_node2 = `SELECT @@wsrep_provider_options` +SET SESSION wsrep_sync_wait = 15; + +SET GLOBAL wsrep_provider_options = 'repl.causal_read_timeout=PT1H'; + +SELECT COUNT(*) FROM t1; +INSERT INTO t1 (f2) SELECT a1.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--connection node_1 +SELECT COUNT(*) FROM t1; +UPDATE t1 SET f2 = 1; + +--connection node_2 +SELECT COUNT(*) FROM t1 WHERE f2 = 1; + +--connection node_1 +START TRANSACTION; +SELECT COUNT(*) FROM t1; +UPDATE t1 SET f2 = 3; + +--connection node_2 +START TRANSACTION; +UPDATE t1 SET f2 = 4; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_node2'; +--enable_query_log + +--source include/auto_increment_offset_restore.inc + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_many_tables_nopk.test b/mysql-test/suite/galera/t/galera_many_tables_nopk.test new file mode 100644 index 00000000..98a65b7c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_many_tables_nopk.test @@ -0,0 +1,109 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +if (!`SELECT @@open_files_limit >= 1024`){ + skip Need at least an open file limit of 1000; +} + +# +# This test forces 900 tables without a PK to participate in a single +# transaction. The reason for 900 is that some linux system has by default +# a limit of 1024 open files / process +# + +# +# First, create 900 tables +# + +--connection node_1 + +--let $count = 900 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("CREATE TABLE t", $count, " (f1 INTEGER) ENGINE=InnoDB")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +--let $count = 900 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("INSERT INTO t", $count, " VALUES (1234)")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +# +# Second, perform 900 updates +# + +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +--let $count = 900 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("UPDATE t", $count, " SET f1 = 1")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +COMMIT; + +# Third, confirm that all the inserts have arrived on the second node +# + +--connection node_2 +CREATE TABLE sum_table (f1 INTEGER); + +--let $count = 900 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("INSERT INTO sum_table SELECT COUNT(*) FROM t", $count)` + --eval $ddl_var + --enable_query_log + --dec $count +} + +SELECT SUM(f1) = 900 FROM sum_table; + +# +# Fourth, create a deadlock +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +--let $count = 900 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("UPDATE t", $count, " SET f1 = 2")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t900 SET f1 = 3; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP SCHEMA test; +CREATE SCHEMA test; diff --git a/mysql-test/suite/galera/t/galera_many_tables_pk.test b/mysql-test/suite/galera/t/galera_many_tables_pk.test new file mode 100644 index 00000000..73c5fc16 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_many_tables_pk.test @@ -0,0 +1,101 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +if (!`SELECT @@open_files_limit >= 1024`){ + skip Need at least an open file limit of 1024; +} + +# +# First, create 100 tables and make sure the DDLs are all propagated +# + +--connection node_1 + +--let $count = 100 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("CREATE TABLE t", $count, " (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +--connection node_2 +SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME LIKE 't%'; + +# +# Second, create a transaction that uses all those tables +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +--let $count = 100 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("INSERT INTO t", $count, " VALUES (1)")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +COMMIT; + +# +# Third, confirm that all the inserts have arrived on the second node +# + +--connection node_2 +CREATE TABLE sum_table (f1 INTEGER); + +--let $count = 100 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("INSERT INTO sum_table SELECT COUNT(*) FROM t", $count)` + --eval $ddl_var + --enable_query_log + --dec $count +} + +SELECT SUM(f1) = 100 FROM sum_table; + +# +# Fourth, create a deadlock +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +--let $count = 100 +while ($count) +{ + --disable_query_log + --let $ddl_var = `SELECT CONCAT("UPDATE t", $count, " SET f1 = 2")` + --eval $ddl_var + --enable_query_log + --dec $count +} + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t100 SET f1 = 3; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +--let $diff_servers = 1 2 +--source include/diff_servers.inc + +DROP SCHEMA test; +CREATE SCHEMA test; diff --git a/mysql-test/suite/galera/t/galera_mdev_10812.test b/mysql-test/suite/galera/t/galera_mdev_10812.test new file mode 100644 index 00000000..4539ab6c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_10812.test @@ -0,0 +1,27 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-10812: On COM_STMT_CLOSE/COM_QUIT, when wsrep_conflict_state +--echo # is ABORTED, it causes wrong response to be sent to the client +--echo # + +# First create a deadlock +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +CREATE TABLE t1(a INT PRIMARY KEY); +INSERT INTO t1 VALUES(1),(2),(3); +START TRANSACTION ; +UPDATE t1 SET a=a+100; + +--sleep 2 +--connection node_2 +UPDATE t1 SET a=a+100; + +--sleep 2 +--connection node_1a +# here we get deadlock error +--disconnect node_1a + +--connection node_2 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_mdev_13787.cnf b/mysql-test/suite/galera/t/galera_mdev_13787.cnf new file mode 100644 index 00000000..ada78e1d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_13787.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +innodb-stats-persistent=1 + +[mysqld.2] +innodb-stats-persistent=1 + + diff --git a/mysql-test/suite/galera/t/galera_mdev_13787.test b/mysql-test/suite/galera/t/galera_mdev_13787.test new file mode 100644 index 00000000..940cffb8 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_13787.test @@ -0,0 +1,6 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--connection node_1 +create table t(a int); +insert into t select 1; +DROP TABLE t; diff --git a/mysql-test/suite/galera/t/galera_mdev_15611.cnf b/mysql-test/suite/galera/t/galera_mdev_15611.cnf new file mode 100644 index 00000000..b6f601c5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_15611.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf +[mysqld.1] + +[mysqld.2] +wsrep_slave_threads=6 diff --git a/mysql-test/suite/galera/t/galera_mdev_15611.test b/mysql-test/suite/galera/t/galera_mdev_15611.test new file mode 100644 index 00000000..d32d7e75 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_15611.test @@ -0,0 +1,30 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE t1 ( + id int primary key +); + +CREATE TABLE t2 ( + id int primary key , + f_id int DEFAULT NULL, FOREIGN KEY(f_id) REFERENCES t1 (id) +); + +insert into t1 select 1; + +--disable_query_log +--let $count=200 +--echo #Running 200 insert in t2 table +while($count) +{ + #Repeatedly execute the following SQL until you generate thousands of data + --eval insert into t2 values ($count, 1); + --dec $count +} +--enable_query_log + +select count(*) from t2; +delete from t2; +delete from t1; +drop table t2,t1; diff --git a/mysql-test/suite/galera/t/galera_mdl_race.test b/mysql-test/suite/galera/t/galera_mdl_race.test new file mode 100644 index 00000000..ad6770f9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdl_race.test @@ -0,0 +1,72 @@ +# +# This test tests a potential race condition in MDL locking +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (2, 'a'); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = 'b' WHERE f1 = 1; + +# block access to t2 +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +LOCK TABLE t2 WRITE; + +# Block before MLD lock wait +--connection node_1 + SET @@debug_dbug = "d,sync.wsrep_before_mdl_wait"; +--send SELECT * FROM t2; + +# Wait for SELECT to be blocked +--connection node_1a +#--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIS WHERE STATE = 'System lock'; +#--source include/wait_condition.inc +#--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'init' AND INFO = 'COMMIT'; +#--source include/wait_condition.inc + +# block applier to wait after BF victim is locked +SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock"; + +# Issue a conflicting update on node #2 +--connection node_2 +UPDATE t1 SET f2 = 'c' WHERE f1 = 1; + +# Unblock the SELECT, to enter wsrep_thd_is_BF +--connection node_1a +SET @@debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_before_mdl_wait"; + +# unblock applier to try to BF the SELECT +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock"; + +# table lock is not needed anymore +UNLOCK TABLES; + +# SELECT succeeds +--connection node_1 + +--error ER_LOCK_DEADLOCK +--reap + +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; + +DROP TABLE t1; +DROP TABLE t2; + +--connection node_1a +SET DEBUG_SYNC = "RESET"; + diff --git a/mysql-test/suite/galera/t/galera_multi_database.test b/mysql-test/suite/galera/t/galera_multi_database.test new file mode 100644 index 00000000..6e06aaaa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_multi_database.test @@ -0,0 +1,43 @@ +# +# Test that identical updates can be delivered to two separate +# databases without this causing a certification conflict +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE DATABASE d1; +CREATE TABLE d1.t1(f1 INTEGER) ENGINE=InnoDB; + +CREATE DATABASE d2; +CREATE TABLE d2.t1(f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO d1.t1 VALUES (1); + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO d2.t1 VALUES (1); + +--connection node_1 +COMMIT; + +--connection node_2 +COMMIT; + +SELECT COUNT(*) = 1 FROM d1.t1; +SELECT COUNT(*) = 1 FROM d2.t1; + +--connection node_1 + +SELECT COUNT(*) = 1 FROM d1.t1; +SELECT COUNT(*) = 1 FROM d2.t1; + +DROP TABLE d1.t1; +DROP TABLE d2.t1; + +DROP DATABASE d1; +DROP DATABASE d2; diff --git a/mysql-test/suite/galera/t/galera_multirow_rollback.combinations b/mysql-test/suite/galera/t/galera_multirow_rollback.combinations new file mode 100644 index 00000000..1ce3b45a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_multirow_rollback.combinations @@ -0,0 +1,4 @@ +[binlogon] +log-bin + +[binlogoff] diff --git a/mysql-test/suite/galera/t/galera_multirow_rollback.test b/mysql-test/suite/galera/t/galera_multirow_rollback.test new file mode 100644 index 00000000..a5aaedd8 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_multirow_rollback.test @@ -0,0 +1,89 @@ +# +# Test multirow insert rollback +# + +--source include/galera_cluster.inc + +# +# Case 1: error on multirow insert results in empty transaction +# +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY DEFAULT 0, f2 char(12)); + +--connection node_1 +START TRANSACTION; +--error ER_DUP_ENTRY +INSERT INTO t1 (f2) VALUES ('a'), ('b'); +COMMIT; + +SELECT COUNT(*) AS expect_0 FROM t1; + +--connection node_2 +SELECT COUNT(*) AS expect_0 FROM t1; + +DROP TABLE t1; + + +# +# Case 2: error on multirow insert does not affect previous statements +# +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY DEFAULT 0, f2 char(12)); + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (2, 'b'); +--error ER_DUP_ENTRY +INSERT INTO t1 (f2) VALUES ('c'), ('d'); +COMMIT; + +--echo expect (1,'a'), (2, 'b') +SELECT * FROM t1; + +--connection node_2 +--echo expect (1,'a'), (2, 'b') +SELECT * FROM t1; + +DROP TABLE t1; + + +# +# Case 3: error on autocommit multirow insert +# +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY DEFAULT 0, f2 char(12)); + +--connection node_1 +--error ER_DUP_ENTRY +INSERT INTO t1 (f2) VALUES ('a'),('b'); + +SELECT COUNT(*) AS expect_0 FROM t1; + +--connection node_2 +SELECT COUNT(*) AS expect_0 FROM t1; + +DROP TABLE t1; + + +# +# Case 4: FK constraint violation on multirow insert +# +--connection node_1 +CREATE TABLE p(id int primary key, j int) ENGINE=InnoDB; +CREATE TABLE c(id int primary key, fk1 int) ENGINE=InnoDB; +ALTER TABLE c ADD FOREIGN KEY (fk1) references p(id); +INSERT INTO p VALUES(1, 0); + +START TRANSACTION; +INSERT INTO c VALUES (3,1); +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO c VALUES (1,1), (2,2); +COMMIT; + +SELECT * FROM p; +SELECT * FROM c; + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/galera_myisam_autocommit.test b/mysql-test/suite/galera/t/galera_myisam_autocommit.test new file mode 100644 index 00000000..b01b5dc0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_myisam_autocommit.test @@ -0,0 +1,45 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# This tests simple autocommit replication of MyISAM tables. No updates arrive on the slave. +# + +# Without a PK + +CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; + +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2), (3); +INSERT INTO t1 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; + +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1); +INSERT INTO t2 VALUES (2), (3); +INSERT INTO t2 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; + +# Error +--error ER_DUP_ENTRY +INSERT INTO t2 VALUES (6), (1); + +# UPDATE + +UPDATE t1 SET f1 = 9; +UPDATE t2 SET f1 = 9 WHERE f1 = 1; + +# DELETE + +DELETE FROM t1 WHERE f1 = 9; +DELETE FROM t2 WHERE f1 = 9; + +# TRUNCATE + +TRUNCATE TABLE t1; +TRUNCATE TABLE t1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 0 FROM t2; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_myisam_transactions.test b/mysql-test/suite/galera/t/galera_myisam_transactions.test new file mode 100644 index 00000000..00e0bf3f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_myisam_transactions.test @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# This tests MyISAM tables in transactions. No MyISAM updates arrive on the slave, but InnoDB ones do. +# + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE t3 (f1 INTEGER) ENGINE=MyISAM; + +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t3 VALUES (NEW.f1); + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); +COMMIT; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 0 FROM t2; +SELECT COUNT(*) = 0 FROM t2; + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); +ROLLBACK; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 0 FROM t2; +SELECT COUNT(*) = 0 FROM t2; + +DROP TABLE t1, t2, t3; diff --git a/mysql-test/suite/galera/t/galera_nonPK_and_PA.test b/mysql-test/suite/galera/t/galera_nonPK_and_PA.test new file mode 100644 index 00000000..8a5173f5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_nonPK_and_PA.test @@ -0,0 +1,168 @@ +# +# This test is a modified version of Gabor Orosz (GOro) test in jira tracker: +# https://jira.mariadb.org/browse/MDEV-25551 +# +# The underlying problem with MDEV-25551 turned out to be that +# transactions having changes for tables with no primary key, +# were not safe to apply in parallel. This is due to excessive locking +# in innodb side, and even non related row modifications could end up +# in lock conflict during applying. +# +# The test creates a table with no primary key definition and executes two +# transactions (in node1) modifying separate rows in the table. In node2 +# first applier is paused before commit phase, and second transaction is +# then submitted to see if it can interfere with the first transaciton. +# The fix for MDEV-25551 has disabled parallel applying for tables with no PK, +# and in the test applying of the send trasnaction should not even start, before +# the fisrt trkansaction is released from the sync point. +# The test also verifies that certification depedency status reflects the fact +# that the two transactions depend on each other. +# +# The test has two scenarios where both UPDATE and DELETE statements are verified +# to disable parallel applying +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + + +# Setup + +CREATE TABLE t1 (f1 VARCHAR(32) NOT NULL) ENGINE=InnoDB; +INSERT INTO t1 (f1) VALUES ('0e66c5227a8a'); +INSERT INTO t1 (f1) VALUES ('c6c112992c9'); + +CREATE TABLE t2 (i int primary key); + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*)=2 FROM t1; +--source include/wait_condition.inc + +# Ensure that we have enough applier threads to process transactions in parallel +SET GLOBAL wsrep_slave_threads = 2; + +--echo *************************************************************** +--echo scenario 1, conflicting UPDATE +--echo *************************************************************** + +# Set up a synchronization point to catch the first transaction +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +# Invoke the first transaction +START TRANSACTION; +UPDATE t1 SET f1='5ffceebfada' WHERE t1.f1 = 'c6c112992c9'; +COMMIT; + +--connection node_2 +# Wait for the first transaction to apply until commit phase +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc + +# remember status for received replication counter and certification dependency distance +--let $expected_wsrep_received = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_received'` +--let $cert_deps_distance = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cert_deps_distance'` + +--connection node_1 +# Invoke the second transaction +START TRANSACTION; +UPDATE t1 SET f1='4ffceebfcdc' WHERE t1.f1 = '0e66c5227a8a'; +COMMIT; + +# sleep is probably obsolete here, but it is good to give the latter update time to +# proceed in applying in node 2. In buggy version the update will start applying +# and cause conflict there. +--sleep 5 + +--connection node_2 +# Wait for the second transaction to appear in repliaction queue +--let $wait_condition = SELECT VARIABLE_VALUE= $expected_wsrep_received FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_received'; +--source include/wait_condition.inc + +# verify that certification dependency distance has dropped +--disable_query_log +--eval SELECT VARIABLE_VALUE < $cert_deps_distance as 'distance' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cert_deps_distance' +--enable_query_log + +# if deps distance dropped, it is indirect evidence that parallel applying was not approved + +# Let the first transaction to proceed +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +# second applier should now hit sync point +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + + +--echo *************************************************************** +--echo scenario 2, conflicting DELETE +--echo *************************************************************** + +# Set up a synchronization point to catch the first transaction +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +# Invoke the first transaction, mix this with insert to table having PK +START TRANSACTION; +INSERT INTO t2 VALUES (1); +DELETE FROM t1 WHERE f1='5ffceebfada'; +COMMIT; + +--connection node_2 +# Wait for the first transaction to apply until commit phase +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc + +# remember status for received replication counter and certification dependency distance +--let $expected_wsrep_received = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_received'` +--let $cert_deps_distance = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cert_deps_distance'` + +--connection node_1 +# Invoke the second transaction, again mix this with insert to table having PK +START TRANSACTION; +INSERT INTO t2 VALUES (2); +DELETE FROM t1 WHERE f1='4ffceebfcdc'; +COMMIT; + +# sleep is probably obsolete here, but it is good to give the latter update time to +# proceed in applying in node 2. In buggy version the update will start applying +# and cause conflict there. +--sleep 5 + +--connection node_2 +# Wait for the second transaction to appear in repliaction queue +--let $wait_condition = SELECT VARIABLE_VALUE= $expected_wsrep_received FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_received'; +--source include/wait_condition.inc + +# verify that certification dependency distance has dropped +--disable_query_log +--eval SELECT VARIABLE_VALUE < $cert_deps_distance as 'distance' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cert_deps_distance' +--enable_query_log + +# if deps distance dropped, it is indirect evidence that parallel applying was not approved + +# Let the first transaction to proceed +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc + +# second applier should now hit sync point +--let $galera_sync_point = commit_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Teardown +--connection node_1 +SET GLOBAL wsrep_slave_threads = DEFAULT; + +DROP TABLE t1; +DROP TABLE t2; +--connection node_2 +SET GLOBAL wsrep_slave_threads = DEFAULT; diff --git a/mysql-test/suite/galera/t/galera_nopk_bit.test b/mysql-test/suite/galera/t/galera_nopk_bit.test new file mode 100644 index 00000000..4292a6d6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_nopk_bit.test @@ -0,0 +1,46 @@ +# +# This checks that even tables with a single BIT column are replicated properly without a PK +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 BIT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (NULL),(0),(b'1'); + +--connection node_2 +SELECT f1 IS NULL, f1 = b'1' FROM t1; + +DELETE FROM t1 WHERE f1 = b'1'; +UPDATE t1 SET f1 = b'1' WHERE f1 IS NULL; +UPDATE t1 SET f1 = 1 WHERE f1 = b'0'; + +--connection node_1 +SELECT f1 IS NULL, f1 = b'1' FROM t1; + +# +# Provoke a conflict +# + +--connection node_1 +CREATE TABLE t2 (f1 BIT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (NULL); + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t2 SET f1 = 0 WHERE f1 IS NULL; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t2 SET f1 = 1 WHERE f1 IS NULL; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_nopk_blob.test b/mysql-test/suite/galera/t/galera_nopk_blob.test new file mode 100644 index 00000000..08e3b996 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_nopk_blob.test @@ -0,0 +1,46 @@ +# +# This checks that even tables with a single BLOB column and no FK are replicated properly +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES (NULL),('abc'); + +--connection node_2 +SELECT f1 FROM t1; + +DELETE FROM t1 WHERE f1 IS NULL; +UPDATE t1 SET f1 = 'xyz' WHERE f1 = 'abc'; + +--connection node_1 +SELECT COUNT(*) = 1 FROM t1; +SELECT f1 = 'abc' FROM t1; + +# +# Provoke a conflict +# + +--connection node_1 +CREATE TABLE t2 (f1 BLOB) ENGINE=InnoDB; +INSERT INTO t2 VALUES (NULL); + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t2 SET f1 = 'abc' WHERE f1 IS NULL; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t2 SET f1 = 'xyz' WHERE f1 IS NULL; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_nopk_large_varchar.test b/mysql-test/suite/galera/t/galera_nopk_large_varchar.test new file mode 100644 index 00000000..bb9bcd5a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_nopk_large_varchar.test @@ -0,0 +1,50 @@ +# +# This checks that even tables with a single long VARCHARcolumn and no FK are replicated properly +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# From the Innodb manual: "The maximum row length, except for variable-length columns (VARBINARY, VARCHAR, BLOB and TEXT), +# is slightly less than half of a database page. That is, the maximum row length is about 8000 bytes" + +CREATE TABLE t1 (f1 VARCHAR(8000)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (NULL),(CONCAT(REPEAT('x', 7999), 'a')); + +--connection node_2 +SELECT LENGTH(f1) FROM t1; + +DELETE FROM t1 WHERE f1 IS NULL; +UPDATE t1 SET f1 = CONCAT(REPEAT('x', 7999), 'b') WHERE f1 = CONCAT(REPEAT('x', 7999), 'a'); + +--connection node_1 +SELECT COUNT(*) = 1 FROM t1; +SELECT LENGTH(f1) = 8000 FROM t1; +SELECT f1 = CONCAT(REPEAT('x', 7999), 'b') FROM t1; + +# +# Provoke a conflict +# + +--connection node_1 +CREATE TABLE t2 (f1 BLOB) ENGINE=InnoDB; +INSERT INTO t2 VALUES (CONCAT(REPEAT('x', 7999), 'a')); + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t2 SET f1 = 'abc' WHERE f1 = CONCAT(REPEAT('x', 7999), 'a'); + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t2 SET f1 = 'xyz' WHERE f1 = CONCAT(REPEAT('x', 7999), 'a'); + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_nopk_unicode.test b/mysql-test/suite/galera/t/galera_nopk_unicode.test new file mode 100644 index 00000000..e036e14e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_nopk_unicode.test @@ -0,0 +1,43 @@ +# +# Test non-ascii data in table without a PK +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 ( + f1 VARCHAR(255), + KEY (f1) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO t1 VALUES ('текст'); + +--connection node_2 +SELECT f1 = 'текст' FROM t1; + +# +# Provoke a conflict +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'текст2'; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'текст3'; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +SELECT f1 = 'текст2' FROM t1; +SELECT f1 = 'текст2' FROM t1 WHERE f1 = 'текст2'; + + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test b/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test new file mode 100644 index 00000000..5a33c16c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test @@ -0,0 +1,51 @@ +# +# Test that a LOCK TABLE on the slave will cause all applier threads to block, +# Even though the two INSERTS are independent transactions, the fact that t1 is locked +# prevents the applier thread from committing the insert against t2, as commits are done +# in order. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 + +--let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads` +--let $wsrep_sync_wait_orig = `SELECT @@wsrep_sync_wait` + +SET GLOBAL wsrep_slave_threads = 2; +LOCK TABLE t1 READ; + +--connection node_1 +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +# We use a separate connection here so that we can SELECT from both tables +# without running into "table t2 was not locked" error. + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +--sleep 1 +SET SESSION wsrep_sync_wait=0; +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committing%'; +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%'; +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 0 FROM t2; + +--connection node_2 +UNLOCK TABLES; + +--connection node_2a +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig; +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committed%'; + +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test b/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test new file mode 100644 index 00000000..df0200fa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test @@ -0,0 +1,70 @@ +## +## This test tests parallel application of multiple auto-increment insert transactions +## + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc +--source include/force_restart.inc + +# Create a second connection to node1 so that we can run transactions concurrently +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_1 +CREATE TABLE ten (f1 INTEGER) Engine=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB; + +--connection node_2 +set session wsrep_sync_wait=15; +--let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads` + +SET GLOBAL wsrep_slave_threads = 4; +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--source include/wait_condition.inc + +--connection node_1 +--send INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_1a +--send INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_2 +--send INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_1 +--reap +--let $wait_condition = select count(*)=30000 from t1; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; +SELECT COUNT(DISTINCT f1) FROM t1; + +--connection node_1a +--reap +--let $wait_condition = select count(*)=30000 from t1; +--source include/wait_condition.inc +SELECT COUNT(*) FROM t1; +SELECT COUNT(DISTINCT f1) FROM t1; + +--connection node_2 +--reap +--disconnect node_1a + +--let $wait_condition = SELECT COUNT(*) = 30000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_30000 FROM t1; +SELECT COUNT(DISTINCT f1) AS EXPECT_30000 FROM t1; + +--disable_query_log +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; +--enable_query_log + +--connection default +DROP TABLE t1; +DROP TABLE ten; + diff --git a/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test b/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test new file mode 100644 index 00000000..587fbe10 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_parallel_autoinc_manytrx.test @@ -0,0 +1,95 @@ +## +## Tests the parallel application of many small-ish auto-increment insert transactions +## + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc +--source include/force_restart.inc + +--connection node_1 +CREATE TABLE ten (f1 INTEGER) Engine=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB; + +# Create few connections to node1 so that we can run transactions concurrently +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--let $galera_connection_name = node_1b +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_2 +set session wsrep_sync_wait=15; +--let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads` + +SET GLOBAL wsrep_slave_threads = 4; +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--source include/wait_condition.inc + +--connection node_1 +DELIMITER |; +CREATE PROCEDURE p1 (repeat_count int) +BEGIN + DECLARE current_num int; + SET current_num = 0; + WHILE current_num < repeat_count do + INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1; + COMMIT; + SET current_num = current_num + 1; + END WHILE; +END| +DELIMITER ;| + +--disable_query_log +send call p1(1000); + +--connection node_1a +--disable_query_log +send call p1(1000); + +--connection node_1b +--disable_query_log +send call p1(1000); + +--connection node_2 +--disable_query_log +--let $wait_condition = select count(*)=1 from information_schema.routines WHERE routine_name='p1'; +--source include/wait_condition.inc +send call p1(1000); + +--connection node_1 +reap; +--enable_query_log + +--connection node_1a +reap; +--enable_query_log + +--connection node_1b +reap; +--enable_query_log + +--connection node_2 +reap; +--enable_query_log + +SELECT COUNT(*) FROM t1; +SELECT COUNT(DISTINCT f1) FROM t1; + +--disconnect node_1a +--disconnect node_1b + +--disable_query_log +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; +--enable_query_log + +--connection default +DROP TABLE t1; +DROP TABLE ten; +DROP PROCEDURE p1; + + diff --git a/mysql-test/suite/galera/t/galera_parallel_simple.test b/mysql-test/suite/galera/t/galera_parallel_simple.test new file mode 100644 index 00000000..d49dc0ae --- /dev/null +++ b/mysql-test/suite/galera/t/galera_parallel_simple.test @@ -0,0 +1,67 @@ +# +# Test that SHOW PROCESSLIST reports that two slave threads have been involved in applying +# two independent transactions +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads` + +CREATE TABLE t1 (id INT) ENGINE=InnoDB; +CREATE TABLE t2 (id INT) ENGINE=InnoDB; + +--connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + +SET GLOBAL wsrep_slave_threads = 2; + +LOCK TABLE t1 WRITE; + +--connection node_1 +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +INSERT INTO t1 select * from t1; +INSERT INTO t2 select * from t2; + +INSERT INTO t1 select * from t1; +INSERT INTO t2 select * from t2; + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for table metadata lock%'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'committing%'; +--source include/wait_condition.inc + +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = 15; + +SELECT COUNT(*) as expect_20 FROM t1; +SELECT COUNT(*) as expect_20 FROM t2; + +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_partition.cnf b/mysql-test/suite/galera/t/galera_partition.cnf new file mode 100644 index 00000000..e6cb13ef --- /dev/null +++ b/mysql-test/suite/galera/t/galera_partition.cnf @@ -0,0 +1,18 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=10M;gmcast.segment=1' +wsrep_slave_threads=10 + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=10M;gmcast.segment=1' +wsrep_slave_threads=10 + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gcache.size=10M;gmcast.segment=2' +wsrep_slave_threads=10 + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gcache.size=10M;gmcast.segment=3' +wsrep_slave_threads=10 + diff --git a/mysql-test/suite/galera/t/galera_partition.test b/mysql-test/suite/galera/t/galera_partition.test new file mode 100644 index 00000000..bf3f02ea --- /dev/null +++ b/mysql-test/suite/galera/t/galera_partition.test @@ -0,0 +1,451 @@ +--source include/galera_cluster.inc +--source include/have_partition.inc +--source include/big_test.inc + +--connection node_1 + +call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER.*"); +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 + +--connection node_1 + +CREATE TABLE t1( + id bigint unsigned NOT NULL AUTO_INCREMENT, + dt datetime NOT NULL, + PRIMARY KEY (id,dt), + KEY dt_idx (dt) +) ENGINE=InnoDB +PARTITION BY RANGE( TO_DAYS(dt) ) ( +PARTITION rx2009xx VALUES LESS THAN( TO_DAYS('2010-01-01 00:00:00') ), +PARTITION rx201001 VALUES LESS THAN( TO_DAYS('2010-02-01 00:00:00') ), +PARTITION rx201002 VALUES LESS THAN( TO_DAYS('2010-03-01 00:00:00') ), +PARTITION rx201003 VALUES LESS THAN( TO_DAYS('2010-04-01 00:00:00') ), +PARTITION rx201004 VALUES LESS THAN( TO_DAYS('2010-05-01 00:00:00') ), +PARTITION rx201005 VALUES LESS THAN( TO_DAYS('2010-06-01 00:00:00') ), +PARTITION rx201006 VALUES LESS THAN( TO_DAYS('2010-07-01 00:00:00') ), +PARTITION rx201007 VALUES LESS THAN( TO_DAYS('2010-08-01 00:00:00') ), +PARTITION rx201008 VALUES LESS THAN( TO_DAYS('2010-09-01 00:00:00') ), +PARTITION rx201009 VALUES LESS THAN( TO_DAYS('2010-10-01 00:00:00') ), +PARTITION rx201010 VALUES LESS THAN( TO_DAYS('2010-11-01 00:00:00') ), +PARTITION rx201011 VALUES LESS THAN( TO_DAYS('2010-12-01 00:00:00') ), +PARTITION rx201012 VALUES LESS THAN( TO_DAYS('2011-01-01 00:00:00') ), +PARTITION rx2011 VALUES LESS THAN MAXVALUE); + +DELIMITER |; +CREATE PROCEDURE p1 (repeat_count int) +BEGIN + DECLARE current_num int; + SET current_num = 0; + WHILE current_num < repeat_count do + INSERT INTO t1 VALUES (NULL, '2010-10-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-02-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-03-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-04-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-06-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2010-10-21 00:00:00'); + INSERT INTO t1 VALUES (NULL, '2012-02-21 00:00:00'); + COMMIT; + SET current_num = current_num + 1; + END WHILE; +END| +DELIMITER ;| + +insert into t1 (id, dt) values (1, '2010-01-02 00:00:00'); +insert into t1 (id, dt) values (2, '2010-01-03 00:00:00'); +insert into t1 (id, dt) values (3, '2010-01-04 00:00:00'); +insert into t1 (id, dt) values (4, '2010-01-05 00:00:00'); +insert into t1 (id, dt) values (5, '2010-01-06 00:00:00'); +insert into t1 (id, dt) values (6, '2010-01-07 00:00:00'); +insert into t1 (id, dt) values (7, '2010-01-08 00:00:00'); +insert into t1 (id, dt) values (8, '2010-01-09 00:00:00'); +insert into t1 (id, dt) values (9, '2010-01-10 00:00:00'); +insert into t1 (id, dt) values (10, '2010-01-11 00:00:00'); +insert into t1 (id, dt) values (11, '2010-01-12 00:00:00'); +insert into t1 (id, dt) values (12, '2010-01-13 00:00:00'); +insert into t1 (id, dt) values (13, '2010-01-14 00:00:00'); +insert into t1 (id, dt) values (14, '2010-01-15 00:00:00'); +insert into t1 (id, dt) values (15, '2010-01-16 00:00:00'); +insert into t1 (id, dt) values (16, '2010-01-17 00:00:00'); +insert into t1 (id, dt) values (17, '2010-01-18 00:00:00'); +insert into t1 (id, dt) values (18, '2010-01-19 00:00:00'); +insert into t1 (id, dt) values (19, '2010-01-20 00:00:00'); +insert into t1 (id, dt) values (20, '2010-01-21 00:00:00'); +insert into t1 (id, dt) values (21, '2010-01-22 00:00:00'); +insert into t1 (id, dt) values (22, '2010-01-23 00:00:00'); +insert into t1 (id, dt) values (23, '2010-01-24 00:00:00'); +insert into t1 (id, dt) values (24, '2010-01-25 00:00:00'); +insert into t1 (id, dt) values (25, '2010-01-26 00:00:00'); +insert into t1 (id, dt) values (26, '2010-01-27 00:00:00'); +insert into t1 (id, dt) values (27, '2010-01-28 00:00:00'); +insert into t1 (id, dt) values (28, '2010-01-29 00:00:00'); +insert into t1 (id, dt) values (29, '2010-01-30 00:00:00'); +insert into t1 (id, dt) values (30, '2010-01-31 00:00:00'); +insert into t1 (id, dt) values (31, '2010-02-01 00:00:00'); +insert into t1 (id, dt) values (32, '2010-02-02 00:00:00'); +insert into t1 (id, dt) values (33, '2010-02-03 00:00:00'); +insert into t1 (id, dt) values (34, '2010-02-04 00:00:00'); +insert into t1 (id, dt) values (35, '2010-02-05 00:00:00'); +insert into t1 (id, dt) values (36, '2010-02-06 00:00:00'); +insert into t1 (id, dt) values (37, '2010-02-07 00:00:00'); +insert into t1 (id, dt) values (38, '2010-02-08 00:00:00'); +insert into t1 (id, dt) values (39, '2010-02-09 00:00:00'); +insert into t1 (id, dt) values (40, '2010-02-10 00:00:00'); +insert into t1 (id, dt) values (41, '2010-02-11 00:00:00'); +insert into t1 (id, dt) values (42, '2010-02-12 00:00:00'); +insert into t1 (id, dt) values (43, '2010-02-13 00:00:00'); +insert into t1 (id, dt) values (44, '2010-02-14 00:00:00'); +insert into t1 (id, dt) values (45, '2010-02-15 00:00:00'); +insert into t1 (id, dt) values (46, '2010-02-16 00:00:00'); +insert into t1 (id, dt) values (47, '2010-02-17 00:00:00'); +insert into t1 (id, dt) values (48, '2010-02-18 00:00:00'); +insert into t1 (id, dt) values (49, '2010-02-19 00:00:00'); +insert into t1 (id, dt) values (50, '2010-02-20 00:00:00'); +insert into t1 (id, dt) values (51, '2010-02-21 00:00:00'); +insert into t1 (id, dt) values (52, '2010-02-22 00:00:00'); +insert into t1 (id, dt) values (53, '2010-02-23 00:00:00'); +insert into t1 (id, dt) values (54, '2010-02-24 00:00:00'); +insert into t1 (id, dt) values (55, '2010-02-25 00:00:00'); +insert into t1 (id, dt) values (56, '2010-02-26 00:00:00'); +insert into t1 (id, dt) values (57, '2010-02-27 00:00:00'); +insert into t1 (id, dt) values (58, '2010-02-28 00:00:00'); +insert into t1 (id, dt) values (59, '2010-03-01 00:00:00'); +insert into t1 (id, dt) values (60, '2010-03-02 00:00:00'); +insert into t1 (id, dt) values (61, '2010-03-03 00:00:00'); +insert into t1 (id, dt) values (62, '2010-03-04 00:00:00'); +insert into t1 (id, dt) values (63, '2010-03-05 00:00:00'); +insert into t1 (id, dt) values (64, '2010-03-06 00:00:00'); +insert into t1 (id, dt) values (65, '2010-03-07 00:00:00'); +insert into t1 (id, dt) values (66, '2010-03-08 00:00:00'); +insert into t1 (id, dt) values (67, '2010-03-09 00:00:00'); +insert into t1 (id, dt) values (68, '2010-03-10 00:00:00'); +insert into t1 (id, dt) values (69, '2010-03-11 00:00:00'); +insert into t1 (id, dt) values (70, '2010-03-12 00:00:00'); +insert into t1 (id, dt) values (71, '2010-03-13 00:00:00'); +insert into t1 (id, dt) values (72, '2010-03-14 00:00:00'); +insert into t1 (id, dt) values (73, '2010-03-15 00:00:00'); +insert into t1 (id, dt) values (74, '2010-03-16 00:00:00'); +insert into t1 (id, dt) values (75, '2010-03-17 00:00:00'); +insert into t1 (id, dt) values (76, '2010-03-18 00:00:00'); +insert into t1 (id, dt) values (77, '2010-03-19 00:00:00'); +insert into t1 (id, dt) values (78, '2010-03-20 00:00:00'); +insert into t1 (id, dt) values (79, '2010-03-21 00:00:00'); +insert into t1 (id, dt) values (80, '2010-03-22 00:00:00'); +insert into t1 (id, dt) values (81, '2010-03-23 00:00:00'); +insert into t1 (id, dt) values (82, '2010-03-24 00:00:00'); +insert into t1 (id, dt) values (83, '2010-03-25 00:00:00'); +insert into t1 (id, dt) values (84, '2010-03-26 00:00:00'); +insert into t1 (id, dt) values (85, '2010-03-27 00:00:00'); +insert into t1 (id, dt) values (86, '2010-03-28 00:00:00'); +insert into t1 (id, dt) values (87, '2010-03-29 00:00:00'); +insert into t1 (id, dt) values (88, '2010-03-30 00:00:00'); +insert into t1 (id, dt) values (89, '2010-03-31 00:00:00'); +insert into t1 (id, dt) values (90, '2010-04-01 00:00:00'); +insert into t1 (id, dt) values (91, '2010-04-02 00:00:00'); +insert into t1 (id, dt) values (92, '2010-04-03 00:00:00'); +insert into t1 (id, dt) values (93, '2010-04-04 00:00:00'); +insert into t1 (id, dt) values (94, '2010-04-05 00:00:00'); +insert into t1 (id, dt) values (95, '2010-04-06 00:00:00'); +insert into t1 (id, dt) values (96, '2010-04-07 00:00:00'); +insert into t1 (id, dt) values (97, '2010-04-08 00:00:00'); +insert into t1 (id, dt) values (98, '2010-04-09 00:00:00'); +insert into t1 (id, dt) values (99, '2010-04-10 00:00:00'); +insert into t1 (id, dt) values (100, '2010-04-11 00:00:00'); +insert into t1 (id, dt) values (101, '2010-04-12 00:00:00'); +insert into t1 (id, dt) values (102, '2010-04-13 00:00:00'); +insert into t1 (id, dt) values (103, '2010-04-14 00:00:00'); +insert into t1 (id, dt) values (104, '2010-04-15 00:00:00'); +insert into t1 (id, dt) values (105, '2010-04-16 00:00:00'); +insert into t1 (id, dt) values (106, '2010-04-17 00:00:00'); +insert into t1 (id, dt) values (107, '2010-04-18 00:00:00'); +insert into t1 (id, dt) values (108, '2010-04-19 00:00:00'); +insert into t1 (id, dt) values (109, '2010-04-20 00:00:00'); +insert into t1 (id, dt) values (110, '2010-04-21 00:00:00'); +insert into t1 (id, dt) values (111, '2010-04-22 00:00:00'); +insert into t1 (id, dt) values (112, '2010-04-23 00:00:00'); +insert into t1 (id, dt) values (113, '2010-04-24 00:00:00'); +insert into t1 (id, dt) values (114, '2010-04-25 00:00:00'); +insert into t1 (id, dt) values (115, '2010-04-26 00:00:00'); +insert into t1 (id, dt) values (116, '2010-04-27 00:00:00'); +insert into t1 (id, dt) values (117, '2010-04-28 00:00:00'); +insert into t1 (id, dt) values (118, '2010-04-29 00:00:00'); +insert into t1 (id, dt) values (119, '2010-04-30 00:00:00'); +insert into t1 (id, dt) values (120, '2010-05-01 00:00:00'); +insert into t1 (id, dt) values (121, '2010-05-02 00:00:00'); +insert into t1 (id, dt) values (122, '2010-05-03 00:00:00'); +insert into t1 (id, dt) values (123, '2010-05-04 00:00:00'); +insert into t1 (id, dt) values (124, '2010-05-05 00:00:00'); +insert into t1 (id, dt) values (125, '2010-05-06 00:00:00'); +insert into t1 (id, dt) values (126, '2010-05-07 00:00:00'); +insert into t1 (id, dt) values (127, '2010-05-08 00:00:00'); +insert into t1 (id, dt) values (128, '2010-05-09 00:00:00'); +insert into t1 (id, dt) values (129, '2010-05-10 00:00:00'); +insert into t1 (id, dt) values (130, '2010-05-11 00:00:00'); +insert into t1 (id, dt) values (131, '2010-05-12 00:00:00'); +insert into t1 (id, dt) values (132, '2010-05-13 00:00:00'); +insert into t1 (id, dt) values (133, '2010-05-14 00:00:00'); +insert into t1 (id, dt) values (134, '2010-05-15 00:00:00'); +insert into t1 (id, dt) values (135, '2010-05-16 00:00:00'); +insert into t1 (id, dt) values (136, '2010-05-17 00:00:00'); +insert into t1 (id, dt) values (137, '2010-05-18 00:00:00'); +insert into t1 (id, dt) values (138, '2010-05-19 00:00:00'); +insert into t1 (id, dt) values (139, '2010-05-20 00:00:00'); +insert into t1 (id, dt) values (140, '2010-05-21 00:00:00'); +insert into t1 (id, dt) values (141, '2010-05-22 00:00:00'); +insert into t1 (id, dt) values (142, '2010-05-23 00:00:00'); +insert into t1 (id, dt) values (143, '2010-05-24 00:00:00'); +insert into t1 (id, dt) values (144, '2010-05-25 00:00:00'); +insert into t1 (id, dt) values (145, '2010-05-26 00:00:00'); +insert into t1 (id, dt) values (146, '2010-05-27 00:00:00'); +insert into t1 (id, dt) values (147, '2010-05-28 00:00:00'); +insert into t1 (id, dt) values (148, '2010-05-29 00:00:00'); +insert into t1 (id, dt) values (149, '2010-05-30 00:00:00'); +insert into t1 (id, dt) values (150, '2010-05-31 00:00:00'); +insert into t1 (id, dt) values (151, '2010-06-01 00:00:00'); +insert into t1 (id, dt) values (152, '2010-06-02 00:00:00'); +insert into t1 (id, dt) values (153, '2010-06-03 00:00:00'); +insert into t1 (id, dt) values (154, '2010-06-04 00:00:00'); +insert into t1 (id, dt) values (155, '2010-06-05 00:00:00'); +insert into t1 (id, dt) values (156, '2010-06-06 00:00:00'); +insert into t1 (id, dt) values (157, '2010-06-07 00:00:00'); +insert into t1 (id, dt) values (158, '2010-06-08 00:00:00'); +insert into t1 (id, dt) values (159, '2010-06-09 00:00:00'); +insert into t1 (id, dt) values (160, '2010-06-10 00:00:00'); +insert into t1 (id, dt) values (161, '2010-06-11 00:00:00'); +insert into t1 (id, dt) values (162, '2010-06-12 00:00:00'); +insert into t1 (id, dt) values (163, '2010-06-13 00:00:00'); +insert into t1 (id, dt) values (164, '2010-06-14 00:00:00'); +insert into t1 (id, dt) values (165, '2010-06-15 00:00:00'); +insert into t1 (id, dt) values (166, '2010-06-16 00:00:00'); +insert into t1 (id, dt) values (167, '2010-06-17 00:00:00'); +insert into t1 (id, dt) values (168, '2010-06-18 00:00:00'); +insert into t1 (id, dt) values (169, '2010-06-19 00:00:00'); +insert into t1 (id, dt) values (170, '2010-06-20 00:00:00'); +insert into t1 (id, dt) values (171, '2010-06-21 00:00:00'); +insert into t1 (id, dt) values (172, '2010-06-22 00:00:00'); +insert into t1 (id, dt) values (173, '2010-06-23 00:00:00'); +insert into t1 (id, dt) values (174, '2010-06-24 00:00:00'); +insert into t1 (id, dt) values (175, '2010-06-25 00:00:00'); +insert into t1 (id, dt) values (176, '2010-06-26 00:00:00'); +insert into t1 (id, dt) values (177, '2010-06-27 00:00:00'); +insert into t1 (id, dt) values (178, '2010-06-28 00:00:00'); +insert into t1 (id, dt) values (179, '2010-06-29 00:00:00'); +insert into t1 (id, dt) values (180, '2010-06-30 00:00:00'); +insert into t1 (id, dt) values (181, '2010-07-01 00:00:00'); +insert into t1 (id, dt) values (182, '2010-07-02 00:00:00'); +insert into t1 (id, dt) values (183, '2010-07-03 00:00:00'); +insert into t1 (id, dt) values (184, '2010-07-04 00:00:00'); +insert into t1 (id, dt) values (185, '2010-07-05 00:00:00'); +insert into t1 (id, dt) values (186, '2010-07-06 00:00:00'); +insert into t1 (id, dt) values (187, '2010-07-07 00:00:00'); +insert into t1 (id, dt) values (188, '2010-07-08 00:00:00'); +insert into t1 (id, dt) values (189, '2010-07-09 00:00:00'); +insert into t1 (id, dt) values (190, '2010-07-10 00:00:00'); +insert into t1 (id, dt) values (191, '2010-07-11 00:00:00'); +insert into t1 (id, dt) values (192, '2010-07-12 00:00:00'); +insert into t1 (id, dt) values (193, '2010-07-13 00:00:00'); +insert into t1 (id, dt) values (194, '2010-07-14 00:00:00'); +insert into t1 (id, dt) values (195, '2010-07-15 00:00:00'); +insert into t1 (id, dt) values (196, '2010-07-16 00:00:00'); +insert into t1 (id, dt) values (197, '2010-07-17 00:00:00'); +insert into t1 (id, dt) values (198, '2010-07-18 00:00:00'); +insert into t1 (id, dt) values (199, '2010-07-19 00:00:00'); +insert into t1 (id, dt) values (200, '2010-07-20 00:00:00'); +insert into t1 (id, dt) values (201, '2010-07-21 00:00:00'); +insert into t1 (id, dt) values (202, '2010-07-22 00:00:00'); +insert into t1 (id, dt) values (203, '2010-07-23 00:00:00'); +insert into t1 (id, dt) values (204, '2010-07-24 00:00:00'); +insert into t1 (id, dt) values (205, '2010-07-25 00:00:00'); +insert into t1 (id, dt) values (206, '2010-07-26 00:00:00'); +insert into t1 (id, dt) values (207, '2010-07-27 00:00:00'); +insert into t1 (id, dt) values (208, '2010-07-28 00:00:00'); +insert into t1 (id, dt) values (209, '2010-07-29 00:00:00'); +insert into t1 (id, dt) values (210, '2010-07-30 00:00:00'); +insert into t1 (id, dt) values (211, '2010-07-31 00:00:00'); +insert into t1 (id, dt) values (212, '2010-08-01 00:00:00'); +insert into t1 (id, dt) values (213, '2010-08-02 00:00:00'); +insert into t1 (id, dt) values (214, '2010-08-03 00:00:00'); +insert into t1 (id, dt) values (215, '2010-08-04 00:00:00'); +insert into t1 (id, dt) values (216, '2010-08-05 00:00:00'); +insert into t1 (id, dt) values (217, '2010-08-06 00:00:00'); +insert into t1 (id, dt) values (218, '2010-08-07 00:00:00'); +insert into t1 (id, dt) values (219, '2010-08-08 00:00:00'); +insert into t1 (id, dt) values (220, '2010-08-09 00:00:00'); +insert into t1 (id, dt) values (221, '2010-08-10 00:00:00'); +insert into t1 (id, dt) values (222, '2010-08-11 00:00:00'); +insert into t1 (id, dt) values (223, '2010-08-12 00:00:00'); +insert into t1 (id, dt) values (224, '2010-08-13 00:00:00'); +insert into t1 (id, dt) values (225, '2010-08-14 00:00:00'); +insert into t1 (id, dt) values (226, '2010-08-15 00:00:00'); +insert into t1 (id, dt) values (227, '2010-08-16 00:00:00'); +insert into t1 (id, dt) values (228, '2010-08-17 00:00:00'); +insert into t1 (id, dt) values (229, '2010-08-18 00:00:00'); +insert into t1 (id, dt) values (230, '2010-08-19 00:00:00'); +insert into t1 (id, dt) values (231, '2010-08-20 00:00:00'); +insert into t1 (id, dt) values (232, '2010-08-21 00:00:00'); +insert into t1 (id, dt) values (233, '2010-08-22 00:00:00'); +insert into t1 (id, dt) values (234, '2010-08-23 00:00:00'); +insert into t1 (id, dt) values (235, '2010-08-24 00:00:00'); +insert into t1 (id, dt) values (236, '2010-08-25 00:00:00'); +insert into t1 (id, dt) values (237, '2010-08-26 00:00:00'); +insert into t1 (id, dt) values (238, '2010-08-27 00:00:00'); +insert into t1 (id, dt) values (239, '2010-08-28 00:00:00'); +insert into t1 (id, dt) values (240, '2010-08-29 00:00:00'); +insert into t1 (id, dt) values (241, '2010-08-30 00:00:00'); +insert into t1 (id, dt) values (242, '2010-08-31 00:00:00'); +insert into t1 (id, dt) values (243, '2010-09-01 00:00:00'); +insert into t1 (id, dt) values (244, '2010-09-02 00:00:00'); +insert into t1 (id, dt) values (245, '2010-09-03 00:00:00'); +insert into t1 (id, dt) values (246, '2010-09-04 00:00:00'); +insert into t1 (id, dt) values (247, '2010-09-05 00:00:00'); +insert into t1 (id, dt) values (248, '2010-09-06 00:00:00'); +insert into t1 (id, dt) values (249, '2010-09-07 00:00:00'); +insert into t1 (id, dt) values (250, '2010-09-08 00:00:00'); +insert into t1 (id, dt) values (251, '2010-09-09 00:00:00'); +insert into t1 (id, dt) values (252, '2010-09-10 00:00:00'); +insert into t1 (id, dt) values (253, '2010-09-11 00:00:00'); +insert into t1 (id, dt) values (254, '2010-09-12 00:00:00'); +insert into t1 (id, dt) values (255, '2010-09-13 00:00:00'); +insert into t1 (id, dt) values (256, '2010-09-14 00:00:00'); +insert into t1 (id, dt) values (257, '2010-09-15 00:00:00'); +insert into t1 (id, dt) values (258, '2010-09-16 00:00:00'); +insert into t1 (id, dt) values (259, '2010-09-17 00:00:00'); +insert into t1 (id, dt) values (260, '2010-09-18 00:00:00'); +insert into t1 (id, dt) values (261, '2010-09-19 00:00:00'); +insert into t1 (id, dt) values (262, '2010-09-20 00:00:00'); +insert into t1 (id, dt) values (263, '2010-09-21 00:00:00'); +insert into t1 (id, dt) values (264, '2010-09-22 00:00:00'); +insert into t1 (id, dt) values (265, '2010-09-23 00:00:00'); +insert into t1 (id, dt) values (266, '2010-09-24 00:00:00'); +insert into t1 (id, dt) values (267, '2010-09-25 00:00:00'); +insert into t1 (id, dt) values (268, '2010-09-26 00:00:00'); +insert into t1 (id, dt) values (269, '2010-09-27 00:00:00'); +insert into t1 (id, dt) values (270, '2010-09-28 00:00:00'); +insert into t1 (id, dt) values (271, '2010-09-29 00:00:00'); +insert into t1 (id, dt) values (272, '2010-09-30 00:00:00'); +insert into t1 (id, dt) values (273, '2010-10-01 00:00:00'); +insert into t1 (id, dt) values (274, '2010-10-02 00:00:00'); +insert into t1 (id, dt) values (275, '2010-10-03 00:00:00'); +insert into t1 (id, dt) values (276, '2010-10-04 00:00:00'); +insert into t1 (id, dt) values (277, '2010-10-05 00:00:00'); +insert into t1 (id, dt) values (278, '2010-10-06 00:00:00'); +insert into t1 (id, dt) values (279, '2010-10-07 00:00:00'); +insert into t1 (id, dt) values (280, '2010-10-08 00:00:00'); +insert into t1 (id, dt) values (281, '2010-10-09 00:00:00'); +insert into t1 (id, dt) values (282, '2010-10-10 00:00:00'); +insert into t1 (id, dt) values (283, '2010-10-11 00:00:00'); +insert into t1 (id, dt) values (284, '2010-10-12 00:00:00'); +insert into t1 (id, dt) values (285, '2010-10-13 00:00:00'); +insert into t1 (id, dt) values (286, '2010-10-14 00:00:00'); +insert into t1 (id, dt) values (287, '2010-10-15 00:00:00'); +insert into t1 (id, dt) values (288, '2010-10-16 00:00:00'); +insert into t1 (id, dt) values (289, '2010-10-17 00:00:00'); +insert into t1 (id, dt) values (290, '2010-10-18 00:00:00'); +insert into t1 (id, dt) values (291, '2010-10-19 00:00:00'); +insert into t1 (id, dt) values (292, '2010-10-20 00:00:00'); +insert into t1 (id, dt) values (293, '2010-10-21 00:00:00'); +insert into t1 (id, dt) values (294, '2010-10-22 00:00:00'); +insert into t1 (id, dt) values (295, '2010-10-23 00:00:00'); +insert into t1 (id, dt) values (296, '2010-10-24 00:00:00'); +insert into t1 (id, dt) values (297, '2010-10-25 00:00:00'); +insert into t1 (id, dt) values (298, '2010-10-26 00:00:00'); +insert into t1 (id, dt) values (299, '2010-10-27 00:00:00'); +insert into t1 (id, dt) values (300, '2010-10-28 00:00:00'); +insert into t1 (id, dt) values (301, '2010-10-29 00:00:00'); +insert into t1 (id, dt) values (302, '2010-10-30 00:00:00'); +insert into t1 (id, dt) values (303, '2010-10-31 00:00:00'); +insert into t1 (id, dt) values (304, '2010-11-01 00:00:00'); +insert into t1 (id, dt) values (305, '2010-11-02 00:00:00'); +insert into t1 (id, dt) values (306, '2010-11-03 00:00:00'); +insert into t1 (id, dt) values (307, '2010-11-04 00:00:00'); +insert into t1 (id, dt) values (308, '2010-11-05 00:00:00'); +insert into t1 (id, dt) values (309, '2010-11-06 00:00:00'); +insert into t1 (id, dt) values (310, '2010-11-07 00:00:00'); +insert into t1 (id, dt) values (311, '2010-11-08 00:00:00'); +insert into t1 (id, dt) values (312, '2010-11-09 00:00:00'); +insert into t1 (id, dt) values (313, '2010-11-10 00:00:00'); +insert into t1 (id, dt) values (314, '2010-11-11 00:00:00'); +insert into t1 (id, dt) values (315, '2010-11-12 00:00:00'); +insert into t1 (id, dt) values (316, '2010-11-13 00:00:00'); +insert into t1 (id, dt) values (317, '2010-11-14 00:00:00'); +insert into t1 (id, dt) values (318, '2010-11-15 00:00:00'); +insert into t1 (id, dt) values (319, '2010-11-16 00:00:00'); +insert into t1 (id, dt) values (320, '2010-11-17 00:00:00'); +insert into t1 (id, dt) values (321, '2010-11-18 00:00:00'); +insert into t1 (id, dt) values (322, '2010-11-19 00:00:00'); +insert into t1 (id, dt) values (323, '2010-11-20 00:00:00'); +insert into t1 (id, dt) values (324, '2010-11-21 00:00:00'); +insert into t1 (id, dt) values (325, '2010-11-22 00:00:00'); +insert into t1 (id, dt) values (326, '2010-11-23 00:00:00'); +insert into t1 (id, dt) values (327, '2010-11-24 00:00:00'); +insert into t1 (id, dt) values (328, '2010-11-25 00:00:00'); +insert into t1 (id, dt) values (329, '2010-11-26 00:00:00'); +insert into t1 (id, dt) values (330, '2010-11-27 00:00:00'); +insert into t1 (id, dt) values (331, '2010-11-28 00:00:00'); +insert into t1 (id, dt) values (332, '2010-11-29 00:00:00'); +insert into t1 (id, dt) values (333, '2010-11-30 00:00:00'); +insert into t1 (id, dt) values (334, '2010-12-01 00:00:00'); +insert into t1 (id, dt) values (335, '2010-12-02 00:00:00'); +insert into t1 (id, dt) values (336, '2010-12-03 00:00:00'); +insert into t1 (id, dt) values (337, '2010-12-04 00:00:00'); +insert into t1 (id, dt) values (338, '2010-12-05 00:00:00'); +insert into t1 (id, dt) values (339, '2010-12-06 00:00:00'); +insert into t1 (id, dt) values (340, '2010-12-07 00:00:00'); +insert into t1 (id, dt) values (341, '2010-12-08 00:00:00'); +insert into t1 (id, dt) values (342, '2010-12-09 00:00:00'); +insert into t1 (id, dt) values (343, '2010-12-10 00:00:00'); +insert into t1 (id, dt) values (344, '2010-12-11 00:00:00'); +insert into t1 (id, dt) values (345, '2010-12-12 00:00:00'); +insert into t1 (id, dt) values (346, '2010-12-13 00:00:00'); +insert into t1 (id, dt) values (347, '2010-12-14 00:00:00'); +insert into t1 (id, dt) values (348, '2010-12-15 00:00:00'); +insert into t1 (id, dt) values (349, '2010-12-16 00:00:00'); +insert into t1 (id, dt) values (350, '2010-12-17 00:00:00'); + +SELECT COUNT(*) FROM t1; + +--connection node_2 +call mtr.add_suppression("WSREP: Sending JOIN failed:"); +send call p1(10); + +--connection node_3 +call mtr.add_suppression("WSREP: Sending JOIN failed:"); +send call p1(10); + +--connection node_4 +call mtr.add_suppression("WSREP: Sending JOIN failed:"); +send call p1(10); + +--connection node_1 +SET SESSION wsrep_OSU_method='RSU'; +SELECT @@wsrep_OSU_method; +SET SESSION sql_log_bin = 0; + +--error 0,ER_LOCK_DEADLOCK +ALTER TABLE t1 DROP PARTITION rx2009xx; +--error 0,ER_LOCK_DEADLOCK +ALTER TABLE t1 DROP PARTITION rx201004; +--error 0,ER_LOCK_DEADLOCK +ALTER TABLE t1 DROP PARTITION rx201008; + +SET SESSION wsrep_OSU_METHOD='TOI'; +SELECT @@wsrep_OSU_method; + +--connection node_2 +--error 0,ER_LOCK_DEADLOCK +reap; + +--connection node_3 +--error 0,ER_LOCK_DEADLOCK +reap; + +--connection node_4 +--error 0,ER_LOCK_DEADLOCK +reap; + +--connection node_1 +DROP TABLE t1; +DROP PROCEDURE p1; + diff --git a/mysql-test/suite/galera/t/galera_password.test b/mysql-test/suite/galera/t/galera_password.test new file mode 100644 index 00000000..7843097c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_password.test @@ -0,0 +1,14 @@ +--source include/galera_cluster.inc + +SHOW VARIABLES LIKE '%password%'; + +CREATE USER 'user123456'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON test.* TO 'user123456'@'localhost'; +SET PASSWORD FOR 'user123456'@'localhost' = PASSWORD('A$10abcdDCBA123456%7'); +SHOW GRANTS FOR 'user123456'@'localhost'; + +--connection node_2 +SHOW GRANTS FOR 'user123456'@'localhost'; + +--connection node_1 +DROP USER 'user123456'@'localhost'; diff --git a/mysql-test/suite/galera/t/galera_pc_ignore_sb.test b/mysql-test/suite/galera/t/galera_pc_ignore_sb.test new file mode 100644 index 00000000..c48ddc66 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_pc_ignore_sb.test @@ -0,0 +1,54 @@ +# +# Test pc.ignore_sb=true wsrep_provider option . Killing one node should leave the other running. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +SET @wsrep_cluster_address_orig = @@GLOBAL.wsrep_cluster_address; +SET @wsrep_provider_options_orig = @@GLOBAL.wsrep_provider_options; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SET GLOBAL wsrep_provider_options ='pc.ignore_sb=true'; + +--connection node_2 +--source include/kill_galera.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +DROP TABLE t1; + +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; + +# Reset the master and restart the slave so that post-test checks can run + +SET GLOBAL wsrep_cluster_address = ''; +SET GLOBAL wsrep_cluster_address = @wsrep_cluster_address_orig; + +--connection node_2 +--source include/start_mysqld.inc + + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SET GLOBAL wsrep_provider_options = @wsrep_provider_options_orig; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_pc_recovery.test b/mysql-test/suite/galera/t/galera_pc_recovery.test new file mode 100644 index 00000000..1621414a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_pc_recovery.test @@ -0,0 +1,102 @@ +# +# Test the pc.recovery=1 option. Killing all nodes simultaneously and +# restarting them should succeed and the cluster should re-form. +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc +--source include/big_test.inc + +# Save galera ports +--connection node_1 +--source suite/galera/include/galera_base_port.inc +--let $NODE_GALERAPORT_1 = $_NODE_GALERAPORT + +--connection node_2 +--source suite/galera/include/galera_base_port.inc +--let $NODE_GALERAPORT_2 = $_NODE_GALERAPORT + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +# Instruct MTR to not restart the nodes automatically when they are killed + +--let $NODE_1_PIDFILE = `SELECT @@pid_file` +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +--let $NODE_2_PIDFILE = `SELECT @@pid_file` + +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--exec kill -9 `cat $NODE_1_PIDFILE` `cat $NODE_2_PIDFILE` + +# Perform --wsrep-recover and preserve the positions into variables by placing them in $MYSQL_TMP_DIR/galera_wsrep_start_position.inc and then --source'ing it + +--exec $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --wsrep-recover --log-error=$MYSQL_TMP_DIR/galera_wsrep_recover.1.log > $MYSQL_TMP_DIR/galera_wsrep_recover.1.log 2>&1 +--exec $MYSQLD --defaults-group-suffix=.2 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --wsrep-recover --log-error=$MYSQL_TMP_DIR/galera_wsrep_recover.2.log > $MYSQL_TMP_DIR/galera_wsrep_recover.2.log 2>&1 + +--perl + use strict; + my $wsrep_start_position1 = `grep 'WSREP: Recovered position:' $ENV{MYSQL_TMP_DIR}/galera_wsrep_recover.1.log | sed 's/.*WSREP\:\ Recovered\ position://' | sed 's/^[ \t]*//'`; + chomp($wsrep_start_position1); + + my $wsrep_start_position2 = `grep 'WSREP: Recovered position:' $ENV{MYSQL_TMP_DIR}/galera_wsrep_recover.2.log | sed 's/.*WSREP\:\ Recovered\ position://' | sed 's/^[ \t]*//'`; + chomp($wsrep_start_position2); + + die if $wsrep_start_position1 eq '' || $wsrep_start_position2 eq ''; + + open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/galera_wsrep_start_position.inc") or die; + print FILE "--let \$galera_wsrep_start_position1 = $wsrep_start_position1\n"; + print FILE "--let \$galera_wsrep_start_position2 = $wsrep_start_position2\n"; + close FILE; +EOF + +--source $MYSQL_TMP_DIR/galera_wsrep_start_position.inc + +if ($galera_wsrep_start_position1 == '') { + --die "Could not obtain wsrep_start_position." +} + +if ($galera_wsrep_start_position2 == '') { + --die "Could not obtain wsrep_start_position." +} + +--remove_file $MYSQL_TMP_DIR/galera_wsrep_start_position.inc + +# Instruct MTR to perform the actual restart using --wsrep-start-position . Proper --wsrep_cluster_address is used as my.cnf only contains 'gcomm://' for node #1 + +--exec echo "restart: --wsrep-start-position=$galera_wsrep_start_position1 --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1,127.0.0.1:$NODE_GALERAPORT_2" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--exec echo "restart: --wsrep-start-position=$galera_wsrep_start_position2 --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1,127.0.0.1:$NODE_GALERAPORT_2" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect + +--sleep 5 +--connection node_1 +--enable_reconnect +--source include/wait_until_connected_again.inc + +# Confirm that the cluster has re-formed and data is present + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +--enable_reconnect +--source include/wait_until_connected_again.inc +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +--connection node_1 +CALL mtr.add_suppression("points to own listening address, blacklisting"); +CALL mtr.add_suppression("non weight changing install in S_PRIM"); +CALL mtr.add_suppression("No re-merged primary component found"); + +--connection node_2 +CALL mtr.add_suppression("points to own listening address, blacklisting"); +CALL mtr.add_suppression("non weight changing install in S_PRIM"); +CALL mtr.add_suppression("No re-merged primary component found"); diff --git a/mysql-test/suite/galera/t/galera_performance_schema.test b/mysql-test/suite/galera/t/galera_performance_schema.test new file mode 100644 index 00000000..d54555ea --- /dev/null +++ b/mysql-test/suite/galera/t/galera_performance_schema.test @@ -0,0 +1,58 @@ +# +# Test that wsrep mutexes, condition variables, files and +# threads are shown in performance schema +# +--source include/galera_cluster.inc +--source include/have_perfschema.inc + +use performance_schema; + +--vertical_results +--disable_ps_protocol +SELECT name +FROM threads +WHERE name LIKE 'thread/sql/wsrep%' +ORDER BY name; +--enable_ps_protocol + +use test; +create table t1 (a int not null primary key) engine=innodb; +insert into t1 values (1),(2); + +use performance_schema; +select name from mutex_instances where name like 'wait/synch/mutex/sql/LOCK_wsrep%' order by name; +select name from cond_instances where name like 'wait/synch/cond/sql/COND_wsrep%' order by name; +# Whenever a node fails to apply an event on a slave node, the database server creates a +# special binary log file of the event in the data directory. The naming convention the +# node uses for the filename is GRA_*.log. +# Thus, we need to produce a applier failure + +--connection node_2 +--exec rm -rf $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log + +# Create applier failure + +use test; +SET SESSION wsrep_on=OFF; +CREATE TABLE t2 (f1 INTEGER) engine=innodb; + +--connection node_1 +use test; +CREATE TABLE t2 (f1 INTEGER) engine=innodb; + +--connection node_2 +SET SESSION wsrep_on=ON; +SELECT COUNT(*) FROM t1; + +use performance_schema; +# +# Below we can't just count number of files as if you run this test more +# than once, test will create more files +# +select count(*)>=1 from file_instances where file_name like '%GRA_%.log'; +CALL mtr.add_suppression("Slave SQL: Error 'Table 't2' already exists' on query"); + +use test; +drop table t1; +drop table t2; + diff --git a/mysql-test/suite/galera/t/galera_pk_bigint_signed.test b/mysql-test/suite/galera/t/galera_pk_bigint_signed.test new file mode 100644 index 00000000..12a8a8f5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_pk_bigint_signed.test @@ -0,0 +1,46 @@ +# +# PK that is a BIGINT SIGNED +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 BIGINT SIGNED PRIMARY KEY, f2 VARCHAR(5)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES + (-9223372036854775808, 'min'), + (9223372036854775807, 'max') +; + +--connection node_2 +SELECT * FROM t1; + +UPDATE t1 SET f2 = CONCAT(f2, '_'); + +--connection node_1 +SELECT * FROM t1; + +# +# Deadlock +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f2 = 'foo' WHERE f1 = -9223372036854775808; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f2 = 'bar' WHERE f1 = -9223372036854775808; + +--connection node_1 +COMMIT; +SET AUTOCOMMIT=ON; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; +SET AUTOCOMMIT=ON; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_pk_bigint_unsigned.test b/mysql-test/suite/galera/t/galera_pk_bigint_unsigned.test new file mode 100644 index 00000000..2bb02d5e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_pk_bigint_unsigned.test @@ -0,0 +1,45 @@ +# +# PK that is a BIGINT UNSIGNED +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 BIGINT UNSIGNED PRIMARY KEY, f2 VARCHAR(5)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES + (18446744073709551615, 'max') +; + +--connection node_2 +SELECT f1 = 18446744073709551615 FROM t1; + +UPDATE t1 SET f2 = CONCAT(f2, '_'); + +--connection node_1 +SELECT f1 = 18446744073709551615 FROM t1; + +# +# Deadlock +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f2 = 'foo' WHERE f1 = 18446744073709551615; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f2 = 'bar' WHERE f1 = 18446744073709551615; + +--connection node_1 +COMMIT; +SET AUTOCOMMIT=ON; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; +SET AUTOCOMMIT=ON; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_prepared_statement.test b/mysql-test/suite/galera/t/galera_prepared_statement.test new file mode 100644 index 00000000..3bee097f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_prepared_statement.test @@ -0,0 +1,45 @@ +# +# A simple test for PREPARE / EXECUTE -style prepared statements with Galera +# +# C-API-level prepared-statements can not be triggered from inside mysqltest, however +# can be exercised when running an MTR test suite with the --ps-protocol switch. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t2 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t3 (f1 CHAR(5)) ENGINE=InnoDB; +CREATE TABLE t4 (f1 CHAR(5)) ENGINE=InnoDB; + +SET SESSION sql_mode='STRICT_ALL_TABLES'; + +PREPARE st1 FROM 'INSERT INTO t1 VALUES ("abc")'; +PREPARE st2 FROM 'INSERT INTO t2 VALUES ("abc")'; +PREPARE st3 FROM 'INSERT INTO t3 VALUES ("abc")'; +PREPARE st4 FROM 'INSERT INTO t4 VALUES ("abc")'; + +EXECUTE st1; +EXECUTE st2; +EXECUTE st3; +EXECUTE st4; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 1 FROM t3; +SELECT COUNT(*) = 1 FROM t4; + +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +ALTER TABLE t1 DROP COLUMN f1; + +--connection node_1 +--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD +EXECUTE st1; + +--connection node_1 +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; diff --git a/mysql-test/suite/galera/t/galera_query_cache.cnf b/mysql-test/suite/galera/t/galera_query_cache.cnf new file mode 100644 index 00000000..80f40b09 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_query_cache.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +query_cache_type=1 +query_cache_size=1355776 + +[mysqld.2] +query_cache_type=1 +query_cache_size=1355776 + diff --git a/mysql-test/suite/galera/t/galera_query_cache.test b/mysql-test/suite/galera/t/galera_query_cache.test new file mode 100644 index 00000000..900faba0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_query_cache.test @@ -0,0 +1,67 @@ +--source include/have_query_cache.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Ensure that the query cache behaves properly with respect to Galera +# +# * in the absence of updates, the query cache does serve cached results +# * any cache-invalidating query on the remote node also causes the local cache to be invalidated +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +RESET QUERY CACHE; +FLUSH STATUS; + +# +# 1. Cache works +# + +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Qcache_queries_in_cache'; + +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; + +# +# 2. Cache is invalidated by DML on remote node +# + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +FLUSH STATUS; + +SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Qcache_queries_in_cache'; +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Qcache_queries_in_cache'; + +SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; + +# +# 3. Cache is invalidated by DDL on remote node +# + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_2 +FLUSH STATUS; + +SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Qcache_queries_in_cache'; +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Qcache_queries_in_cache'; + +SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; +SELECT COUNT(*) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; + +DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera_query_cache_sync_wait.cnf b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.cnf new file mode 100644 index 00000000..80f40b09 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +query_cache_type=1 +query_cache_size=1355776 + +[mysqld.2] +query_cache_type=1 +query_cache_size=1355776 + diff --git a/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test new file mode 100644 index 00000000..6d1e21fd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test @@ -0,0 +1,90 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/have_query_cache.inc +--source include/galera_have_debug_sync.inc + +CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S"; +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; +SELECT MAX(id) FROM t1; # first lookup miss + +# +# Query cache hit, wait timeout +# + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +--error ER_LOCK_WAIT_TIMEOUT +SELECT MAX(id) FROM t1; +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +FLUSH QUERY CACHE; +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; +SET DEBUG_SYNC = "RESET"; + +# +# Query cache miss, wait timeout +# + +--connection node_1 +INSERT INTO t1 VALUES (3); + +--connection node_2 +--error ER_LOCK_WAIT_TIMEOUT +SELECT MAX(id) FROM t1; +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +# +# Query cache miss +# + +--connection node_1 +INSERT INTO t1 VALUES (4); + +--connection node_2 +SELECT MAX(id) FROM t1; + +# +# Query cache hit +# + +FLUSH STATUS; +SELECT MAX(id) FROM t1; +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +# +# Query cache invalidated +# + +--connection node_1 +INSERT INTO t1 VALUES (5); + +--connection node_2 +--send SELECT MAX(id) FROM t1 + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +--connection node_2 +--reap +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits'; + + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig" +DROP TABLE t1; + +--connection node_2a +SET DEBUG_SYNC = "RESET"; diff --git a/mysql-test/suite/galera/t/galera_read_only.test b/mysql-test/suite/galera/t/galera_read_only.test new file mode 100644 index 00000000..c0fa4af0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_read_only.test @@ -0,0 +1,39 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Ensure that the read_only option does not apply to Galera appliers and that replication +# continues, the way MySQL replication would. +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +SET GLOBAL read_only=TRUE; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +CREATE USER foo@localhost; + +--echo # Open connection to node 2 using 'foo' user. +--let $port_2= \$NODE_MYPORT_2 +--connect(foo_node_2,127.0.0.1,foo,,test,$port_2,) + +--echo +--echo # Connect with foo_node_2 +--connection foo_node_2 +--error ER_OPTION_PREVENTS_STATEMENT +INSERT INTO t1 VALUES (2); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +# Cleanup +SET GLOBAL read_only=FALSE; +DROP TABLE t1; +DROP USER foo@localhost; + diff --git a/mysql-test/suite/galera/t/galera_repl_key_format_flat16.test b/mysql-test/suite/galera/t/galera_repl_key_format_flat16.test new file mode 100644 index 00000000..8749c20f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_repl_key_format_flat16.test @@ -0,0 +1,34 @@ +# +# Test repl.key_format = FLAT16 . Since it is very difficult to cause a collision on a 16-byte hash, +# we simply verify that the option is settable and that replication works. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'repl.key_format=FLAT16'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (123); + +CREATE TABLE t2 (f1 VARCHAR(256)) ENGINE=InnoDB; +INSERT INTO t2 VALUES (REPEAT('a', 256)); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +UPDATE t1 SET f1 = 234; +UPDATE t2 SET f1 = REPEAT('b', 256); + +--connection node_1 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 234; +SELECT COUNT(*) = 1 FROM t2 WHERE f1 = REPEAT('b', 256); + + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_repl_max_ws_size.test b/mysql-test/suite/galera/t/galera_repl_max_ws_size.test new file mode 100644 index 00000000..60b866ae --- /dev/null +++ b/mysql-test/suite/galera/t/galera_repl_max_ws_size.test @@ -0,0 +1,29 @@ +# +# Test repl.max_ws_size . A transaction larger than this size can not commit. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` + +CREATE TABLE t1 (f1 VARCHAR(512)) ENGINE=InnoDB; + +SET GLOBAL wsrep_provider_options = 'repl.max_ws_size=512'; + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 VALUES (REPEAT('a', 512)); + +SELECT COUNT(*) = 0 FROM t1; + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log + +DROP TABLE t1; + +CALL mtr.add_suppression("Maximum writeset size exceeded by"); +CALL mtr.add_suppression("transaction size limit"); +CALL mtr.add_suppression("transaction size exceeded"); +CALL mtr.add_suppression("rbr write fail"); diff --git a/mysql-test/suite/galera/t/galera_restart_nochanges.test b/mysql-test/suite/galera/t/galera_restart_nochanges.test new file mode 100644 index 00000000..0a6a0c5c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_restart_nochanges.test @@ -0,0 +1,40 @@ +# +# This test restarts a slave while no updates have been performed on the master. No SST is performed. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--source include/restart_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +--source include/wait_until_ready.inc + +SELECT COUNT(*) = 1 FROM t1; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +DROP TABLE t1; + +# Restore original auto_increment_offset values. +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc + diff --git a/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test b/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test new file mode 100644 index 00000000..ed7f106c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test @@ -0,0 +1,158 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Suppress expected warnings: + +CALL mtr.add_suppression("Aborting"); +CALL mtr.add_suppression("unknown option '--galera-unknown-option'"); + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# +# We should count the number of "Assertion failed" warnings +# in the log file before and after testing. To do this we need +# to save original log file before testing: +# +--let TEST_LOG=$MYSQLTEST_VARDIR/log/mysqld.2.err +--perl + use strict; + my $test_log=$ENV{'TEST_LOG'} or die "TEST_LOG not set"; + my $test_log_copy=$test_log . '.copy'; + if (-e $test_log_copy) { + unlink $test_log_copy; + } +EOF +--copy_file $TEST_LOG $TEST_LOG.copy + +--connection node_2 + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); +INSERT INTO t1 VALUES (1, 'a'), (2, 'a'), (3, 'a'); + +SELECT * FROM t1; + +# Initiate normal shutdown on the node 2 and +# waiting until shutdown has been completed: + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Some updates on node 1: + +UPDATE t1 SET f2 = 'b' WHERE f1 > 1; +UPDATE t1 SET f2 = 'c' WHERE f1 > 2; + +SELECT * FROM t1; + +# Remove the "grastate.dat" file (to initiate new SST) +# and restart node 2 with unknown option: + +--connection node_2 + +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--let $start_mysqld_params=--galera-unknown-option + +--echo Starting server ... +--exec echo "try:$start_mysqld_params" > $_expect_file_name + +# Sleep to ensure that server exited... + +--sleep 30 + +# Restart node 2 without unknown option: + +--let $start_mysqld_params= + +--echo Starting server ... +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Sanity check (node 2 is running now and can perform SQL operators): + +SELECT * FROM t1; + +# Initiate normal shutdown on the node 2 and +# waiting until shutdown has been completed: + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Some updates on node 1 - to initiate IST next time: + +UPDATE t1 SET f2 = 'd' WHERE f1 > 1; +UPDATE t1 SET f2 = 'd' WHERE f1 > 2; + +SELECT * FROM t1; + +# Restart node 2 with unknown option: + +--connection node_2 + +--let $start_mysqld_params=--galera-unknown-option + +--echo Starting server ... +--exec echo "try:$start_mysqld_params" > $_expect_file_name + +# Sleep to ensure that server exited... + +--sleep 30 + +# Restart node 2 without unknown option: + +--let $start_mysqld_params= + +--echo Starting server ... +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Sanity check (node 2 is running now and can perform SQL operators): + +SELECT * FROM t1; + +--connection node_1 + +DROP TABLE t1; +--source include/auto_increment_offset_restore.inc + +# +# We should count the number of "Assertion failed" warnings +# in the log file during test phase - to print the error message +# if quantity of such warnings in log file increased at the end +# of the test: +# +--perl + use strict; + my $test_log=$ENV{'TEST_LOG'} or die "TEST_LOG not set"; + my $test_log_copy=$test_log . '.copy'; + open(FILE, $test_log_copy) or die("Unable to open $test_log_copy: $!\n"); + my $initial=grep(/Assertion * failed/gi,); + close(FILE); + open(FILE, $test_log) or die("Unable to open $test_log: $!\n"); + my $count_warnings=grep(/Assertion * failed/gi,); + close(FILE); + if ($count_warnings != $initial) { + my $diff=$count_warnings-$initial; + print "Assertion failed $diff times.\n"; + } +EOF +--remove_file $TEST_LOG.copy + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_roles.test b/mysql-test/suite/galera/t/galera_roles.test new file mode 100644 index 00000000..3005562d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_roles.test @@ -0,0 +1,201 @@ +# +# Test for CREATE/DROP/GRANT/REVOKE role. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # Testing CREATE/GRANT role +--echo # + +--echo +--echo # On node_1 +--connection node_1 + +CREATE DATABASE test1; +CREATE TABLE test1.t1 (a int, b int); +CREATE TABLE test1.t2 (a int, b int); +INSERT INTO test1.t1 values (1,2),(3,4); +INSERT INTO test1.t2 values (5,6),(7,8); + +CREATE PROCEDURE test1.pr1() SELECT "pr1"; + +CREATE USER foo@localhost; +CREATE ROLE role1; + +GRANT role1 TO foo@localhost; +GRANT RELOAD ON *.* TO role1; +GRANT SELECT ON mysql.* TO role1; +GRANT EXECUTE ON PROCEDURE test1.pr1 TO role1; +GRANT SELECT ON test1.t1 TO role1; +GRANT SELECT (a) ON test1.t2 TO role1; + +--echo # Open connections to the 2 nodes using 'foo' user. +--let $port_1= \$NODE_MYPORT_1 +--connect(foo_node_1,127.0.0.1,foo,,test,$port_1,) + +--let $port_2= \$NODE_MYPORT_2 +--sleep 1 +--connect(foo_node_2,127.0.0.1,foo,,test,$port_2,) + +--echo +--echo # Connect with foo_node_1 +--connection foo_node_1 + +SHOW GRANTS; + +--error ER_SPECIFIC_ACCESS_DENIED_ERROR +FLUSH TABLES; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM mysql.roles_mapping; +--error ER_DBACCESS_DENIED_ERROR +SHOW TABLES FROM test1; + +SET ROLE role1; + +FLUSH TABLES; +--sorted_result +SELECT * FROM mysql.roles_mapping; +SHOW TABLES FROM test1; +SELECT * FROM test1.t1; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM test1.t2; +SELECT a FROM test1.t2; +CALL test1.pr1(); + +--echo +--echo # Connect with foo_node_2 +--connection foo_node_2 + +SHOW GRANTS; + +--error ER_SPECIFIC_ACCESS_DENIED_ERROR +FLUSH TABLES; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM mysql.roles_mapping; +--error ER_DBACCESS_DENIED_ERROR +SHOW TABLES FROM test1; + +SET ROLE role1; + +FLUSH TABLES; +--sorted_result +SELECT * FROM mysql.roles_mapping; +SHOW TABLES FROM test1; +SELECT * FROM test1.t1; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM test1.t2; +SELECT a FROM test1.t2; +CALL test1.pr1(); + +--echo # +--echo # Testing REVOKE role +--echo # + +--echo # +--echo # Connect with node_1 +--connection node_1 +REVOKE EXECUTE ON PROCEDURE test1.pr1 FROM role1; + +--echo +--echo # Connect with foo_node_1 +--connection foo_node_1 + +--sleep 1 +--error ER_PROCACCESS_DENIED_ERROR +CALL test1.pr1(); + +--echo +--echo # Connect with foo_node_2 +--connection foo_node_2 +--sleep 1 +--error ER_PROCACCESS_DENIED_ERROR +CALL test1.pr1(); + +--echo # +--echo # Testing DROP role +--echo # + +--echo +--echo # Connect with node_1 +--connection node_1 + +DROP ROLE role1; + +--echo +--echo # Connect with foo_node_1 +--connection foo_node_1 + +FLUSH TABLES; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM mysql.roles_mapping; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM test1.t1; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT a FROM test1.t2; + +SHOW GRANTS; +SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES; +SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES; # yes, repeat it twice +SELECT CURRENT_ROLE(); + +--echo +--echo # Connect with foo_node_2 +--connection foo_node_2 + +FLUSH TABLES; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM mysql.roles_mapping; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT * FROM test1.t1; +--error ER_TABLEACCESS_DENIED_ERROR +SELECT a FROM test1.t2; + +SHOW GRANTS; +SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES; +SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES; # yes, repeat it twice +SELECT CURRENT_ROLE(); + +# Cleanup +disconnect foo_node_2; +--echo # Connect with node_1 +--connection node_1 + +DROP USER foo@localhost; +DROP DATABASE test1; + +--echo # +--echo # MDEV-10566: Create role statement replicated inconsistently in Galera Cluster +--echo # +--echo +--echo # On node_1 +--connection node_1 +CREATE USER foo@localhost; +CREATE ROLE role1; +CREATE ROLE role2 WITH ADMIN CURRENT_USER; +CREATE ROLE role3 WITH ADMIN foo@localhost; +CREATE ROLE role4 WITH ADMIN role1; + +--sorted_result +SELECT * FROM mysql.roles_mapping; +--sorted_result +SELECT * FROM INFORMATION_SCHEMA.APPLICABLE_ROLES; + +--echo +--echo # On node_2 +--connection node_2 +--sorted_result +SELECT * FROM mysql.roles_mapping; +--sorted_result +SELECT * FROM INFORMATION_SCHEMA.APPLICABLE_ROLES; + +# Cleanup +DROP ROLE role1; +DROP ROLE role2; +DROP ROLE role3; +DROP ROLE role4; +DROP USER foo@localhost; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/galera_rsu_add_pk.test b/mysql-test/suite/galera/t/galera_rsu_add_pk.test new file mode 100644 index 00000000..094048f6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_rsu_add_pk.test @@ -0,0 +1,49 @@ +# +# ALTER TABLE ... ADD PRIMARY KEY under Rolling Schema Upgrade +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +# Insert some values before the ALTER +INSERT INTO t1 (f1) SELECT 000000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +# Insert more values while the ALTER is running +--send INSERT INTO t1 (f1) SELECT 100000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--connection node_2 +SET SESSION wsrep_OSU_method = "RSU"; +ALTER TABLE t1 ADD PRIMARY KEY (f1); +SET SESSION wsrep_OSU_method = "TOI"; + +# Insert values after the ALTER +INSERT INTO t1 (f1) SELECT 200000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--let $wait_condition = SELECT COUNT(*) = 300000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_300000 FROM t1; +SELECT MAX(f1) AS EXPECT_299999 FROM t1; + +--connection node_1 +--reap + +--let $wait_condition = SELECT COUNT(*) = 300000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_300000 FROM t1; +SELECT MAX(f1) AS EXPECT_299999 FROM t1; + +SET SESSION wsrep_OSU_method = "RSU"; +ALTER TABLE t1 ADD PRIMARY KEY (f1); +SET SESSION wsrep_OSU_method = "TOI"; + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_rsu_drop_pk.test b/mysql-test/suite/galera/t/galera_rsu_drop_pk.test new file mode 100644 index 00000000..97bdbcfd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_rsu_drop_pk.test @@ -0,0 +1,66 @@ +# +# ALTER TABLE ... DROP PRIMARY KEY under Rolling Schema Upgrade +# + +--source include/big_test.inc +--source include/galera_cluster.inc + +--connection node_1 +CREATE TABLE ten (f1 INTEGER) Engine=InnoDB; +INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +# Insert some values before the ALTER +INSERT INTO t1 (f1) SELECT 000000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +# Insert more values while the ALTER is running +--send INSERT INTO t1 (f1) SELECT 100000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--connection node_2 +SET SESSION wsrep_OSU_method = "RSU"; +ALTER TABLE t1 DROP PRIMARY KEY; +SET SESSION wsrep_OSU_method = "TOI"; + +# Insert even more data after the ALTER has completed +INSERT INTO t1 (f1) SELECT 200000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--let $wait_condition = SELECT COUNT(*) = 300000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) as expect_300000 FROM t1; +SELECT MAX(f1) as expect_299999 FROM t1; + +--connection node_1 +--reap +--let $wait_condition = SELECT COUNT(*) = 300000 FROM t1; +--source include/wait_condition.inc +SELECT COUNT(*) as expect_300000 FROM t1; +SELECT MAX(f1) as expect_299999 FROM t1; + +SET SESSION wsrep_OSU_method = "RSU"; +ALTER TABLE t1 DROP PRIMARY KEY; +SET SESSION wsrep_OSU_method = "TOI"; + +# Insert some previously-conflicting values after the ALTER has been applied on all nodes. +--connection node_2 +INSERT INTO t1 (f1) VALUES (1); +INSERT INTO t1 (f1) VALUES (10); + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 2 FROM t1 where f1 = 10; +--source include/wait_condition.inc +SELECT COUNT(*) as expect_2 FROM t1 WHERE f1 = 1; +SELECT COUNT(*) as expect_2 FROM t1 WHERE f1 = 10; + +INSERT INTO t1 (f1) VALUES (100); +INSERT INTO t1 (f1) VALUES (1000); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 2 FROM t1 where f1 = 1000; +--source include/wait_condition.inc +SELECT COUNT(*) as expect_2 FROM t1 WHERE f1 = 100; +SELECT COUNT(*) as expect_2 FROM t1 WHERE f1 = 1000; + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_rsu_error.test b/mysql-test/suite/galera/t/galera_rsu_error.test new file mode 100644 index 00000000..6de7607b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_rsu_error.test @@ -0,0 +1,34 @@ +# +# Test DDL errors under Rolling Schema Upgrade +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +INSERT INTO t1 VALUES (1), (1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc + +SET SESSION wsrep_OSU_method = "RSU"; +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD PRIMARY KEY (f1); +SET SESSION wsrep_OSU_method = "TOI"; + +# The ALTER has no effect +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 't1'; + +INSERT INTO t1 VALUES (1); + +--connection node_1 +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 3 FROM t1; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(3) = 4 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_rsu_simple.test b/mysql-test/suite/galera/t/galera_rsu_simple.test new file mode 100644 index 00000000..aa6f25b6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_rsu_simple.test @@ -0,0 +1,37 @@ +# +# Test Rolling Schema Upgrade +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +SET SESSION wsrep_OSU_method = "RSU"; +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_1 +# The ALTER above is not visible on node_1 +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +# The INSERT above is now visible on node_2 +SELECT COUNT(*) = 1 FROM t1; + +INSERT INTO t1 (f1) VALUES (2); + +--connection node_1 +# The ALTER has not replicated +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +# However the INSERT above has +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_rsu_wsrep_desync.test b/mysql-test/suite/galera/t/galera_rsu_wsrep_desync.test new file mode 100644 index 00000000..882f846f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_rsu_wsrep_desync.test @@ -0,0 +1,86 @@ +# +# Test manipulating wsrep_desync while an RSU operation is in progress +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +# First, test wsrep_desync 1 > 0 during DDL + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +SET GLOBAL wsrep_desync=1; +SET wsrep_OSU_method=RSU; + +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1a +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_desync=0; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SHOW CREATE TABLE t1; +SHOW VARIABLES LIKE 'wsrep_desync'; +SET wsrep_OSU_method=TOI; + +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; + +# Next, test wsrep_desync 0 > 1 during DDL, currently not allowed + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +SET GLOBAL wsrep_desync=0; +SET wsrep_OSU_method=RSU; + +SET DEBUG_SYNC = 'alter_table_before_create_table_no_lock WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1a + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_create_table_no_lock' +--source include/wait_condition.inc + +# wsrep_desync=1 will block +--send SET GLOBAL wsrep_desync=1; + + +--connection node_1b +--sleep 2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'SET GLOBAL wsrep_desync=1' +--source include/wait_condition.inc + +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +--connection node_1a +--reap +SET GLOBAL wsrep_desync=0; + +SHOW CREATE TABLE t1; + +# Restore old state +SET wsrep_OSU_method=TOI; +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; + +CALL mtr.add_suppression("Protocol violation"); +CALL mtr.add_suppression("desync failed"); + +--connection node_2 +CALL mtr.add_suppression("Protocol violation"); diff --git a/mysql-test/suite/galera/t/galera_sbr.test b/mysql-test/suite/galera/t/galera_sbr.test new file mode 100644 index 00000000..33f45c6b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sbr.test @@ -0,0 +1,27 @@ +# +# Test behavior if the user attempts to use statement-based replication +# +# SBR is not currently supported but we expect that no crashes or binlog-related assertions will be triggered. +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--connection node_1 +#SET GLOBAL binlog_format = 'STATEMENT'; +SET SESSION binlog_format = 'STATEMENT'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +SET SESSION binlog_format = 'MIXED'; + +INSERT INTO t1 VALUES (2); + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; + +--connection node_1 +SET GLOBAL binlog_format = 'ROW'; diff --git a/mysql-test/suite/galera/t/galera_sbr_binlog.cnf b/mysql-test/suite/galera/t/galera_sbr_binlog.cnf new file mode 100644 index 00000000..9dbd81f7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sbr_binlog.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin + +[mysqld.2] +log-bin diff --git a/mysql-test/suite/galera/t/galera_sbr_binlog.test b/mysql-test/suite/galera/t/galera_sbr_binlog.test new file mode 100644 index 00000000..1291a4ff --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sbr_binlog.test @@ -0,0 +1,28 @@ +# +# Test behavior if the user attempts to use statement-based replication +# +# SBR is not currently supported but we expect that no crashes or binlog-related assertions will be triggered. +# + +--source include/have_log_bin.inc +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--connection node_1 +#SET GLOBAL binlog_format = 'STATEMENT'; +SET SESSION binlog_format = 'STATEMENT'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +SET SESSION binlog_format = 'MIXED'; + +INSERT INTO t1 VALUES (2); + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; + +--connection node_1 +SET GLOBAL binlog_format = 'ROW'; diff --git a/mysql-test/suite/galera/t/galera_schema_dirty_reads.test b/mysql-test/suite/galera/t/galera_schema_dirty_reads.test new file mode 100644 index 00000000..93e24244 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_schema_dirty_reads.test @@ -0,0 +1,13 @@ +# +# Dirty reads from INFORMATION_SCHEMA tables. +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--disable_info +USE information_schema; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +SET GLOBAL wsrep_reject_queries=ALL; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +SET GLOBAL wsrep_reject_queries=NONE; +SET SESSION wsrep_dirty_reads=TRUE; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; diff --git a/mysql-test/suite/galera/t/galera_serializable.test b/mysql-test/suite/galera/t/galera_serializable.test new file mode 100644 index 00000000..b12d57fd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_serializable.test @@ -0,0 +1,76 @@ +# +# Test that the SERIALIZABLE isolation level behaves as expected. +# A local serializable transaction is aborted by an incoming remote update +# +# wsrep_sync_wait does not work well with serializable, see mysql-wsrep#130 +# hence the need to use --sleep . +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (id INT PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; + +# +# Read (local transaction) / Write (remote transaction) conflict +# + +SET AUTOCOMMIT=OFF; +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +START TRANSACTION; + +SELECT * FROM t1; + +--connection node_2 +INSERT INTO t1 VALUES (1,1); + +--sleep 2 +--connection node_1 +--error ER_LOCK_DEADLOCK +SELECT * FROM t1; + +ROLLBACK; +DELETE FROM t1; + +# +# Write (local transaction) / Write (remote transaction) conflict +# + +--connection node_1 +INSERT INTO t1 VALUES (1,1); +START TRANSACTION; +SELECT * FROM t1; + +--connection node_2 +UPDATE t1 SET f2 = 2; + +--sleep 2 +--connection node_1 +--error ER_LOCK_DEADLOCK +UPDATE t1 SET f2 = 3; + +ROLLBACK; +DELETE FROM t1; + +# +# Write (local transaction) / Write (remote transaction) conflict +# Local transaction writes before remote one. +# Nothing special happens here - ordinary deadlock on COMMIT +# + +--connection node_1 +START TRANSACTION; + +--connection node_1 +INSERT INTO t1 VALUES (1,1); + +--connection node_2 +INSERT INTO t1 VALUES (1,2); + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_server.test b/mysql-test/suite/galera/t/galera_server.test new file mode 100644 index 00000000..30b39028 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_server.test @@ -0,0 +1,28 @@ +# Test for CREATE/ALTER/DROP SERVER in Galera cluster + +--source include/galera_cluster.inc + +--connection node_1 +--echo # On node_1 +CREATE SERVER s1 + FOREIGN DATA WRAPPER mysql + OPTIONS (HOST 'foo'); + +--connection node_2 +--echo # On node_2 +SELECT * FROM mysql.servers; +ALTER SERVER s1 + OPTIONS (HOST 'bar'); + +--connection node_1 +--echo # On node_1 +SELECT * FROM mysql.servers; +DROP SERVER s1; + +--connection node_2 +--echo # On node_2 +SELECT COUNT(*)=0 FROM mysql.servers; + +--source include/galera_end.inc +--echo # End of test + diff --git a/mysql-test/suite/galera/t/galera_set_position_after_cert_failure.test b/mysql-test/suite/galera/t/galera_set_position_after_cert_failure.test new file mode 100644 index 00000000..4dfddb0f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_set_position_after_cert_failure.test @@ -0,0 +1,98 @@ +# +# Check that wsrep position is updated in innodb after +# a local certification failure. +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# +# Cause a certification failure. The INSERT on node_2 will fail certification, +# and it is going to be the last event before shutting down node_2. +# +--connection node_2 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(255)) Engine=InnoDB; +SET GLOBAL wsrep_slave_threads = 2; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; + +--let $expected_cert_failures = `SELECT VARIABLE_VALUE + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +--connection node_1 +--send INSERT INTO t1 VALUES (1, 'node_1'); + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_retry_autocommit = 0; + +--send INSERT INTO t1 VALUES (1, 'node_2'); + +--connection node_2a +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_1 +--reap + +--connection node_2a +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "RESET"; + +# +# Keep track of the current position in variable $expected_position +# +--let $expected_position_uuid = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_state_uuid'` +--let $expected_position_seqno = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--let $expected_position = $expected_position_uuid:$expected_position_seqno +--disconnect node_2a + +# +# Shutdown node 2 +# +--connection node_2 +--source include/shutdown_mysqld.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# +# Check that start position matches the position we recorded +# before shutdown in $expected_position +# +--let $galera_wsrep_recover_server_id = 2 +--source suite/galera/include/galera_wsrep_recover.inc + +if ($galera_wsrep_start_position != $expected_position) +{ + --exec echo "expected position $expected_position" + --exec echo "recover position $galera_wsrep_start_position" + die("Expected position and recover position did not match"); +} + +# +# Restart node 2 and cleanup +# +--connection node_2 +--source include/start_mysqld.inc + +--connection node_1 +DROP TABLE t1; +SET GLOBAL wsrep_slave_threads = DEFAULT; +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_set_position_after_dummy_writeset.test b/mysql-test/suite/galera/t/galera_set_position_after_dummy_writeset.test new file mode 100644 index 00000000..76f6d981 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_set_position_after_dummy_writeset.test @@ -0,0 +1,101 @@ +# +# Check that wsrep position is updated in innodb after +# a dummy write set is applied. +# + +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# +# Cause a certification failure. The INSERT on in node_1 will fail certification, +# and will result in a dummy writeset on node_2. This is going to be the last +# writeset before shutting down node_2. +# +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(255)) Engine=InnoDB; +SET GLOBAL wsrep_slave_threads = 2; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; + +--let $expected_cert_failures = `SELECT VARIABLE_VALUE + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +--connection node_2 +--send INSERT INTO t1 VALUES (1, 'node_2'); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait=0; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_retry_autocommit = 0; + +--send INSERT INTO t1 VALUES (1, 'node_1'); + +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +--reap + +# +# Keep track of the current position in variable $expected_position +# +--let $expected_position_uuid = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_state_uuid'` +--let $expected_position_seqno = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--let $expected_position = $expected_position_uuid:$expected_position_seqno + +# +# Shutdown node 2 +# +--connection node_2 +--source include/shutdown_mysqld.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# +# Check that start position matches the position we recorded +# before shutdown in $expected_position +# +--let $galera_wsrep_recover_server_id = 2 +--source suite/galera/include/galera_wsrep_recover.inc + +if ($galera_wsrep_start_position != $expected_position) +{ + --exec echo "expected position $expected_position" + --exec echo "recover position $galera_wsrep_start_position" + die("Expected position and recover position did not match"); +} + +# +# Restart the node 2 and cleanup +# +--connection node_2 +--source include/start_mysqld.inc + +--connection node_1 +DROP TABLE t1; +SET GLOBAL wsrep_slave_threads = DEFAULT; +--source include/auto_increment_offset_restore.inc + +--connection node_1a +SET GLOBAL DEBUG_DBUG=NULL; +SET DEBUG_SYNC = "RESET"; diff --git a/mysql-test/suite/galera/t/galera_shutdown_nonprim.test b/mysql-test/suite/galera/t/galera_shutdown_nonprim.test new file mode 100644 index 00000000..cf7018cd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_shutdown_nonprim.test @@ -0,0 +1,36 @@ +# +# Check that server can be shut down in non-primary configuration. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $node_1 = node_1 +--let $node_2 = node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +# Set higher weight for node_1 to keep it in primary +# while node_2 is isolated. +SET GLOBAL wsrep_provider_options = 'pc.weight=2'; + +--connection node_2 +# Isolate node_2 from the group and wait until wsrep_ready becomes OFF. +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' +--source include/wait_condition.inc + +# Verify that graceful shutdown succeeds. +--source include/shutdown_mysqld.inc +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_1 +--source include/wait_condition.inc + +# Restore original settings. +SET GLOBAL wsrep_provider_options = 'pc.weight = 1'; +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_slave_replay.cnf b/mysql-test/suite/galera/t/galera_slave_replay.cnf new file mode 100644 index 00000000..9449ec9c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_slave_replay.cnf @@ -0,0 +1 @@ +!include ../galera_2nodes_as_slave.cnf diff --git a/mysql-test/suite/galera/t/galera_slave_replay.test b/mysql-test/suite/galera/t/galera_slave_replay.test new file mode 100644 index 00000000..f1500eea --- /dev/null +++ b/mysql-test/suite/galera/t/galera_slave_replay.test @@ -0,0 +1,197 @@ +# +# This test tests the operation of transaction replay for async replication slave. +# If a potentially conflicting galera transaction arrives at +# just the right time during the commit and has lock conflict with async replication transaction +# applied by slave SQL thread, then the async replication transaction should either abort +# or rollback and replay (depending on the nature of lock conflict). +# + +--source include/have_innodb.inc +--source include/have_log_bin.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 + +--connection node_2a +--source include/galera_cluster.inc + +# +# node 3 is native MariaDB server operating as async replication master +# +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +RESET MASTER; + +--connection node_2a +# +# count the number of wsrep replay's done in the node +# +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + + +# +# nodes 1 and 2 form a galera cluster, node 2 operates as slave for native MariaDB master in node 3 +# +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--enable_query_log +START SLAVE; + +--connection node_3 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (3, 'a'); + +# +# use statement format replication to cause a false positive conflict with async replication transaction +# and galera replication. The conflict will be on GAP lock, and slave SQL thread should rollback +# and replay +# +set binlog_format=STATEMENT; + +SET AUTOCOMMIT=ON; +START TRANSACTION; + +SELECT * FROM t1 FOR UPDATE; +UPDATE t1 SET f2 = 'c' WHERE f1 > 1; + +--connection node_2a +# wait for create table and inserts to be replicated from master +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1; +--source include/wait_condition.inc + +# wait for create table and inserts to be replicated in cluster +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1; +--source include/wait_condition.inc + +--connection node_2a +# Block the future commit of async replication +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +# block also the applier before applying begins +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +# +# now inject a conflicting insert from node 1, it will replicate with +# earlier seqno (than async transaction) and pause before applying in node 2 +# +--connection node_1 +INSERT INTO test.t1 VALUES (2, 'b'); + +# +# send the update from master, this will succeed here, beceuase of async replication. +# async replication will apply this in node 2 and pause before commit phase, +--connection node_3 +--error 0 +COMMIT; + +# Wait until async slave commit is blocked in node_2 +--connection node_2a +--source include/galera_wait_sync_point.inc + +# +# release the applier +# note: have to clear wsrep_apply_cb sync point first, as async replication will go for replay +# and as this sync point, after BF applier is released to progress +# +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +# Unblock the async slave commit +--connection node_2a +--source include/galera_clear_sync_point.inc +--source include/galera_signal_sync_point.inc + +--connection node_3 + +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; +SELECT * FROM t1; + +--connection node_2a + +# wsrep_local_replays has increased by 1 +set session wsrep_sync_wait=15; +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +set session wsrep_sync_wait=0; + +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; +--enable_query_log + +# +# replaying of async transaction should be effective, and row 3 having 'c' in f2 +# +SELECT * FROM t1; +SET DEBUG_SYNC = "RESET"; + +#******************************************************************************** +# test phase 2 +#******************************************************************************** + +--echo # +--echo # test phase with real abort +--echo # + +--connection node_3 + +set binlog_format=ROW; + +insert into t1 values (4, 'd'); + +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = 'd' WHERE f1 = 3; + +--connection node_2a +# wait for the last insert to be replicated from master +--let $wait_condition = SELECT COUNT(*) = 4 FROM test.t1; +--source include/wait_condition.inc + +# block applier +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +# Inject a conflicting update from node 1 +--connection node_1 +UPDATE test.t1 SET f2 = 'e' WHERE f1 = 3; + +--connection node_2a +# wait until applier has reached the sync point +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; +--let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +# send the update from master +--connection node_3 +--error 0 +COMMIT; + +--connection node_2a +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +# release the applier from node 1 +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +--connection node_2a + +set session wsrep_sync_wait=15; +SELECT COUNT(*) = 1 FROM test.t1 WHERE f2 = 'e'; +set session wsrep_sync_wait=0; + +STOP SLAVE; +RESET SLAVE; +SET DEBUG_SYNC = "RESET"; + +DROP TABLE t1; + +--connection node_3 +DROP TABLE t1; +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_sp_bf_abort.inc b/mysql-test/suite/galera/t/galera_sp_bf_abort.inc new file mode 100644 index 00000000..58345184 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sp_bf_abort.inc @@ -0,0 +1,38 @@ + +# +# Issue an INSERT for gap between 1 and 3 to node_2 and wait until it hits +# apply monitor sync point on node_1 +# + +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +--eval $galera_sp_bf_abort_conflict + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Send a procedure to node_1 which should take a gap lock between +# rows 1 and 3. It does not conflict with INSERT from node_2 in +# certification. Park the UPDATE after replicate and let INSERT to +# continue applying, generating a BF abort. + +--let $galera_sync_point = after_replicate_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send_eval CALL $galera_sp_bf_abort_proc + +--connection node_1a +--let $galera_sync_point = after_replicate_sync apply_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = after_replicate_sync +--source include/galera_signal_sync_point.inc + diff --git a/mysql-test/suite/galera/t/galera_sp_bf_abort.test b/mysql-test/suite/galera/t/galera_sp_bf_abort.test new file mode 100644 index 00000000..ce5e00ff --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sp_bf_abort.test @@ -0,0 +1,347 @@ +# +# Test cases for stored procedure BF aborts. +# + +--source include/galera_cluster.inc +--source include/galera_have_debug_sync.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); + +# Control connection for Galera sync point management +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; + +--connection node_1 +# +# Case 1a: Procedure does and UPDATE which will suffer BF abort +# but there is no actual conflict and non-conflicting INSERT. +# The expected outcome is that both UPDATE and INSERT will succedd +# and no errors are reported to the client, wsrep_local_replays is +# incremented by one. +# +DELIMITER |; +CREATE PROCEDURE proc_update_insert() +BEGIN + UPDATE t1 SET f2 = 'b'; + INSERT INTO t1 VALUES (4, 'd'); +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +SET SESSION wsrep_sync_wait = 0; +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_update_insert +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 1 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 +# +# Case 1b: Procedure does and UPDATE which will suffer BF abort +# but there is no actual conflict and non-conflicting INSERT. +# An EXIT HANDLER is declared for the procedure. +# The expected outcome is that both UPDATE and INSERT will succedd +# and no errors are reported to the client, wsrep_local_replays is +# incremented by one. +# +DELIMITER |; +CREATE PROCEDURE proc_update_insert_with_exit_handler() +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; + UPDATE t1 SET f2 = 'b'; + INSERT INTO t1 VALUES (4, 'd'); +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +SET SESSION wsrep_sync_wait = 0; +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_update_insert_with_exit_handler +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 1 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 +# +# Case 1c: Procedure does and UPDATE which will suffer BF abort +# but there is no actual conflict and non-conflicting INSERT. +# A CONTINUE HANDLER is declared for the procedure. +# The expected outcome is that both UPDATE and INSERT will succedd +# and no errors are reported to the client, wsrep_local_replays is +# incremented by one. +# +DELIMITER |; +CREATE PROCEDURE proc_update_insert_with_continue_handler() +BEGIN + + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + UPDATE t1 SET f2 = 'b'; + INSERT INTO t1 VALUES (4, 'd'); +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +SET SESSION wsrep_sync_wait = 0; +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_update_insert_with_continue_handler +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 1 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 +# +# Case 2a: UPDATE and INSERT are run inside a transaction and the transaction +# will be BF aborted on COMMIT. The expected outcome is that the transaction +# succeeds and no errors are reported to the client, wsrep_local_replays +# is incremented by one. +# + +DELIMITER |; +CREATE PROCEDURE proc_update_insert_transaction() +BEGIN + START TRANSACTION; + UPDATE t1 SET f2 = 'b'; + INSERT INTO t1 VALUES (4, 'd'); + COMMIT; +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_update_insert_transaction +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +SET SESSION wsrep_sync_wait = 0; +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 1 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 +# +# Case 2b: UPDATE and INSERT are run inside a transaction and the transaction +# will be BF aborted on COMMIT. A CONTINUE HANDLER is declared for the +# procedure. The expected outcome is that the transaction +# succeeds and no errors are reported to the client, wsrep_local_replays +# is incremented by one. +# + +DELIMITER |; +CREATE PROCEDURE proc_update_insert_transaction_with_continue_handler() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + START TRANSACTION; + UPDATE t1 SET f2 = 'b'; + INSERT INTO t1 VALUES (4, 'd'); + COMMIT; +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_update_insert_transaction_with_continue_handler +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +SET SESSION wsrep_sync_wait = 0; +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 1 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 +# +# Case 2c: UPDATE and INSERT are run inside a transaction and the transaction +# will be BF aborted on COMMIT. An EXIT HANDLE is declared for the procedure. +# The expected outcome is that the transaction succeeds and no errors are +# reported to the client, wsrep_local_replays is incremented by one. +# + +DELIMITER |; +CREATE PROCEDURE proc_update_insert_transaction_with_exit_handler() +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; + START TRANSACTION; + UPDATE t1 SET f2 = 'b'; + INSERT INTO t1 VALUES (4, 'd'); + COMMIT; +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_update_insert_transaction_with_exit_handler +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +SET SESSION wsrep_sync_wait = 0; +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 1 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 + +# +# Case 3a: Two INSERTs are run inside stored procedure, this time +# the first INSERT will have a BF abort and real conflict. The expected outcome +# is that the INSERT fails and an error is reported to the client. +# wsrep_local_replays is not incremented. +# +# Notice that the resulting error code may be both +# ER_DUP_ENTRY (procedure will exit with cert failure conflict state and +# will be) or ER_LOCK_DEADLOCK depending on timing. +# +DELIMITER |; +CREATE PROCEDURE proc_insert_insert_conflict() +BEGIN + INSERT INTO t1 VALUES (2, 'd'); + INSERT INTO t1 VALUES (4, 'd'); +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_insert_insert_conflict +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +SET SESSION wsrep_sync_wait = 0; +--source galera_sp_bf_abort.inc +--connection node_1 +--error ER_DUP_ENTRY,ER_LOCK_DEADLOCK +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 0 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 + +# +# Case 3b: Two INSERTs are run inside stored procedure, this time +# the first INSERT will have a BF abort and real conflict. +# An EXIT HANDLER is declared for the procedure. The expected outcome +# is that the INSERT fails and an error is reported to the client. +# wsrep_local_replays is not incremented. +# +DELIMITER |; +CREATE PROCEDURE proc_insert_insert_conflict_with_exit_handler() +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT "Conflict exit handler"; + INSERT INTO t1 VALUES (2, 'd'); + INSERT INTO t1 VALUES (4, 'd'); +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_insert_insert_conflict_with_exit_handler +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +SET SESSION wsrep_sync_wait = 0; +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 0 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + +--connection node_1 + +# +# Case 3c: Two INSERTs are run inside stored procedure, this time +# the first INSERT will have a BF abort and real conflict. +# A CONTINUE HANDLER is declared for the procedure. The expected outcome +# is that the the first INSERT fails but the second is executed without +# errors. wsrep_local_replays is not incremented. +# +DELIMITER |; +CREATE PROCEDURE proc_insert_insert_conflict_with_continue_handler() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT "Conflict continue handler"; + INSERT INTO t1 VALUES (2, 'd'); + INSERT INTO t1 VALUES (4, 'd'); +END| +DELIMITER ;| + +INSERT INTO t1 VALUES (1, 'a'), (3, 'a'); +--let $wsrep_local_replays_orig = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--let $galera_sp_bf_abort_proc = proc_insert_insert_conflict_with_continue_handler +--let $galera_sp_bf_abort_conflict = INSERT INTO t1 VALUES (2, 'c') +SET SESSION wsrep_sync_wait = 0; +--source galera_sp_bf_abort.inc +--connection node_1 +--reap +SET SESSION wsrep_sync_wait = default; +SELECT * FROM t1; +--let $wsrep_local_replays_curr = `SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_curr - $wsrep_local_replays_orig = 0 AS wsrep_local_replays; +--enable_query_log + +DELETE FROM t1; + + +DROP PROCEDURE proc_update_insert; +DROP PROCEDURE proc_update_insert_with_continue_handler; +DROP PROCEDURE proc_update_insert_with_exit_handler; +DROP PROCEDURE proc_update_insert_transaction; +DROP PROCEDURE proc_update_insert_transaction_with_continue_handler; +DROP PROCEDURE proc_update_insert_transaction_with_exit_handler; +DROP PROCEDURE proc_insert_insert_conflict; +DROP PROCEDURE proc_insert_insert_conflict_with_exit_handler; +DROP PROCEDURE proc_insert_insert_conflict_with_continue_handler; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_sp_insert_parallel.test b/mysql-test/suite/galera/t/galera_sp_insert_parallel.test new file mode 100644 index 00000000..b6878a9c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sp_insert_parallel.test @@ -0,0 +1,55 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; + + +DELIMITER |; +CREATE PROCEDURE proc_insert() +BEGIN + DECLARE i INT; + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + + SET i = 0; + WHILE i < 1000 DO + INSERT IGNORE INTO t1 (f1, f2) + VALUES (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)), + (FLOOR(1 + RAND() * 65535), FLOOR(1 + RAND() * 15)); + SET i = i + 1; + + END WHILE; +END| +DELIMITER ;| + +--connection node_1 +SELECT 0; +SET SESSION wsrep_sync_wait = 0; +--send CALL proc_insert +--connection node_2 +SELECT 0; +SET SESSION wsrep_sync_wait = 0; +--send CALL proc_insert + +--connection node_1 +--error 0,ER_LOCK_DEADLOCK,ER_QUERY_INTERRUPTED +--disable_warnings +--reap +--enable_warnings +SET SESSION wsrep_sync_wait = default; +--connection node_2 +--error 0,ER_LOCK_DEADLOCK,ER_QUERY_INTERRUPTED +--disable_warnings +--reap +--enable_warnings +SET SESSION wsrep_sync_wait = default; + +--connection node_1 +DROP PROCEDURE proc_insert; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_split_brain.test b/mysql-test/suite/galera/t/galera_split_brain.test new file mode 100644 index 00000000..6a822b8f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_split_brain.test @@ -0,0 +1,43 @@ +# +# Confirm that with two nodes, killing one causes the other to stop accepting +# connections. +# The pc.ignore_sb=true wsrep_provider option is tested in the galera_kill_* +# tests. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +call mtr.add_suppression("WSREP: TO isolation failed for: "); + +--connection node_1 +--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address` + +--connection node_2 +--source include/kill_galera.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; + +# Reset the master and restart the slave so that post-test checks can run +--connection node_2 +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/wait_until_connected_again.inc + +# Restore original auto_increment_offset values. +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_sql_log_bin_zero.test b/mysql-test/suite/galera/t/galera_sql_log_bin_zero.test new file mode 100644 index 00000000..cd8d6ba6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sql_log_bin_zero.test @@ -0,0 +1,26 @@ +# +# Test SET SESSION sql_log_bin = 0 . We expect that updates gets repliated to +# other nodes while they do not show up in the binary log files. +# (see galera.galera_as_master) +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; + +SET SESSION sql_log_bin = 0; + +INSERT INTO t1 VALUES (1); + +SET SESSION sql_log_bin = 1; + +INSERT INTO t1 VALUES (2); + + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ssl.cnf b/mysql-test/suite/galera/t/galera_ssl.cnf new file mode 100644 index 00000000..de57c9ff --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=10M;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=10M;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem' diff --git a/mysql-test/suite/galera/t/galera_ssl.test b/mysql-test/suite/galera/t/galera_ssl.test new file mode 100644 index 00000000..e6346aa2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl.test @@ -0,0 +1,25 @@ +# +# Test node connections over SSL. The accompanying galera_ssl.cnf has a customized +# wsrep_provider_options setting that enables SSL. +# +# At this time, the actual operation of SSL is not visible only in the error log and not in SHOW STATUS. +# So this test can only check that the cluster has formed and is replicating. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_ssl_compression.cnf b/mysql-test/suite/galera/t/galera_ssl_compression.cnf new file mode 100644 index 00000000..4dffe99b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_compression.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem;socket.ssl_compression=YES' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem;socket.ssl_compression=YES' diff --git a/mysql-test/suite/galera/t/galera_ssl_compression.test b/mysql-test/suite/galera/t/galera_ssl_compression.test new file mode 100644 index 00000000..75f92c5b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_compression.test @@ -0,0 +1,35 @@ +# +# Test SSL compression. The accompanying galera_ssl_compression.cnf has a customized wsrep_provider_options setting that enables SSL and compression. +# +# Unfortunately there is no wire-level traffic bytes counter that would allow us to determine that compression kicked in, so we can only +# perform a most basic replication check. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_2 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 + +# Check that the socket.ssl_compression provider option is not dynamic +--error ER_WRONG_ARGUMENTS +SET GLOBAL wsrep_provider_options = "socket.ssl_compression=No"; + +CREATE TABLE t1 (f1 VARCHAR(333) PRIMARY KEY, f2 BLOB) Engine=InnoDB; +INSERT INTO t1 VALUES (REPEAT('a', 333), REPEAT('b', 65535)); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = REPEAT('a', 333) AND f2 = REPEAT('b', 65535); + +--connection node_1 +DROP TABLE t1; + +CALL mtr.add_suppression("Unknown parameter 'socket\.ssl_compression'"); +CALL mtr.add_suppression("Set options returned 7"); diff --git a/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf b/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf new file mode 100644 index 00000000..2954ae0f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem' diff --git a/mysql-test/suite/galera/t/galera_ssl_upgrade.test b/mysql-test/suite/galera/t/galera_ssl_upgrade.test new file mode 100644 index 00000000..c4ad652a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ssl_upgrade.test @@ -0,0 +1,79 @@ +# +# Test upgrading the SSL certificates in a rolling fashion. +# +# 1. The starting state with the old key and cert is is described in galera_ssl_upgrade.cnf +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_ssl_communication.inc + +--connection node_1 +call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*"); +--connection node_2 +call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*"); + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# Setup galera ports +--connection node_1 +--source suite/galera/include/galera_base_port.inc +--let $NODE_GALERAPORT_1 = $_NODE_GALERAPORT + +--connection node_2 +--source suite/galera/include/galera_base_port.inc +--let $NODE_GALERAPORT_2 = $_NODE_GALERAPORT + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 2. Restart node #1 with a socket.ssl_ca that includes both the new and the old certificate + +--connection node_1 +--source include/shutdown_mysqld.inc +--let $restart_noprint = 1 +--let $start_mysqld_params = --wsrep-cluster-address=gcomm://127.0.0.1:$NODE_GALERAPORT_2 --wsrep_provider_options=base_port=$NODE_GALERAPORT_1;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-key.pem +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 3. Restart node #2 with the new socket.ssl_ca , socket.ssl_cert and socket.ssl_key + +--connection node_2 +--source include/shutdown_mysqld.inc +--let $start_mysqld_params = --wsrep_provider_options=base_port=$NODE_GALERAPORT_2;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-key.pem +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 4. Restart node #1 with the new socket.ssl_ca , socket.ssl_cert and socket.ssl_key + +--connection node_1 +--source include/shutdown_mysqld.inc +--let $start_mysqld_params = --wsrep-cluster-address=gcomm://127.0.0.1:$NODE_GALERAPORT_2 --wsrep_provider_options=base_port=$NODE_GALERAPORT_1;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-upgrade-server-key.pem +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +# 5. Make sure node_2 is ready as well +--connection node_2 +--source include/galera_wait_ready.inc + +# Upgrade complete. Both nodes now use the new key and certificate + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf new file mode 100644 index 00000000..857a4101 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=mbstream diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup.test b/mysql-test/suite/galera/t/galera_sst_mariabackup.test new file mode 100644 index 00000000..bcb9ade3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup.test @@ -0,0 +1,20 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.cnf new file mode 100644 index 00000000..b1caf700 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.cnf @@ -0,0 +1,17 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +innodb_data_home_dir=@ENV.MYSQL_TMP_DIR/data_dir_test +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=xbstream diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.test new file mode 100644 index 00000000..aad68460 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_data_dir.test @@ -0,0 +1,23 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc + +# cleanup temporary database files: +--remove_files_wildcard $MYSQL_TMP_DIR/data_dir_test * diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.cnf new file mode 100644 index 00000000..865c91f9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 + +[sst] +encrypt-format=openssl +encrypt=1 +encrypt-algo=aes-256-ctr +encrypt-key=4FA92C5873672E20FB163A0BCB2BB4A4 +transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.test new file mode 100644 index 00000000..1a78aa22 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key-openssl.test @@ -0,0 +1,12 @@ +# +# This test checks that encryption with key using openssl with options +# passed to mariabackup via the my.cnf file +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +SELECT 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.cnf new file mode 100644 index 00000000..60db7ddb --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.cnf @@ -0,0 +1,12 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 + +[SST] +tkey=@ENV.MYSQL_TEST_DIR/std_data/cakey.pem +tcert=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem +encrypt=3 +transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.test new file mode 100644 index 00000000..523d4410 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key.test @@ -0,0 +1,24 @@ +# +# This test checks that key and cert encryption options can be passed to +# mariabackup via the my.cnf file +# Initial SST happens via mariabackup, so there is not much to do in the body +# of the test +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +SELECT 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that transfer was SSL-encrypted +--let $assert_text = Using openssl based encryption with socat +--let $assert_select = Using openssl based encryption with socat: with key and crt +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = CURRENT_TEST +--source include/assert_grep.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.cnf new file mode 100644 index 00000000..0dc79df5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 + +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem + +[sst] +ssl-mode=VERIFY_CA diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.test new file mode 100644 index 00000000..5673dda3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_encrypt_with_key_server.test @@ -0,0 +1,25 @@ +# +# This test checks that if SST SSL is not explicitly donfigured mariabackup SST +# uses server SSL configuration if present. +# Initial SST happens via mariabackup, so there is not much to do in the body +# of the test +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc +--source include/have_ssl_communication.inc + +SELECT 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that transfer was SSL-encrypted +--let $assert_text = Using openssl based encryption with socat +--let $assert_select = Using openssl based encryption with socat: with key and crt +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = CURRENT_TEST +--source include/assert_grep.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.cnf new file mode 100644 index 00000000..a09efd2e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=xbstream diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.test new file mode 100644 index 00000000..e8dcbd84 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_lost_found.test @@ -0,0 +1,71 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 + +#--connection node_2 +#--source suite/galera/include/galera_stop_replication.inc + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +CREATE DATABASE `lost+found`; +USE `lost+found`; +CREATE TABLE t1(id INT); +INSERT INTO t1 VALUES (1), (2); +SELECT * FROM `lost+found`.t1; + +CREATE DATABASE `#mysql50#not_lost+found`; +USE `#mysql50#not_lost+found`; +CREATE TABLE t1(id INT); +INSERT INTO t1 VALUES (1), (2); +SELECT * FROM `#mysql50#not_lost+found`.t1; + +# +# Force SST +# +--echo Cleaning var directory ... +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/mtr +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/performance_schema +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/test +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/mysql +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data + +--connection node_2 + +--echo Starting server ... +let $restart_noprint=2; +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +SELECT * FROM `lost+found`.t1; +SELECT * FROM `#mysql50#not_lost+found`.t1; + +--connection node_1 + +DROP DATABASE `lost+found`; +DROP DATABASE `#mysql50#not_lost+found`; + +# rmdir $MYSQLD_DATADIR/lost+found; +# rmdir $MYSQLD_DATADIR/not_lost+found; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.cnf new file mode 100644 index 00000000..e99c819d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +compress=quicklz +compress-threads=2 +compress-chunk-size=32768 +backup-threads=2 diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.test new file mode 100644 index 00000000..b5386885 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_qpress.test @@ -0,0 +1,24 @@ +# +# This test checks that qpress compression works with mariabackup +# Initial SST happens via mariabackup, so there is not much to do in the body +# of the test +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc +--source include/have_qpress.inc + +SELECT 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that transfer was compressed using qpress algorithm +--let $assert_text = Compressed qpress files found +--let $assert_select = Compressed qpress files found +--let $assert_count = 1 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = CURRENT_TEST +--source include/assert_grep.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.cnf new file mode 100644 index 00000000..4c570172 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.cnf @@ -0,0 +1,18 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=1 +innodb-file-format='Barracuda' +innodb-file-per-table=ON + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=mbstream diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.test new file mode 100644 index 00000000..953a1635 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_table_options.test @@ -0,0 +1,229 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_file_key_management.inc +--source include/innodb_encrypt_tables.inc +--source include/innodb_page_size_small.inc +--source include/have_mariabackup.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--echo Performing State Transfer on a server that starts from a clean var directory +--echo This is accomplished by shutting down node #2 and removing its var directory before restarting it + +--connection node_1 +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +CREATE TABLE t2 (f1 CHAR(255)) ENGINE=InnoDB PAGE_COMPRESSED=1; +CREATE TABLE t3 (f1 CHAR(255)) ENGINE=InnoDB PAGE_COMPRESSED=1 ENCRYPTED=NO; +CREATE TABLE t4 (f1 CHAR(255)) ENGINE=InnoDB PAGE_COMPRESSED=1 ENCRYPTED=YES; +CREATE TABLE t5 (f1 CHAR(255)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +CREATE TABLE t6 (f1 CHAR(255)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED ENCRYPTED=NO; +CREATE TABLE t7 (f1 CHAR(255)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED ENCRYPTED=YES; +CREATE TABLE t8 (f1 CHAR(255)) ENGINE=InnoDB ENCRYPTED=NO; +CREATE TABLE t9 (f1 CHAR(255)) ENGINE=InnoDB ENCRYPTED=YES; + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_committed_before'); + dec $rows; + } + dec $tables; +} +COMMIT; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 5 FROM t7; +--source include/wait_condition.inc + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node2_committed_before'); + dec $rows; + } + dec $tables; +} +COMMIT; + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--echo Cleaning var directory ... +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/mtr +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/performance_schema +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/test +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data/mysql +--remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.2/data + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_committed_during'); + dec $rows; + } + dec $tables; +} +COMMIT; + +START TRANSACTION; +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_to_be_committed_after'); + dec $rows; + } + dec $tables; +} + +--connect node_1a_galera_st_clean_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_to_be_rollbacked_after'); + dec $rows; + } + dec $tables; +} + +--connection node_2 +--echo Starting server ... +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node2_committed_after'); + dec $rows; + } + dec $tables; +} +COMMIT; + +--connection node_1 +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_to_be_committed_after'); + dec $rows; + } + dec $tables; +} +COMMIT; + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +let $tables = 9; +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_committed_after'); + dec $rows; + } + dec $tables; +} +COMMIT; + +--connection node_1a_galera_st_clean_slave +while ($tables) +{ + let $rows = 5; + while($rows) + { + eval insert into t$tables values ('node1_to_be_rollbacked_after'); + dec $rows; + } + dec $tables; +} +ROLLBACK; + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t2; +SELECT COUNT(*) FROM t3; +SELECT COUNT(*) FROM t4; +SELECT COUNT(*) FROM t5; +SELECT COUNT(*) FROM t6; +SELECT COUNT(*) FROM t7; +SELECT COUNT(*) FROM t8; +SELECT COUNT(*) FROM t9; +SELECT * FROM t1; +SELECT * FROM t2; +SELECT * FROM t3; +SELECT * FROM t4; +SELECT * FROM t5; +SELECT * FROM t6; +SELECT * FROM t7; +SELECT * FROM t8; +SELECT * FROM t9; +COMMIT; +SET AUTOCOMMIT=ON; + +--connection node_1 +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t2; +SELECT COUNT(*) FROM t3; +SELECT COUNT(*) FROM t4; +SELECT COUNT(*) FROM t5; +SELECT COUNT(*) FROM t6; +SELECT COUNT(*) FROM t7; +SELECT COUNT(*) FROM t8; +SELECT COUNT(*) FROM t9; +SELECT * FROM t1; +SELECT * FROM t2; +SELECT * FROM t3; +SELECT * FROM t4; +SELECT * FROM t5; +SELECT * FROM t6; +SELECT * FROM t7; +SELECT * FROM t8; +SELECT * FROM t9; +COMMIT; + +DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8,t9; +COMMIT; +SET AUTOCOMMIT=ON; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump.cnf b/mysql-test/suite/galera/t/galera_sst_mysqldump.cnf new file mode 100644 index 00000000..af4fedf1 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +# We do not set mysqldump-related SST options here because doing so on startup +# causes the first MTR connection to be forefully dropped by Galera, which in turn confuses MTR + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump.test b/mysql-test/suite/galera/t/galera_sst_mysqldump.test new file mode 100644 index 00000000..cce4d374 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump.test @@ -0,0 +1,20 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source suite/galera/include/galera_sst_set_mysqldump.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_disconnect_slave.inc + +# We set the required mysqldump SST options here so that they are used every time the server is restarted during the test +--let $start_mysqld_params = --wsrep_sst_auth=sst:sst --wsrep_sst_method=mysqldump --wsrep-sst-receive-address=127.0.0.1:$NODE_MYPORT_2 --skip-grant-tables + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +--source include/auto_increment_offset_restore.inc +--source suite/galera/include/galera_sst_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf new file mode 100644 index 00000000..0f38a857 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf @@ -0,0 +1,17 @@ +!include ../galera_2nodes.cnf + +# We do not set mysqldump-related SST options here because doing so on startup +# causes the first MTR connection to be forefully dropped by Galera, which in turn confuses MTR + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' +wsrep_sync_wait=0 + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' +wsrep_sync_wait=0 + +[client] +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/client-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/client-key.pem diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test new file mode 100644 index 00000000..3e0e944b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test @@ -0,0 +1,32 @@ +# +# Test mysqldump SST with client SSL key. See galera_sst_mysqldump_with_key.cnf for the configuration on the client side. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_ssl_communication.inc + +--source suite/galera/include/galera_sst_set_mysqldump.inc +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE USER sslsst; +GRANT ALL PRIVILEGES ON *.* TO sslsst; +GRANT USAGE ON *.* TO sslsst REQUIRE SSL; + +SET GLOBAL wsrep_sst_auth = 'sslsst:'; + +# We set the required mysqldump SST options here so that they are used every time the server is restarted during the test +--let $start_mysqld_params = --wsrep_sst_auth=sst:'sslsst:' --wsrep_sst_method=mysqldump --wsrep-sst-receive-address=127.0.0.1:$NODE_MYPORT_2 + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +--source include/auto_increment_offset_restore.inc +--source suite/galera/include/galera_sst_restore.inc + +DROP USER sslsst; diff --git a/mysql-test/suite/galera/t/galera_sst_rsync.cnf b/mysql-test/suite/galera/t/galera_sst_rsync.cnf new file mode 100644 index 00000000..29d3a1e6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_sst_rsync.test b/mysql-test/suite/galera/t/galera_sst_rsync.test new file mode 100644 index 00000000..5c08707e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync.test @@ -0,0 +1,13 @@ +--source include/big_test.inc +--source include/galera_cluster.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_rsync2.cnf b/mysql-test/suite/galera/t/galera_sst_rsync2.cnf new file mode 100644 index 00000000..0159596f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync2.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' +log_bin=@ENV.MYSQLTEST_VARDIR/server1_binlog +log_bin_index=@ENV.MYSQLTEST_VARDIR/tmp/server1_binlog_index.index + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' +log_bin=@ENV.MYSQLTEST_VARDIR/server2_binlog +log_bin_index=@ENV.MYSQLTEST_VARDIR/tmp/server2_binlog_index.index diff --git a/mysql-test/suite/galera/t/galera_sst_rsync2.test b/mysql-test/suite/galera/t/galera_sst_rsync2.test new file mode 100644 index 00000000..f796356c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync2.test @@ -0,0 +1,12 @@ +--source include/galera_cluster.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_binlogname.cnf b/mysql-test/suite/galera/t/galera_sst_rsync_binlogname.cnf new file mode 100644 index 00000000..b1e4278d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_binlogname.cnf @@ -0,0 +1,12 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' +log_bin=server1_binlog + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' +log_bin=server2_binlog diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_binlogname.test b/mysql-test/suite/galera/t/galera_sst_rsync_binlogname.test new file mode 100644 index 00000000..b4ad6c43 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_binlogname.test @@ -0,0 +1,9 @@ +--source include/galera_cluster.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_data_dir.cnf b/mysql-test/suite/galera/t/galera_sst_rsync_data_dir.cnf new file mode 100644 index 00000000..4cc3442b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_data_dir.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +innodb_data_home_dir=@ENV.MYSQL_TMP_DIR/rsync_test_2 +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +backup_threads=2 diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_data_dir.test b/mysql-test/suite/galera/t/galera_sst_rsync_data_dir.test new file mode 100644 index 00000000..68aa1068 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_data_dir.test @@ -0,0 +1,16 @@ +--source include/big_test.inc +--source include/galera_cluster.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc + +# cleanup temporary database files: +--remove_files_wildcard $MYSQL_TMP_DIR/rsync_test_2 * diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.cnf new file mode 100644 index 00000000..948b52d4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.cnf @@ -0,0 +1,14 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[sst] +tkey=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem +tcert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.test b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.test new file mode 100644 index 00000000..838c473b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_key.test @@ -0,0 +1,29 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_stunnel.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +CALL mtr.add_suppression("\\[ERROR\\] .*ib_buffer_pool' for reading: No such file or directory"); + +--connection node_1 +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +# Confirm that transfer was SSL-encrypted +--let $assert_text = Using stunnel for SSL encryption +--let $assert_select = Using stunnel for SSL encryption +--let $assert_count = 5 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = CURRENT_TEST +--source include/assert_grep.inc + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.cnf b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.cnf new file mode 100644 index 00000000..8ed9348e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem + +[sst] +ssl-mode=VERIFY_CA + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.test b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.test new file mode 100644 index 00000000..838c473b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_encrypt_with_server.test @@ -0,0 +1,29 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_stunnel.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +CALL mtr.add_suppression("\\[ERROR\\] .*ib_buffer_pool' for reading: No such file or directory"); + +--connection node_1 +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +# Confirm that transfer was SSL-encrypted +--let $assert_text = Using stunnel for SSL encryption +--let $assert_select = Using stunnel for SSL encryption +--let $assert_count = 5 +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_only_after = CURRENT_TEST +--source include/assert_grep.inc + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_logbasename.cnf b/mysql-test/suite/galera/t/galera_sst_rsync_logbasename.cnf new file mode 100644 index 00000000..4f25af7c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_logbasename.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' +log_basename=server1 +log_bin + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' +log_basename=server2 +log_bin + diff --git a/mysql-test/suite/galera/t/galera_sst_rsync_logbasename.test b/mysql-test/suite/galera/t/galera_sst_rsync_logbasename.test new file mode 100644 index 00000000..b4ad6c43 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_rsync_logbasename.test @@ -0,0 +1,9 @@ +--source include/galera_cluster.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_status_cluster.test b/mysql-test/suite/galera/t/galera_status_cluster.test new file mode 100644 index 00000000..3299613d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_status_cluster.test @@ -0,0 +1,18 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# A simple test for the wsrep_cluster_* status variables +# + +--connection node_1 + +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; + +--connection node_2 + +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; + + diff --git a/mysql-test/suite/galera/t/galera_status_local_index.test b/mysql-test/suite/galera/t/galera_status_local_index.test new file mode 100644 index 00000000..b61b8ced --- /dev/null +++ b/mysql-test/suite/galera/t/galera_status_local_index.test @@ -0,0 +1,21 @@ +# +# Test that a two-node cluster has distinct values for wsrep_local_index for its nodes +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE wsrep_local_indexes (wsrep_local_index INTEGER); +INSERT INTO wsrep_local_indexes VALUES ((SELECT variable_value FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_local_index')); + +--connection node_2 +INSERT INTO wsrep_local_indexes VALUES ((SELECT variable_value FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_local_index')); + + +--connection node_1 +SELECT COUNT(*) = 2 FROM wsrep_local_indexes; +SELECT COUNT(DISTINCT wsrep_local_index) = 2 FROM wsrep_local_indexes; +SELECT COUNT(*) = 0 FROM wsrep_local_indexes WHERE wsrep_local_index NOT IN (0, 1); + +DROP TABLE wsrep_local_indexes; diff --git a/mysql-test/suite/galera/t/galera_status_local_state.test b/mysql-test/suite/galera/t/galera_status_local_state.test new file mode 100644 index 00000000..09cdb25f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_status_local_state.test @@ -0,0 +1,28 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test wsrep_local_state . We can not reliably produce all possible statuses in MTR, but +# we can at least test for the ones we can. +# + +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; + +SET GLOBAL wsrep_desync = 1; + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE = 'Donor/Desynced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; + +SET GLOBAL wsrep_desync = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; + + + + diff --git a/mysql-test/suite/galera/t/galera_suspend_slave.test b/mysql-test/suite/galera/t/galera_suspend_slave.test new file mode 100644 index 00000000..0f95bcd4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_suspend_slave.test @@ -0,0 +1,70 @@ +## +## This test tests that transactions on the master will fail if the slave +## is made completely unresponsive by suspending the process. Resuming the +## process should allow replication to continue to run. +## + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +--let NODE_2_PIDFILE = `SELECT @@pid_file` +--disconnect node_2 + +--connection node_1 +--echo Suspending node_2 ... +--perl + my $pid_filename = $ENV{'NODE_2_PIDFILE'}; + my $mysqld_pid = `cat $pid_filename`; + chomp($mysqld_pid); + system("kill -SIGSTOP $mysqld_pid"); + exit(0); +EOF + +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +SET SESSION wsrep_sync_wait = 15; + +--error ER_UNKNOWN_COM_ERROR,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK,ER_ERROR_DURING_COMMIT +INSERT INTO t1 VALUES (1); + +--echo Resuming node_2 ... +--perl + my $pid_filename = $ENV{'NODE_2_PIDFILE'}; + my $mysqld_pid = `cat $pid_filename`; + chomp($mysqld_pid); + system("kill -SIGCONT $mysqld_pid"); + exit(0); +EOF + +SET SESSION wsrep_sync_wait = 0; +--source include/wait_until_ready.inc +INSERT INTO t1 VALUES (1); + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a + +SET SESSION wsrep_sync_wait = 0; +--source include/wait_until_ready.inc +SELECT COUNT(*) = 1 FROM t1; + +SET SESSION wsrep_sync_wait = 15; +DROP TABLE t1; + +# Restore original auto_increment_offset values. +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + diff --git a/mysql-test/suite/galera/t/galera_sync_wait_show.test b/mysql-test/suite/galera/t/galera_sync_wait_show.test new file mode 100644 index 00000000..1d240cc4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sync_wait_show.test @@ -0,0 +1,73 @@ +# +# Test that the various SHOW commands obey wsrep_sync_wait - codership/mysql-wsrep#228 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc + +--connection node_2 +# MW-86 SHOW commands have now bitmap value 8 +SET SESSION wsrep_sync_wait = 8; + + +--connection node_1 +CREATE DATABASE db1; + +--connection node_2 +SHOW CREATE DATABASE db1; +DROP DATABASE db1; + + +--connection node_1 +CREATE PROCEDURE p1 () SELECT 1 FROM DUAL; + +--connection node_2 +SHOW CREATE PROCEDURE p1; +DROP PROCEDURE p1; + + + +--connection node_1 +CREATE PROCEDURE p1 () SELECT 1 FROM DUAL; + +--connection node_2 +SHOW PROCEDURE CODE p1; +DROP PROCEDURE p1; + + + +--connection node_1 +CREATE FUNCTION f1 () RETURNS INTEGER RETURN 123; + +--connection node_2 +SHOW CREATE FUNCTION f1; +DROP FUNCTION f1; + + +--connection node_1 +CREATE FUNCTION f1 () RETURNS INTEGER RETURN 123; + +--connection node_2 +SHOW FUNCTION CODE f1; +DROP FUNCTION f1; + + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET NEW.f1 = 'a'; + +--connection node_2 +--replace_column 7 # +SHOW CREATE TRIGGER tr1; +DROP TABLE t1; + + +--connection node_1 +--disable_warnings +CREATE EVENT event1 ON SCHEDULE AT '2038-01-01 23:59:59' DO SELECT 1; +--enable_warnings + +--connection node_2 +SHOW CREATE EVENT event1; +DROP EVENT event1; diff --git a/mysql-test/suite/galera/t/galera_sync_wait_upto-master.opt b/mysql-test/suite/galera/t/galera_sync_wait_upto-master.opt new file mode 100644 index 00000000..0b352360 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sync_wait_upto-master.opt @@ -0,0 +1 @@ +--wsrep-sync-wait=0 --wsrep-causal-reads=OFF \ No newline at end of file diff --git a/mysql-test/suite/galera/t/galera_sync_wait_upto.cnf b/mysql-test/suite/galera/t/galera_sync_wait_upto.cnf new file mode 100644 index 00000000..375d2480 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sync_wait_upto.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=100 + +[mysqld.2] +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=100 diff --git a/mysql-test/suite/galera/t/galera_sync_wait_upto.combinations b/mysql-test/suite/galera/t/galera_sync_wait_upto.combinations new file mode 100644 index 00000000..dd92b9fa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sync_wait_upto.combinations @@ -0,0 +1,6 @@ +[binlogoff] + +[binlogon] +--log-bin=master-bin +--log-bin-index=master-bin +--log-slave-updates diff --git a/mysql-test/suite/galera/t/galera_sync_wait_upto.test b/mysql-test/suite/galera/t/galera_sync_wait_upto.test new file mode 100644 index 00000000..05353ac7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sync_wait_upto.test @@ -0,0 +1,72 @@ +# +# Tests the wsrep_sync_wait_upto variable. +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +# Test with invalid values + +--error ER_WRONG_ARGUMENTS +SELECT WSREP_SYNC_WAIT_UPTO_GTID(NULL); + +--error ER_INCORRECT_GTID_STATE +SELECT WSREP_SYNC_WAIT_UPTO_GTID('a'); + +--error ER_INCORRECT_GTID_STATE +SELECT WSREP_SYNC_WAIT_UPTO_GTID(2); + +--error ER_WRONG_ARGUMENTS +SELECT WSREP_SYNC_WAIT_UPTO_GTID('1-1-1,1-1-2'); + +# Expected starting seqno + +--let $last_seen_gtid = `SELECT WSREP_LAST_SEEN_GTID()` +--let $s1 = `SELECT SUBSTR('$last_seen_gtid', LOCATE('-', '$last_seen_gtid') + LENGTH('-'))` +--let $start_seqno = `SELECT SUBSTR('$s1', LOCATE('-', '$s1') + LENGTH('-'))` + +# If set to low value, expect no waiting + +--disable_query_log +--let $lower_seqno = $start_seqno +--dec $lower_seqno +--eval SELECT WSREP_SYNC_WAIT_UPTO_GTID('100-1-$lower_seqno') AS WSREP_SYNC_WAIT_UPTO; +--enable_query_log + +# If set to current last_committed value no waiting + +--disable_query_log +--let $wsrep_last_committed_gtid = `SELECT WSREP_LAST_SEEN_GTID()` +--eval SELECT WSREP_SYNC_WAIT_UPTO_GTID('$wsrep_last_committed_gtid') AS WSREP_SYNC_WAIT_UPTO; +--enable_query_log + + +# Timeout if GTID is not received on time + +--disable_query_log +--let $high_seqno = $start_seqno +--inc $high_seqno +--error ER_LOCK_WAIT_TIMEOUT +--eval SELECT WSREP_SYNC_WAIT_UPTO_GTID('100-1-$high_seqno', 1) AS WSREP_SYNC_WAIT_UPTO; +--enable_query_log + +# Wait for GTID value + +--connection node_2 +--disable_query_log +--let $wait_seqno = $start_seqno +--inc $wait_seqno +--send_eval SELECT WSREP_SYNC_WAIT_UPTO_GTID('100-1-$wait_seqno') AS WSREP_SYNC_WAIT_UPTO +--enable_query_log + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +--reap + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_toi_alter_auto_increment.test b/mysql-test/suite/galera/t/galera_toi_alter_auto_increment.test new file mode 100644 index 00000000..793e87cb --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_alter_auto_increment.test @@ -0,0 +1,122 @@ + +# +# Test the operation of ALTER TABLE ... AUTO_INCREMENT +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE ten (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; + +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +--connection node_2 +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +ALTER TABLE t1 AUTO_INCREMENT = 1000; +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +--connection node_1 +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +SELECT MIN(f1) >= 1000, COUNT(*) = 20, COUNT(DISTINCT f1) = 20 FROM t1 WHERE f1 >= 1000; + +--connection node_2 +SELECT MIN(f1) >= 1000, COUNT(*) = 20, COUNT(DISTINCT f1) = 20 FROM t1 WHERE f1 >= 1000; + +# +# AUTO_INCREMENT set to a value lower than the current one. +# The ALTER does nothing, the sequence continues from the current maximum. +# + +--connection node_1 +ALTER TABLE t1 AUTO_INCREMENT = 5; +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +--connection node_2 +INSERT INTO t1 (f2) SELECT 1 FROM ten; +SELECT MIN(f1) >= 1000, COUNT(*) = 40, COUNT(DISTINCT f1) = 40 FROM t1 WHERE f1 >= 1000; + +--connection node_1 +SELECT MIN(f1) >= 1000, COUNT(*) = 40, COUNT(DISTINCT f1) = 40 FROM t1 WHERE f1 >= 1000; + +DROP TABLE t1; + +# +# Under wsrep_auto_increment_control = OFF +# + +--connection node_1 +--let $auto_increment_control_orig = `SELECT @@wsrep_auto_increment_control` +--let $auto_increment_increment_node1 = `SELECT @@auto_increment_increment` +--let $auto_increment_offset_node1 = `SELECT @@auto_increment_offset` + +# Restore stock MySQL defaults +SET GLOBAL wsrep_auto_increment_control = OFF; +SET GLOBAL auto_increment_increment = 1; +SET GLOBAL auto_increment_offset = 1; + +#Open a fresh connection to node_1 so that the variables above take effect +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_2 +--let $auto_increment_increment_node2 = `SELECT @@auto_increment_increment` +--let $auto_increment_offset_node2 = `SELECT @@auto_increment_offset` + +SET GLOBAL wsrep_auto_increment_control = OFF; +SET GLOBAL auto_increment_increment = 1; +SET GLOBAL auto_increment_offset = 1; + +#Open a fresh connection to node_2 +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc + +--connection node_1a + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; + +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +ALTER TABLE t1 AUTO_INCREMENT=100; + +--connection node_1a +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +--connection node_2a +INSERT INTO t1 (f2) SELECT 1 FROM ten; + +SELECT MIN(f1) = 100, MAX(f1) = 119, COUNT(f1) = 20, COUNT(DISTINCT f1) = 20 FROM t1; + +--connection node_1a +SELECT MIN(f1) = 100, MAX(f1) = 119, COUNT(f1) = 20, COUNT(DISTINCT f1) = 20 FROM t1; + +DROP TABLE t1; + +# +# Restore all variables as they were +# + +--disable_query_log + +--connection node_1 +--eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig +--eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node1 +--eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node1 + +--connection node_2 +--eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig +--eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node2 +--eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node2 + +--enable_query_log + +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_error.test b/mysql-test/suite/galera/t/galera_toi_ddl_error.test new file mode 100644 index 00000000..6ee2a6e9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ddl_error.test @@ -0,0 +1,34 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +# +# Test the operation of DDLs that fail partway through +# + +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; + +# Insert 100K rows +INSERT INTO t1 (f1) SELECT (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +# Insert one duplicate value +INSERT INTO t1 (f1) SELECT MAX(f1) FROM t1; + +--connection node_2 +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD PRIMARY KEY (f1); +SHOW CREATE TABLE t1; + +--connection node_1 +SHOW CREATE TABLE t1; + +DROP TABLE t1; +DROP TABLE ten; + +CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query."); + +--connection node_2 +CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query."); \ No newline at end of file diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test b/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test new file mode 100644 index 00000000..fadc94d7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test @@ -0,0 +1,69 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +# +# This test creates a new FK constraint while concurrent INSERTS are running +# + +CREATE TABLE ten (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE parent ( + id INT PRIMARY KEY AUTO_INCREMENT, + f2 INTEGER +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT PRIMARY KEY AUTO_INCREMENT, + parent_id INT +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1, 0); + +--connection node_2 +--send INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1a +--send INSERT INTO parent (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +--send INSERT INTO parent (f2) SELECT 2 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--let $galera_connection_name = node_1b +--let $galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1b +--send ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id); + +--connection node_1a +--reap + +--connection node_1b +--reap + +--connection node_2 +--reap + +--connection node_2a +--reap + +--connection node_1 +SET SESSION wsrep_sync_wait=15; +SELECT COUNT(*) FROM parent; +SELECT COUNT(*) FROM child; + +--connection node_2 +SET SESSION wsrep_sync_wait=15; +SELECT COUNT(*) FROM parent; +SELECT COUNT(*) FROM child; + +DROP TABLE child; +DROP TABLE parent; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_fk_update.test b/mysql-test/suite/galera/t/galera_toi_ddl_fk_update.test new file mode 100644 index 00000000..f42fae4e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ddl_fk_update.test @@ -0,0 +1,49 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# This test creates a new FK constraint while an UPDATE is running +# + +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE parent ( + id INT PRIMARY KEY, + KEY (id) +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT PRIMARY KEY AUTO_INCREMENT, + parent_id INT +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1); + +INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_1 +--sleep 1 +--send ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE; + +--connection node_2 +--sleep 1 +--send UPDATE parent SET id = 2 WHERE id = 1; + +--connection node_1 +--reap + +--connection node_2 +--reap + +--connection node_2 +SELECT COUNT(*) = 10000 FROM child WHERE parent_id = 2; + +--connection node_1 +SELECT COUNT(*) = 10000 FROM child WHERE parent_id = 2; + +DROP TABLE child; +DROP TABLE parent; + +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_locking.test b/mysql-test/suite/galera/t/galera_toi_ddl_locking.test new file mode 100644 index 00000000..22a45316 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ddl_locking.test @@ -0,0 +1,98 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# +# Test that DDL indeed causes all nodes to block so even unrelated updates +# are not allowed to proceed. We block the DDL using DBUG_SYNC +# + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +SET SESSION wsrep_sync_wait = 0; + +--let $galera_connection_name = node_1b +--let $galera_server_number = 1 +--source include/galera_connect.inc + +# node_1c tests write to unrelated table trough a transaction +--let $galera_connection_name = node_1c +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_1 +SET DEBUG_SYNC= 'RESET'; +SET DEBUG_SYNC = 'alter_table_before_open_tables SIGNAL before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1a +SET DEBUG_SYNC= 'now WAIT_FOR before_open_tables'; + +# if we would retry the insert, it would fail for wrong column count +# on second try +SET wsrep_retry_autocommit=0; + +# Allowed +SELECT COUNT(*) = 0 FROM t1; + +# Allowed +SELECT COUNT(*) = 0 FROM t2; + +# Not allowed, this will hang because of ALTER +--send INSERT INTO t1 VALUES (1); + +--connection node_1c +SET SESSION wsrep_sync_wait = 0; + +SET AUTOCOMMIT=OFF; +START TRANSACTION; + +# Allowed +SELECT COUNT(*) = 0 FROM t1; + +# Allowed +SELECT COUNT(*) = 0 FROM t2; + +# Allowed (until commit) +INSERT INTO t2 VALUES (1); + +# Hangs +--send COMMIT; + +--connection node_1b +SET SESSION wsrep_sync_wait = 0; + +# The Commit issued above is still not done +--sleep 1 +SELECT COUNT(*) = 0 FROM t2; + +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'Commit'; + +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1a +--error ER_LOCK_DEADLOCK +--reap + +--connection node_1c +# this will succeeed, becaus the query will be replayed +--reap + +--connection node_1 +--reap + +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SET debug_sync='RESET'; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 1 FROM t2; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test b/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test new file mode 100644 index 00000000..dbd2510c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test @@ -0,0 +1,41 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# In this test, we simultaneously send two non-conflicting ALTER TABLE statements +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 INTEGER); + +--connection node_2 +--send ALTER TABLE t1 ADD COLUMN f3 INTEGER; INSERT INTO t1 (f1, f2) VALUES (DEFAULT, 123); + +--connection node_1 +--send CREATE UNIQUE INDEX i1 ON t1(f2); + +--connection node_2 +--reap +INSERT INTO t1 (f1, f2) VALUES (DEFAULT, 234); + +--let $wait_condition = SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 2 FROM t1; + +--connection node_1 +--reap + +--let $wait_condition = SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) = 2 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_sequential.test b/mysql-test/suite/galera/t/galera_toi_ddl_sequential.test new file mode 100644 index 00000000..89a1af84 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ddl_sequential.test @@ -0,0 +1,32 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# In this test, we send two ALTER TABLE statements that would only work if executed in the right order +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc + +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +INSERT INTO t1 VALUES (2, 3); + +--connection node_1 +ALTER TABLE t1 DROP COLUMN f2; +INSERT INTO t1 VALUES (4); + +--connection node_2 +SHOW CREATE TABLE t1; +SELECT COUNT(*) = 3 FROM t1; +SELECT * FROM t1 ORDER BY f1; + +--connection node_1 +SHOW CREATE TABLE t1; +SELECT COUNT(*) = 3 FROM t1; +SELECT * FROM t1 ORDER BY f1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_toi_drop_database.test b/mysql-test/suite/galera/t/galera_toi_drop_database.test new file mode 100644 index 00000000..e790a0ba --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_drop_database.test @@ -0,0 +1,56 @@ +# +# Test the operation of DDLs that affect multiple database objects +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_1 +CREATE DATABASE database1; +USE database1; + +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; + +# Make sure autocommit retrying does not kick in as this will mask the error we expect to get +SET SESSION wsrep_retry_autocommit = 0; +# Attemp to insert 1M rows +--send INSERT INTO t1 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6; + +--connection node_1a +USE database1; +SET SESSION wsrep_retry_autocommit = 0; +--send INSERT INTO t2 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6; + +--connection node_2 +--sleep 1 +--send DROP DATABASE database1; + +--connection node_1 +--sleep 1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_1a +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +--reap + +--connection node_1 +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'database1'; +--error ER_BAD_DB_ERROR +USE database1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'database1'; +--error ER_BAD_DB_ERROR +USE database1; diff --git a/mysql-test/suite/galera/t/galera_toi_ftwrl.test b/mysql-test/suite/galera/t/galera_toi_ftwrl.test new file mode 100644 index 00000000..4d0edefd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_ftwrl.test @@ -0,0 +1,22 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# At this time, issing a FLUSH TABLES WITH READ LOCK on one node does not prevent DDLs from other nodes +# from proceeding. The locked node will apply the DDL after it has been unlocked +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +FLUSH TABLES WITH READ LOCK; + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_2 +UNLOCK TABLES; +SHOW CREATE TABLE t1; + +DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera_toi_lock_exclusive.test b/mysql-test/suite/galera/t/galera_toi_lock_exclusive.test new file mode 100644 index 00000000..3c66286a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_lock_exclusive.test @@ -0,0 +1,38 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Ensure that ALTER LOCK=EXCLUSIVE works under TOI. It is difficult to check that concurrent operations +# are truly not possible, but at least we expect no hangs or deadlocks +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +# Start a transaction that is concurrent to the DDL. This is not strictly necessary for this test +# but does put more locks into play. +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES (2); + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +ALTER TABLE t1 ADD COLUMN f2 INTEGER, LOCK=EXCLUSIVE; + +# In Galera, a concurrent transaction aborts in the face of ALTER +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +--connection node_1 +INSERT INTO t1 VALUES (2, 2); +SELECT COUNT(*) = 2 FROM t1; + +--connection node_2 +INSERT INTO t1 VALUES (3, 3); +SELECT COUNT(*) = 3 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_toi_lock_shared.test b/mysql-test/suite/galera/t/galera_toi_lock_shared.test new file mode 100644 index 00000000..566bc721 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_lock_shared.test @@ -0,0 +1,34 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Ensure that ALTER LOCK=SHARED works under TOI. It is difficult to check that concurrent operations +# will be possible, but at least we expect no hangs or deadlocks +# + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1 +--source include/wait_condition.inc + +ALTER TABLE t1 ADD COLUMN f2 INTEGER, LOCK=SHARED; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +INSERT INTO t1 VALUES (2, 2); +SELECT COUNT(*) AS EXPECT_2 FROM t1; +SELECT * FROM t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 2 FROM t1 +--source include/wait_condition.inc +INSERT INTO t1 VALUES (3, 3); +SELECT COUNT(*) AS EXPECT_3 FROM t1; +SELECT * FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_toi_truncate.test b/mysql-test/suite/galera/t/galera_toi_truncate.test new file mode 100644 index 00000000..5b23a8c3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_toi_truncate.test @@ -0,0 +1,46 @@ +# +# Test the operation of TRUNCATE with concurrent DML. +# The DML should be BF-aborted if the DDL arrives from another node +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc + +# +# INSERT and TRUNCATE on different nodes +# + +--connection node_1 +CREATE TABLE ten (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 10 FROM ten; +--source include/wait_condition.inc + +# Prevent autocommit retring from masking the deadlock error we expect to get +SET SESSION wsrep_retry_autocommit = 0; +--send INSERT INTO t1 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6, ten AS a7, ten AS a8 + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Sending data%' AND INFO LIKE 'INSERT INTO t1 (f1)%'; +--source include/wait_condition.inc + +--connection node_1 +TRUNCATE TABLE t1; + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap + +SELECT COUNT(*) AS EXPECT_0 FROM t1; + +--connection node_1 +SELECT COUNT(*) AS EXPECT_0 FROM t1; + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_transaction_read_only.test b/mysql-test/suite/galera/t/galera_transaction_read_only.test new file mode 100644 index 00000000..386d73fd --- /dev/null +++ b/mysql-test/suite/galera/t/galera_transaction_read_only.test @@ -0,0 +1,58 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Ensure that transactions that do not write anything do not cause the wsrep_last_committed counter to advance +# + +# Empty transaction + +--connection node_1 +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_1 + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +COMMIT; + +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +# START TRANSACTION READ ONLY + +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_1 +START TRANSACTION READ ONLY; +SELECT COUNT(*) = 0 FROM t1; +COMMIT; + +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +# Ordinary transaction with only SELECTs + +--connection node_1 +START TRANSACTION; +SELECT COUNT(*) = 0 FROM t1; +COMMIT; + +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera_transaction_replay.test b/mysql-test/suite/galera/t/galera_transaction_replay.test new file mode 100644 index 00000000..655714f2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_transaction_replay.test @@ -0,0 +1,255 @@ +# +# This test tests the operation of transaction replay. If a potentially +# conflicting remote transaction arrives at just the right time during +# the commit of a local transaction, the local transaction will be aborted +# and replayed. +# +# Because the write set with higher sequence number cannot BF abort +# the victim with lower sequence number, the conflicting remote transaction +# must be executed first and must be allowed to proceed up to the apply +# monitor before sending the COMMIT for the transaction to be replayed. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +###################################################################### +# +# Scenario #1, the victim will have higher seqno and will be replayed +# +###################################################################### + +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (2, 'a'); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +SELECT * FROM t1 WHERE f1 = 2 FOR UPDATE; + +# Block the applier on node #1 and issue a conflicting update on node #2 +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait=0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +UPDATE t1 SET f2 = 'c' WHERE f1 = 2; + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Block the commit, send the COMMIT and wait until it gets blocked + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a + +--let $galera_sync_point = apply_monitor_slave_enter_sync commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Let the conflicting UPDATE proceed and wait until it hits abort_trx_end. +# The victim transaction still sits in commit_monitor_master_sync_point. + +--let $galera_sync_point = abort_trx_end +--source include/galera_set_sync_point.inc +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = abort_trx_end commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc + +# Let the transactions proceed +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = abort_trx_end +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc + +# Commit succeeds +--connection node_1 +--reap + +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'b'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; + +# wsrep_local_replays has increased by 1 +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; +--enable_query_log + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'b'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; + +DROP TABLE t1; + +######################################################################### +# +# Scenario #2, the victim will have lower seqno and will not be replayed +# +######################################################################### + +--connection node_1 + +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)); +INSERT INTO t1 VALUES (1, 'a'); +INSERT INTO t1 VALUES (2, 'a'); + +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; + +UPDATE t1 SET f2 = 'b' WHERE f1 = 1; +SELECT * FROM t1 WHERE f1 = 2 FOR UPDATE; + +# Block the commit, send the COMMIT and wait until it gets blocked + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + + +# Set sync point at the end of BF abort, issue a conflicting update +# and wait for the conflicting update to hit the sync point. +--let $galera_sync_point = abort_trx_end +--source include/galera_set_sync_point.inc + +--connection node_2 +UPDATE t1 SET f2 = 'c' WHERE f1 = 2; + +--connection node_1a +--let $galera_sync_point = abort_trx_end commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Let the transactions proceed +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = abort_trx_end +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc + +# Commit succeeds +--connection node_1 +--reap + +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'b'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; + +# wsrep_local_replays should have not increased +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 0 AS wsrep_local_replays; +--enable_query_log + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'b'; +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; + +DROP TABLE t1; + + +######################################## +# +# test replaying of prepared statements +# +######################################## + +--connection node_1 + +--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` + +CREATE TABLE t1 (i int primary key, j int) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 0), (3, 0); +SELECT * FROM t1; +SET AUTOCOMMIT=ON; +PREPARE stmt1 FROM "UPDATE t1 SET j = 1 where i > 0"; + + +# Block the applier on node #1 and issue a conflicting update on node #2 +--connection node_1a +SET SESSION wsrep_sync_wait=0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +INSERT INTO t1 VALUES(2,2); + +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Block the commit, send the EXECUTE stmt1 and wait until it gets blocked + +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_1 +SET SESSION wsrep_sync_wait=0; +--send EXECUTE stmt1 + +--connection node_1a + +--let $galera_sync_point = apply_monitor_slave_enter_sync commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# Let the conflicting INSERT proceed and wait until it hits abort_trx_end. +# The victim transaction still sits in commit_monitor_master_sync_point. + +--let $galera_sync_point = abort_trx_end +--source include/galera_set_sync_point.inc +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = abort_trx_end commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc + +# Let the transactions proceed +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = abort_trx_end +--source include/galera_signal_sync_point.inc +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc + +# Commit succeeds +--connection node_1 +--reap +SET SESSION wsrep_sync_wait=7; +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; + +--connection node_1 +# wsrep_local_replays has increased by 1 +--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` +--disable_query_log +--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays; +--enable_query_log + +DEALLOCATE PREPARE stmt1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_trigger.test b/mysql-test/suite/galera/t/galera_trigger.test new file mode 100644 index 00000000..3c66b941 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_trigger.test @@ -0,0 +1,72 @@ +--source include/galera_cluster.inc +# +# MDEV-21578 CREATE OR REPLACE TRIGGER in Galera cluster not replicating +# +CREATE TABLE IF NOT EXISTS t1 (id int(10) not null primary key) engine=innodb; +--delimiter | +CREATE OR REPLACE TRIGGER tr1 +BEFORE INSERT ON t1 FOR EACH ROW +BEGIN +SET NEW.id = 100; +END| +--delimiter ; + +INSERT INTO t1 VALUES (1); +SELECT * from t1; + +--delimiter | +CREATE OR REPLACE TRIGGER tr1 +BEFORE INSERT ON t1 FOR EACH ROW +BEGIN +SET NEW.id = 200; +END| +--delimiter ; + +--connection node_2 +SET SESSION wsrep_sync_wait=15; +SELECT * FROM t1; +INSERT INTO t1 values (2); +SELECT * FROM t1; + +--connection node_1 +SELECT * FROM t1; + +DROP TRIGGER tr1; +DROP TABLE t1; +# +# MDEV-23638 : DROP TRIGGER in Galera Cluster not replicating +# +--connection node_1 +CREATE TABLE t1(id int not null auto_increment, value int not null, primary key (id)) engine=innodb; + +CREATE TABLE t2(id int not null auto_increment, tbl varchar(64) not null, action varchar(64) not null, primary key (id)); + +--delimiter | +create trigger log_insert after insert on t1 +for each row begin + insert into t2(tbl, action) values ('t1', 'INSERT'); +end| +--delimiter ; + +insert into t1(value) values (1); +insert into t1(value) values (2); + +--connection node_2 +set session wsrep_sync_wait=15; +insert into t1(value) values (3); +insert into t1(value) values (4); +select tbl, action from t2; + +--connection node_1 +drop trigger if exists log_insert; +insert into t1(value) values (5); +select tbl, action from t2; + +--connection node_2 +insert into t1(value) values (6); +select tbl, action from t2; + +--connection node_1 +select tbl, action from t2; + +drop table t1, t2; diff --git a/mysql-test/suite/galera/t/galera_truncate.test b/mysql-test/suite/galera/t/galera_truncate.test new file mode 100644 index 00000000..0000b430 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_truncate.test @@ -0,0 +1,79 @@ +# +# Test TRUNCATE +# + +--source include/galera_cluster.inc +--source include/have_perfschema.inc +# +# Simple case +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc + +TRUNCATE TABLE t1; +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +SELECT COUNT(*) = 0 FROM t1; + +# +# Table with no PK +# + +--connection node_2 +CREATE TABLE t2 (f1 VARCHAR(255)) Engine=InnoDB; +INSERT INTO t2 VALUES ('abc'); + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t2'; +--source include/wait_condition.inc + +TRUNCATE TABLE t2; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t2; + +# +# Table with AUTO_INCREMENT. The AUTO_INCREMENT counter must be reset on all nodes +# + +--connection node_1 +CREATE TABLE t3 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB; +INSERT INTO t3 VALUES (DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT); + +CREATE TABLE t4 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB AUTO_INCREMENT=1234; +INSERT INTO t4 VALUES (DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT); + +TRUNCATE TABLE t3; +TRUNCATE TABLE t4; + +--connection node_2 +SELECT AUTO_INCREMENT = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN ('t3', 't4'); + + +# +# MDEV-24865 : Server crashes when truncate mysql user table +# +--connection node_1 + +--error ER_NO_SUCH_TABLE +TRUNCATE TABLE mysql.user; +--error ER_WRONG_PERFSCHEMA_USAGE +TRUNCATE TABLE performance_schema.threads; +--error ER_DBACCESS_DENIED_ERROR +TRUNCATE TABLE information_schema.tables; +TRUNCATE TABLE mysql.innodb_index_stats; +--error ER_NO_SUCH_TABLE +TRUNCATE TABLE foo.bar; +TRUNCATE TABLE t1; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; diff --git a/mysql-test/suite/galera/t/galera_truncate_temporary.test b/mysql-test/suite/galera/t/galera_truncate_temporary.test new file mode 100644 index 00000000..ea20911b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_truncate_temporary.test @@ -0,0 +1,85 @@ +# +# Test TRUNCATE on TEMPORARY tables. It should not be replicated +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TEMPORARY TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +INSERT INTO t1 VALUES (1); + +TRUNCATE TABLE t1; +SELECT COUNT(*) = 0 FROM t1; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1; + +# +# Test the case where a TEMPORARY table is masking an existing one +# + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (2); + +SELECT f1 = 2 FROM t1; +SELECT COUNT(*) = 1 FROM t1; + +TRUNCATE TABLE t1; + +SELECT COUNT(*) = 0 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT f1 = 1 FROM t1; + +--connection node_1 + +DROP TABLE t1; +SELECT COUNT(*) = 1 FROM t1; +SELECT f1 = 1 FROM t1; + +TRUNCATE TABLE t1; +SELECT COUNT(*) = 0 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +DROP TABLE t1; + +# +# Test the case where one node has a TEMPORARY table but the TRUNCATE arrives from another node +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +CREATE TEMPORARY TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (2); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc + +TRUNCATE TABLE t1; + +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +SELECT f1 = 2 FROM t1; +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +SELECT COUNT(*) = 0 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_udf.cnf b/mysql-test/suite/galera/t/galera_udf.cnf new file mode 100644 index 00000000..69d5acd6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_udf.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +$UDF_EXAMPLE_LIB_OPT +query_cache_type=1 + +[mysqld.2] +query_cache_type=1 + + + + + + + diff --git a/mysql-test/suite/galera/t/galera_unicode_identifiers.test b/mysql-test/suite/galera/t/galera_unicode_identifiers.test new file mode 100644 index 00000000..c0c95768 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_unicode_identifiers.test @@ -0,0 +1,78 @@ +# +# Test non-ascii table, column and index names +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_sync_wait_orig = (SELECT @@wsrep_sync_wait) +SET GLOBAL wsrep_sync_wait = 15; + +--connection node_2 +SET GLOBAL wsrep_sync_wait = 15; + +--connection node_1 + +--let $innodb_num_tables_orig = `SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES` + +# Spaces in identifiers + +CREATE DATABASE `database with space`; +USE `database with space`; +CREATE TABLE `table with space` ( + `column with space` INTEGER AUTO_INCREMENT PRIMARY KEY, + `second column with space` INTEGER, + UNIQUE `index name with space` (`second column with space`) +) engine=innodb; +INSERT INTO `table with space` VALUES (1, 1); + +# Unicode identifiers + +CREATE DATABASE `база`; +USE `база`; +CREATE TABLE `таблица` ( + `първа_колона` INTEGER PRIMARY KEY, + `втора_колона` INTEGER, + UNIQUE `индекс` (`втора_колона`) +) engine=innodb; + +INSERT INTO `таблица` VALUES (1, 1); + +# Without a PK + +CREATE DATABASE `втора база`; +USE `втора база`; +CREATE TABLE `втора таблица` ( + `първа колона` INTEGER, + `втора колона` INTEGER, + KEY `първи индекс` (`първа колона`) +) engine=innodb; + +INSERT INTO `втора таблица` VALUES (1, 1); + +--connection node_2 +# Wait until 3 above tables with databases are created also to this node +--let $wait_condition = SELECT COUNT(*) = $innodb_num_tables_orig + 3 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES; +--source include/wait_condition.inc + +USE `database with space`; +SELECT `second column with space` FROM `table with space`; + +USE `база`; +SELECT * FROM `таблица`; + +USE `втора база`; +SELECT `втора колона` FROM `втора таблица`; + +--eval SET GLOBAL wsrep_sync_wait = $wsrep_sync_wait_orig + +--connection node_1 +DROP TABLE `database with space`.`table with space`; +DROP TABLE `база`.`таблица`; +DROP TABLE `втора база`.`втора таблица`; + +DROP DATABASE `database with space`; +DROP DATABASE `база`; +DROP DATABASE `втора база`; +--eval SET GLOBAL wsrep_sync_wait = $wsrep_sync_wait_orig + diff --git a/mysql-test/suite/galera/t/galera_unicode_pk.test b/mysql-test/suite/galera/t/galera_unicode_pk.test new file mode 100644 index 00000000..0d571f5c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_unicode_pk.test @@ -0,0 +1,64 @@ +# +# Test non-ascii data in table where the PK is unicode +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 ( + f1 VARCHAR(255) PRIMARY KEY +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO t1 VALUES ('текст'); + +--connection node_2 +SELECT f1 = 'текст' FROM t1; + +# +# Provoke a conflict +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'текст2'; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'текст3'; + +--connection node_1 +COMMIT; + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +SELECT f1 = 'текст2' FROM t1; +SELECT f1 = 'текст2' FROM t1 WHERE f1 = 'текст2'; + +# +# Provoke a duplicate key error +# + +--connection node_2 +START TRANSACTION; +INSERT INTO t1 VALUES ('текст4'); + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 VALUES ('текст4'); + +--connection node_2 +COMMIT; + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; + +# Work around for mysql-wsrep#29 'Spurious deadlock error on a DROP TABLE' +--error 0,ER_LOCK_DEADLOCK +COMMIT; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_update_limit.test b/mysql-test/suite/galera/t/galera_update_limit.test new file mode 100644 index 00000000..baacf2a6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_update_limit.test @@ -0,0 +1,55 @@ +# +# UPDATE LIMIT should not cause any issues with row-based Galera replication +# regardless of the order in which the rows were updated +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# With a PK +# + +--connection node_1 +CREATE TABLE ten (f1 INTEGER) Engine=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 SELECT f1 FROM ten ORDER BY RAND(); + +--connection node_2 +UPDATE IGNORE t1 SET f1 = FLOOR(1 + (RAND() * 10)) ORDER BY RAND() LIMIT 5; + +# Check that the sum of all elements and the max element are identical across nodes +# as this will indicate that the same UPDATE was applied to both nodes + +--let $sum_rows = `SELECT SUM(f1) FROM t1` +--let $max_row = `SELECT MAX(f1) FROM t1` + +--connection node_1 +--disable_query_log +--eval SELECT (SELECT SUM(f1) FROM t1) = $sum_rows AS sum_matches; +--eval SELECT f1 = $max_row AS max_matches FROM t1 WHERE f1 = $max_row; +--enable_query_log + +DROP TABLE t1; + +# +# Without a PK +# + +CREATE TABLE t2 (f1 INTEGER) Engine=InnoDB; +INSERT INTO t2 SELECT f1 FROM ten ORDER BY RAND(); + +--connection node_2 +UPDATE IGNORE t2 SET f1 = FLOOR(1 + (RAND() * 10)) ORDER BY RAND() LIMIT 5; + +--let $sum_rows = `SELECT SUM(f1) FROM t2` + +--connection node_1 +--disable_query_log +--eval SELECT (SELECT SUM(f1) FROM t2) = $sum_rows AS sum_matches; +--enable_query_log + +DROP TABLE t2; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_v1_row_events.cnf b/mysql-test/suite/galera/t/galera_v1_row_events.cnf new file mode 100644 index 00000000..b95e321a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_v1_row_events.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin-use-v1-row-events=1 + +[mysqld.2] + + + + + + + diff --git a/mysql-test/suite/galera/t/galera_v1_row_events.test b/mysql-test/suite/galera/t/galera_v1_row_events.test new file mode 100644 index 00000000..0c0a0445 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_v1_row_events.test @@ -0,0 +1,21 @@ +# +# Test that Galera continues to run even with --log-bin-use-v1-row-events=1 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +UPDATE t1 SET f1 = 2 WHERE f1 = 1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_OSU_method.test b/mysql-test/suite/galera/t/galera_var_OSU_method.test new file mode 100644 index 00000000..fcf964c4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_OSU_method.test @@ -0,0 +1,45 @@ +# +# Test that the wsrep_var_OSU_method variable can be changed in the middle of an ALTER without adverse effects. +# In-depth testing of various OSU methods is implemented in separate tests. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET SESSION wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_2 +# The ALTER above is not visible on node_2 +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_1 +SET SESSION wsrep_OSU_method = "TOI"; + +--connection node_1 +SET DEBUG_SYNC= 'RESET'; + +--connection node_1a +SET DEBUG_SYNC= 'RESET'; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_OSU_method2.test b/mysql-test/suite/galera/t/galera_var_OSU_method2.test new file mode 100644 index 00000000..099e2cc6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_OSU_method2.test @@ -0,0 +1,47 @@ +# +# Test that the wsrep_var_OSU_method variable can be changed in the middle of an ALTER without adverse effects. +# In-depth testing of various OSU methods is implemented in separate tests. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET SESSION wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a + +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +INSERT INTO t1 VALUES (1,2); + +--connection node_2 +# The ALTER above is visible on node_2 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +INSERT INTO t1 VALUES (3,4); + +--connection node_1 +SET GLOBAL wsrep_OSU_method = "TOI"; +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; + +--connection node_1a +SET DEBUG_SYNC= 'RESET'; + diff --git a/mysql-test/suite/galera/t/galera_var_auto_inc_control_off.test b/mysql-test/suite/galera/t/galera_var_auto_inc_control_off.test new file mode 100644 index 00000000..c0bbe5af --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_auto_inc_control_off.test @@ -0,0 +1,105 @@ +# +# Test wsrep_auto_increment_control = OFF +# We issue two concurrent INSERTs and one will fail with a deadlock error +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $auto_increment_control_orig = `SELECT @@wsrep_auto_increment_control` + +# +# Preserve existing variable values +# + +--connection node_1 +--let $auto_increment_increment_node1 = `SELECT @@auto_increment_increment` +--let $auto_increment_offset_node1 = `SELECT @@auto_increment_offset` + +# Restore stock MySQL defaults +SET GLOBAL wsrep_auto_increment_control = OFF; +SET GLOBAL auto_increment_increment = 1; +SET GLOBAL auto_increment_offset = 1; + +#Open a fresh connection to node_1 so that the variables above take effect +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_2 +--let $auto_increment_increment_node2 = `SELECT @@auto_increment_increment` +--let $auto_increment_offset_node2 = `SELECT @@auto_increment_offset` + +SET GLOBAL wsrep_auto_increment_control = OFF; +SET GLOBAL auto_increment_increment = 1; +SET GLOBAL auto_increment_offset = 1; + +#Open a fresh connection to node_2 +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc + +--connection node_1a +SELECT @@auto_increment_increment = 1; +SELECT @@auto_increment_offset = 1; + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, node VARCHAR(10)) ENGINE=InnoDB; + +# +# We expect that SHOW CREATE TABLE on both nodes will return identical values +# + +SHOW CREATE TABLE t1; + +--connection node_2a + +SHOW CREATE TABLE t1; + +--connection node_1a +SELECT @@auto_increment_increment = 1; +SELECT @@auto_increment_offset = 1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 (node) VALUES ('node1'); +SELECT f1 FROM t1; + +--connection node_2a +SELECT @@auto_increment_increment = 1; +SELECT @@auto_increment_offset = 1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 (node) VALUES ('node2'); +SELECT f1 FROM t1; + +--connection node_1a +COMMIT; + +--connection node_2a +--error ER_LOCK_DEADLOCK +COMMIT; + +--connection node_1a +SELECT * FROM t1; + +--connection node_2a +SELECT * FROM t1; + +# +# Restore all variables as they were +# + +--disable_query_log + +--connection node_1 +--eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig +--eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node1 +--eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node1 + +--connection node_2 +--eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig +--eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node2 +--eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node2 + +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.cnf b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.cnf new file mode 100644 index 00000000..523bae68 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.cnf @@ -0,0 +1,13 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-auto-increment-control=ON + +[mysqld.2] +wsrep-auto-increment-control=ON + + + + + + diff --git a/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test new file mode 100644 index 00000000..ee31be94 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test @@ -0,0 +1,65 @@ +# +# Test the operation of wsrep_auto_increment_control = ON +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, node VARCHAR(10)) ENGINE=InnoDB; + +--let $auto_increment_offset_node_1 = `SELECT @@global.auto_increment_offset` +# auto_increment_increment is equal to the number of nodes +SELECT @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'); + +--connection node_2 +--disable_query_log +--eval SELECT @@global.auto_increment_offset != $auto_increment_offset_node_1 AS auto_increment_offset_differ; +--enable_query_log + +# Expect no conflicts +--connection node_1 +--send INSERT INTO t1 VALUES (DEFAULT, 'node1'); + +--connection node_2 +--send INSERT INTO t1 VALUES (DEFAULT, 'node2'); + +--connection node_1 +--reap + +--connection node_2 +--reap + +--let $auto_increment_offset_node_2 = `SELECT @@global.auto_increment_offset` +# auto_increment_increment is equal to the number of nodes +SELECT @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'); + +--connection node_1 +--disable_query_log +--eval SELECT @@global.auto_increment_offset != $auto_increment_offset_node_2 AS auto_increment_offset_differ; +--enable_query_log + + +# Expect no conflicts +--connection node_2 +--send INSERT INTO t1 VALUES (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'); + +--connection node_1 +--send INSERT INTO t1 VALUES (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'); + +--connection node_2 +--reap + +--connection node_1 +--reap + +--connection node_2 +SELECT COUNT(*) = 22 FROM t1; +SELECT COUNT(DISTINCT f1) = 22 FROM t1; + +--connection node_1 +SELECT COUNT(*) = 22 FROM t1; +SELECT COUNT(DISTINCT f1) = 22 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_certify_nonPK_off.test b/mysql-test/suite/galera/t/galera_var_certify_nonPK_off.test new file mode 100644 index 00000000..d2d16176 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_certify_nonPK_off.test @@ -0,0 +1,43 @@ +# +# Test wsrep_certify_nonPK = OFF +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_certify_nonPK_orig = `SELECT @@wsrep_certify_nonPK` +SET GLOBAL wsrep_certify_nonPK = OFF; + +--connection node_2 +SET GLOBAL wsrep_certify_nonPK = OFF; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB /* Table has no primary key */; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +# All DML without a PK is rejected with an error +--error ER_LOCK_DEADLOCK,ER_ERROR_DURING_COMMIT +INSERT INTO t1 VALUES (1), (2); + +# DML with a PK is allowed to proceed +INSERT INTO t2 VALUES (1), (2); +UPDATE t2 SET f1 = 3 WHERE f1 = 1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) = 2 FROM t2; +SELECT COUNT(*) = 1 FROM t2 WHERE f1 = 3; + +--connection node_1 +--eval SET GLOBAL wsrep_certify_nonPK = $wsrep_certify_nonPK_orig + +--connection node_2 +--eval SET GLOBAL wsrep_certify_nonPK = $wsrep_certify_nonPK_orig + +DROP TABLE t1; +DROP TABLE t2; + +--connection node_1 +call mtr.add_suppression("SQL statement was ineffective"); + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_var_cluster_address.test b/mysql-test/suite/galera/t/galera_var_cluster_address.test new file mode 100644 index 00000000..85ae73ff --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_cluster_address.test @@ -0,0 +1,76 @@ +# +# Check the handling of @@wsrep_cluster_address +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# +# Set to invalid value +# + +--connection node_2 +--let $wsrep_cluster_address_node2 = `SELECT @@wsrep_cluster_address` +SET GLOBAL wsrep_cluster_address = 'foo://'; + +# With wsrep_sync_wait, this returns an error +--error ER_LOCK_WAIT_TIMEOUT +SHOW STATUS; + +SET SESSION wsrep_sync_wait=0; + +SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS; + +# Must return 'OFF' +SHOW STATUS LIKE 'wsrep_ready'; + +# Must return 'Disconnected' +SHOW STATUS LIKE 'wsrep_cluster_status'; + +# Must return 0 = 'Initialized' +SHOW STATUS LIKE 'wsrep_local_state'; +SHOW STATUS LIKE 'wsrep_local_state_comment'; + +--connection node_1 +--sleep 1 +# Node #1 thinks that it is now part of a single-node primary cluster +SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; + +# +# Reset everything as it was +# + +--connection node_2 +--disable_query_log +--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_node2'; +--source include/galera_wait_ready.inc +--enable_query_log + +--connection node_1 +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_2 +CALL mtr.add_suppression("Backend not supported: foo"); +CALL mtr.add_suppression("Failed to initialize backend using 'foo"); +CALL mtr.add_suppression("Failed to open channel 'my_wsrep_cluster' at 'foo"); +CALL mtr.add_suppression("gcs connect failed: Socket type not supported"); +CALL mtr.add_suppression("wsrep::connect\\(\\) failed: 7"); +CALL mtr.add_suppression("gcs_caused\\(\\) returned -[0-9]+ \\(Software caused connection abort\\)"); +CALL mtr.add_suppression("failed to open gcomm backend connection: 110: failed to reach primary view: 110"); +CALL mtr.add_suppression("Failed to open backend connection: -110 \\(Connection timed out\\)"); +CALL mtr.add_suppression("gcs connect failed: Connection timed out"); +CALL mtr.add_suppression("WSREP: wsrep::connect\\(foo://\\) failed: 7"); +CALL mtr.add_suppression("WSREP: wsrep::connect\\(gcomm://192.0.2.1\\) failed: 7"); + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test b/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test new file mode 100644 index 00000000..668ace29 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test @@ -0,0 +1,9 @@ +--source include/galera_cluster.inc + +--connection node_1 +--replace_regex /18446744073709551/ERROR/ /[0-9]+/#/ +show status like 'wsrep_cluster_conf_id'; + +--connection node_2 +--replace_regex /18446744073709551/ERROR/ /[0-9]+/#/ +show status like 'wsrep_cluster_conf_id'; diff --git a/mysql-test/suite/galera/t/galera_var_desync_on.test b/mysql-test/suite/galera/t/galera_var_desync_on.test new file mode 100644 index 00000000..fbf660d3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_desync_on.test @@ -0,0 +1,61 @@ +# +# Desync will be done once the global read lock is acquired and resync will be done when +# it is released. +# Node should temporarily not participate in flow control +# so even if fc_limit has been reached, the master should be able to continue to +# commit transactions. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'gcs.fc_limit=1'; + +# Block the slave applier thread +FLUSH TABLES WITH READ LOCK; + +--connection node_1 + +# Without wsrep_desync = TRUE it would not be possible to perform 10 inserts on the master with gcs.fc_limit=1 +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (5); +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (9); +INSERT INTO t1 VALUES (10); +--sleep 1 + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +# No updates have arrived after the FLUSH TABLES +SELECT COUNT(*) = 1 FROM t1; + +--disable_query_log +--eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; +--enable_query_log +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = 1; +# The slave is now fully caught up +SELECT COUNT(*) = 10 FROM t1; + +--connection node_1 +INSERT INTO t1 VALUES (11); + +--connection node_2 +# Replication continues normally +SELECT COUNT(*) = 11 FROM t1; + +CALL mtr.add_suppression("Protocol violation"); +DROP TABLE t1; + +--connection node_1 +CALL mtr.add_suppression("Protocol violation"); diff --git a/mysql-test/suite/galera/t/galera_var_dirty_reads.test b/mysql-test/suite/galera/t/galera_var_dirty_reads.test new file mode 100644 index 00000000..85f72e63 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_dirty_reads.test @@ -0,0 +1,76 @@ +# +# Check the handling of @@wsrep_dirty_reads +# + +--source include/galera_cluster.inc +--source include/have_perfschema.inc + +call mtr.add_suppression("WSREP has not yet prepared node for application use"); + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +--let $wsrep_cluster_address_saved = `SELECT @@global.wsrep_cluster_address` + +CREATE TABLE t1(i INT) ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +SELECT * FROM t1; + +SET @@global.wsrep_cluster_address = ''; +SET @@session.wsrep_dirty_reads=OFF; + +# Set wsrep_sync_wait to avoid ER_LOCK_WAIT_TIMEOUT. +SET SESSION wsrep_sync_wait=0; + +# Must return 'OFF' +SHOW STATUS LIKE 'wsrep_ready'; + +# Must return 'Disconnected' +SHOW STATUS LIKE 'wsrep_cluster_status'; + +--error ER_UNKNOWN_COM_ERROR,1047 +SELECT * FROM t1; + +--error ER_UNKNOWN_COM_ERROR,1047 +SELECT 1 FROM t1; + +SET @@session.wsrep_dirty_reads=ON; + +SELECT * FROM t1; +SELECT 1 FROM t1; + +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; + +SET @@session.wsrep_dirty_reads=OFF; + +--error ER_UNKNOWN_COM_ERROR,1047 +SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; + + +SELECT 1; + +USE information_schema; + +SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; + +SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; + +--disable_query_log +--eval SET @@global.wsrep_cluster_address = '$wsrep_cluster_address_saved' +--enable_query_log +--source include/wait_until_connected_again.inc +--source include/galera_wait_ready.inc + +--connection node_1 +USE test; +SELECT * FROM t1; +# Cleanup +DROP TABLE t1; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_var_fkchecks.test b/mysql-test/suite/galera/t/galera_var_fkchecks.test new file mode 100644 index 00000000..c771b50c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_fkchecks.test @@ -0,0 +1,40 @@ +# +# Test the operation on the foreign_key_checks variable +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE parent ( + id INT PRIMARY KEY, + KEY (id) +) ENGINE=InnoDB; + +CREATE TABLE child ( + id INT PRIMARY KEY, + parent_id INT, + FOREIGN KEY (parent_id) + REFERENCES parent(id) +) ENGINE=InnoDB; + +INSERT INTO parent VALUES (1); +INSERT INTO child VALUES (1,1); + +SET SESSION foreign_key_checks = 0; + +INSERT INTO child VALUES (2,2); + +--connection node_2 +SELECT COUNT(*) = 1 FROM child WHERE id = 2; + +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO child VALUES (3,3); + +SET SESSION foreign_key_checks = 0; +DELETE FROM parent; + +--connection node_1 +SELECT COUNT(*) = 0 FROM parent; + +DROP TABLE child; +DROP TABLE parent; diff --git a/mysql-test/suite/galera/t/galera_var_gtid_domain_id.cnf b/mysql-test/suite/galera/t/galera_var_gtid_domain_id.cnf new file mode 100644 index 00000000..d3c49470 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_gtid_domain_id.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin +log-slave-updates + +[mysqld.1] +gtid_domain_id=1 +wsrep_gtid_mode=ON +wsrep_gtid_domain_id=9999 + +[mysqld.2] +gtid_domain_id=2 +wsrep_gtid_mode=ON +#wsrep_gitd_domain_id value will be inherited from donor node (mysqld.1) +#wsrep_gitd_domain_id=X diff --git a/mysql-test/suite/galera/t/galera_var_gtid_domain_id.test b/mysql-test/suite/galera/t/galera_var_gtid_domain_id.test new file mode 100644 index 00000000..eec47507 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_gtid_domain_id.test @@ -0,0 +1,64 @@ +# Test for @@wsrep_gtid_mode and @@wsrep_gtid_domain_id variables +# +# When @@wsrep_gtid_mode=ON, all DDL/DML commands and transactions that +# are meant to be replicated over Galera cluster nodes are tagged with +# galera gtid_domain_id (@@wsrep_gtid_domain_id), while others are tagged +# with the local domain_id (@@gtid_domain_id). + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # On node_1 +--connection node_1 +# print initial GTIDs +source include/print_gtid.inc; + +--echo # On node_2 +--connection node_2 +# print initial GTIDs +source include/print_gtid.inc; + +--echo # On node_1 +--connection node_1 +CREATE TABLE t1(i INT) ENGINE=INNODB; +CREATE TABLE t2(i INT) ENGINE=MEMORY; +INSERT INTO t1 VALUES(1); +SELECT * FROM t1; +SELECT * FROM t2; +source include/print_gtid.inc; + +--echo # On node_2 +--connection node_2 +SELECT * FROM t1; +source include/print_gtid.inc; + +--echo # On node_1 +--connection node_1 +INSERT INTO t2 VALUES(1); +SELECT * FROM t2; +source include/print_gtid.inc; + +--echo # On node_2 +--connection node_2 +SELECT * FROM t2; +source include/print_gtid.inc; + +--echo # On node_1 +--connection node_1 +# Cleanup +DROP TABLE t1, t2; + +--echo #cleanup +--connection node_1 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--connection node_2 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--source include/galera_end.inc +--echo # End of test + diff --git a/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test b/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test new file mode 100644 index 00000000..0f8efad5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test @@ -0,0 +1,274 @@ +# +# Test option wsrep_ignore_apply_errors +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + + +# +# Ignore reconciling DDL errors on node_2 +# + +--connection node_2 +SET GLOBAL wsrep_ignore_apply_errors = 1; + +# Drop table that does not exist +--connection node_1 +SET GLOBAL wsrep_on = OFF; +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +DROP TABLE t1; + +# Drop schema that does not exist +SET GLOBAL wsrep_on = OFF; +CREATE SCHEMA s1; +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +DROP SCHEMA s1; + +# Drop index that does not exist using DROP INDEX +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_on = OFF; +CREATE INDEX idx1 ON t1 (f1); +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +DROP INDEX idx1 ON t1; +DROP TABLE t1; + +# Drop index that does not exist using ALTER TABLE +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_on = OFF; +CREATE INDEX idx1 ON t1 (f1); +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +ALTER TABLE t1 DROP INDEX idx1; +DROP TABLE t1; + +# Drop column that does not exist +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_on = OFF; +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +ALTER TABLE t1 DROP COLUMN f2; +DROP TABLE t1; + + +# +# Ignore reconciling DML errors on node_2 +# + +--connection node_2 +SET GLOBAL wsrep_ignore_apply_errors = 2; + +# Delete row that does not exist +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_on = OFF; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +DELETE FROM t1 WHERE f1 = 1; + +--connection node_1 +SELECT COUNT(*) as expect_0 FROM t1; +--connection node_2 +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SELECT COUNT(*) as expect_0 FROM t1; + +DROP TABLE t1; + +# Delete row that does not exist in a multi statement transaction +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (2); +SET GLOBAL wsrep_on = OFF; +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +START TRANSACTION; +INSERT INTO t1 VALUES (3); +DELETE FROM t1 WHERE f1 = 1; +DELETE FROM t1 WHERE f1 = 2; +COMMIT; + +--connection node_1 +SELECT COUNT(*) as expect_1 FROM t1; +--connection node_2 +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SELECT COUNT(*) as expect_1 FROM t1; + +DROP TABLE t1; + +# +# Multi-row delete where only one row does not exist +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1; +--source include/wait_condition.inc + +SET SESSION wsrep_on = OFF; +DELETE FROM t1 WHERE f1 = 3; +SET SESSION wsrep_on = ON; +--source include/galera_wait_ready.inc +--connection node_1 +DELETE FROM t1; + +SELECT COUNT(*) as expect_0 FROM t1; +--connection node_2 +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT COUNT(*) as expect_0 FROM t1; +DROP TABLE t1; + +# +# Multi-statement delete where only one row does not exist +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1; +--source include/wait_condition.inc + +SET SESSION wsrep_on = OFF; +DELETE FROM t1 WHERE f1 = 3; +SET SESSION wsrep_on = ON; +--source include/galera_wait_ready.inc + +--connection node_1 + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +DELETE FROM t1 WHERE f1 = 1; +DELETE FROM t1 WHERE f1 = 2; +DELETE FROM t1 WHERE f1 = 3; +DELETE FROM t1 WHERE f1 = 4; +DELETE FROM t1 WHERE f1 = 5; +COMMIT; +SET AUTOCOMMIT=ON; + +SELECT COUNT(*) as expect_0 FROM t1; +--connection node_2 +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT COUNT(*) as expect_0 FROM t1; +DROP TABLE t1; + +# +# Multi-table delete +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2),(3); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),(2),(3); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 3 FROM t2; +--source include/wait_condition.inc + +SET SESSION wsrep_on = OFF; +DELETE FROM t2 WHERE f1 = 2; +DELETE FROM t1 WHERE f1 = 3; +SET SESSION wsrep_on = ON; +--source include/galera_wait_ready.inc + +--connection node_1 +DELETE t1, t2 FROM t1 JOIN t2 WHERE t1.f1 = t2.f1; +SELECT COUNT(*) as expect_0 FROM t1; + +--connection node_2 +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT COUNT(*) as expect_0 FROM t1; +DROP TABLE t1,t2; + +# +# Foreign keys +# + +--connection node_1 +CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; +INSERT INTO parent VALUES (1),(2),(3); +CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB; +INSERT INTO child VALUES (1,1),(2,2),(3,3); + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 3 FROM child; +--source include/wait_condition.inc + +SET SESSION wsrep_on = OFF; +DELETE FROM child WHERE parent_id = 2; +SET SESSION wsrep_on = ON; +--source include/galera_wait_ready.inc + +--connection node_1 +DELETE FROM parent; +SELECT COUNT(*) as expect_0 FROM parent; +SELECT COUNT(*) as expect_0 FROM child; + +--connection node_2 +--source include/galera_wait_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT COUNT(*) as expect_0 FROM parent; +SELECT COUNT(*) as expect_0 FROM child; +DROP TABLE child, parent; + +# +# Ignore all DDL errors on node_2 +# + +--connection node_2 +SET GLOBAL wsrep_ignore_apply_errors = 4; + +# Create a table that already exists +--connection node_2 +SET GLOBAL wsrep_on = OFF; +CREATE TABLE t1 (f1 INTEGER); +SET GLOBAL wsrep_on = ON; +--source include/galera_wait_ready.inc +--connection node_1 +CREATE TABLE t1 (f1 INTEGER, f2 INTEGER); +DROP TABLE t1; + + +--connection node_2 +SET GLOBAL wsrep_ignore_apply_errors = 7; + +CALL mtr.add_suppression("Can't find record in 't.*'"); +CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows event"); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t1'' on query. Default database: 'test'. Query: 'DROP TABLE t1', Error_code: 1051"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't drop database 's1'; database doesn't exist' on query. Default database: 'test'. Query: 'DROP SCHEMA s1', Error_code: 1008"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query. Default database: 'test'. Query: 'DROP INDEX idx1 ON t1', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t1 DROP INDEX idx1', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'f2'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t1 DROP COLUMN f2', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query."); diff --git a/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test b/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test new file mode 100644 index 00000000..10f3815e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test @@ -0,0 +1,72 @@ +# +# This test checks that innodb_disallow_writes works as expected +# +# Note that we need to enable binlog for this test: If the commit +# to InnoDB is done in one phase, the transaction is committed in +# memory before it is persisted to disk. This means that the +# innodb_disallow_writes=ON may not prevent transaction to +# become visible to other readers. On the other hand, if the +# commit is two phase (as it is with binlog), the transaction +# will be blocked in prepare phase. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_log_bin.inc + +--let $datadir= `SELECT @@datadir` + + +# Open a separate connection to be used to run SHOW PROCESSLIST +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1a +SET SESSION wsrep_sync_wait = 0; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER, f2 varchar(1024)) Engine=InnoDB; +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +SET GLOBAL innodb_disallow_writes=ON; +--exec find $datadir -type f-exec md5sum {} \; | md5sum >$MYSQLTEST_VARDIR/tmp/innodb_before + +# +# This insert has no effect before innodb_disallow_writes is OFF +# +--send INSERT INTO t1 (f2) SELECT 'abcde ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_2 +INSERT INTO t1 (f2) SELECT 'fghij ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +--connection node_1a +--sleep 5 + +--exec find $datadir -type f-exec md5sum {} \; | md5sum >$MYSQLTEST_VARDIR/tmp/innodb_after + +SET GLOBAL innodb_disallow_writes=OFF; + +--connection node_1 +--reap +--let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_20000 FROM t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; +--source include/wait_condition.inc +SELECT COUNT(*) AS EXPECT_20000 FROM t1; + +--connection node_1 +--diff_files $MYSQLTEST_VARDIR/tmp/innodb_before $MYSQLTEST_VARDIR/tmp/innodb_after + +--connection node_2 + +DROP TABLE t1; +DROP TABLE ten; + +--disconnect node_1a + diff --git a/mysql-test/suite/galera/t/galera_var_load_data_splitting.test b/mysql-test/suite/galera/t/galera_var_load_data_splitting.test new file mode 100644 index 00000000..621cb69f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_load_data_splitting.test @@ -0,0 +1,42 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/big_test.inc + +--let $wsrep_load_data_splitting_orig = `SELECT @@wsrep_load_data_splitting` + +# Create a file for LOAD DATA with 95K entries +--perl +open(FILE, ">", "$ENV{'MYSQLTEST_VARDIR'}/tmp/galera_var_load_data_splitting.csv") or die; +foreach my $i (1..95000) { + print FILE "$i\n"; +} +EOF + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +# Record wsrep_last_committed as it was before LOAD DATA +--connection node_2 +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +SET GLOBAL wsrep_load_data_splitting = TRUE; +--disable_query_log +--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/galera_var_load_data_splitting.csv' INTO TABLE t1; +--enable_query_log + +--connection node_2 +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +SELECT COUNT(*) = 95000 FROM t1; + +# LOAD-ing 95K rows causes 10 commits to be registered +--disable_query_log +--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 10 AS wsrep_last_committed_diff; +--enable_query_log + +--connection node_1 +--eval SET GLOBAL wsrep_load_data_splitting = $wsrep_load_data_splitting_orig; + +--connection node_2 +--eval SET GLOBAL wsrep_load_data_splitting = $wsrep_load_data_splitting_orig; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_log_bin.cnf b/mysql-test/suite/galera/t/galera_var_log_bin.cnf new file mode 100644 index 00000000..30ccee20 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_log_bin.cnf @@ -0,0 +1,10 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin + +[mysqld.1] +log-slave-updates + +[mysqld.2] +log-slave-updates diff --git a/mysql-test/suite/galera/t/galera_var_log_bin.test b/mysql-test/suite/galera/t/galera_var_log_bin.test new file mode 100644 index 00000000..1b1886b9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_log_bin.test @@ -0,0 +1,22 @@ +# +# A simple test that confirms that Galera works with log-bin enabled, that is +# when MySQL's binlog is in effect rather than the Galera 'dummy' implementation. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +UPDATE t1 SET f1 = 2 WHERE f1 = 1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_max_ws_rows.test b/mysql-test/suite/galera/t/galera_var_max_ws_rows.test new file mode 100644 index 00000000..ab6a3390 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_max_ws_rows.test @@ -0,0 +1,176 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; + +--let $wsrep_max_ws_rows_orig = `SELECT @@wsrep_max_ws_rows` +SET GLOBAL wsrep_max_ws_rows = 4; + +# Test that wsrep_max_ws_rows is enforced with multi statement transactions + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +INSERT INTO t1 (f2) VALUES (3); +INSERT INTO t1 (f2) VALUES (4); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (5); +COMMIT; +SELECT COUNT(*) = 0 FROM t1; + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +INSERT INTO t1 (f2) VALUES (3); +INSERT INTO t1 (f2) VALUES (4); +--error ER_ERROR_DURING_COMMIT +UPDATE t1 SET f2 = 10 WHERE f2 = 4; +COMMIT; +SELECT COUNT(*) = 0 FROM t1; + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); +INSERT INTO t1 (f2) VALUES (3); +INSERT INTO t1 (f2) VALUES (4); +--error ER_ERROR_DURING_COMMIT +DELETE FROM t1 WHERE f2 = 1; +COMMIT; +SELECT COUNT(*) = 0 FROM t1; + + +# Test that wsrep_max_ws_rows is enforced on sigle statements + +SET GLOBAL wsrep_max_ws_rows = 5; +INSERT INTO t1 (f2) VALUES (1),(2),(3),(4),(5); +SET GLOBAL wsrep_max_ws_rows = 4; + +--error ER_ERROR_DURING_COMMIT +UPDATE t1 SET f2 = f2 + 10; +SELECT COUNT(*) = 5 FROM t1; + +--error ER_ERROR_DURING_COMMIT +DELETE FROM t1 WHERE f2 < 10; +SELECT COUNT(*) = 5 FROM t1; + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) SELECT * FROM ten; +SELECT COUNT(*) = 5 FROM t1; + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (10),(20),(30),(40),(50); +SELECT COUNT(*) = 5 FROM t1; + +# Fewer than wsrep_max_ws_rows is OK + +SET GLOBAL wsrep_max_ws_rows = 10; +DELETE FROM t1 WHERE f2 < 10; +SELECT COUNT(*) = 0 FROM t1; + +# Test a series of transactions + +--disable_query_log +SET GLOBAL wsrep_max_ws_rows = 5; +let $i= 100; +while ($i) +{ + START TRANSACTION; + --eval INSERT INTO t1 (f2) VALUES ($i); + COMMIT; + dec $i; +} +--enable_query_log +SET GLOBAL wsrep_max_ws_rows = 100; +SELECT COUNT(*) = 100 FROM t1; +DELETE FROM t1 WHERE f2 < 101; +SELECT COUNT(*) = 0 FROM t1; + +# Test large statements + +SET GLOBAL wsrep_max_ws_rows = 9999; +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +SET GLOBAL wsrep_max_ws_rows = 10000; +INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +SET GLOBAL wsrep_max_ws_rows = 9999; +--error ER_ERROR_DURING_COMMIT +UPDATE t1 SET f2 = 2 WHERE f2 = 1; +SET GLOBAL wsrep_max_ws_rows = 10000; +UPDATE t1 SET f2 = 2 WHERE f2 = 1; + +SET GLOBAL wsrep_max_ws_rows = 9999; +--error ER_ERROR_DURING_COMMIT +DELETE FROM t1 WHERE f2 = 2; +SET GLOBAL wsrep_max_ws_rows = 10000; +DELETE FROM t1 WHERE f2 = 2; + +SELECT COUNT(*) = 0 FROM t1; + + +# Test that wsrep_max_ws_rows is reset when switching autocommit mode + +SET AUTOCOMMIT = ON; +SET GLOBAL wsrep_max_ws_rows = 1; + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + +INSERT INTO t1 (f2) VALUES (1); +INSERT INTO t1 (f2) VALUES (2); + + +SET AUTOCOMMIT = OFF; +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + + +# Test that wsrep_max_ws_rows is reset on implicit commits + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); + +START TRANSACTION; +INSERT INTO t1 (f2) VALUES (1); +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 (f2) VALUES (2); + +DROP TABLE t1; +DROP TABLE ten; + +--echo # +--echo # MDEV-11817: Altering a table with more rows than +--echo # wsrep_max_ws_rows causes cluster to break when running +--echo # Galera cluster in TOI mode +--echo # +--connection node_1 +CREATE TABLE t1(c1 INT)ENGINE = INNODB; +SET GLOBAL wsrep_max_ws_rows= DEFAULT; +INSERT INTO t1 VALUES(1); +INSERT INTO t1 SELECT * FROM t1; +SET GLOBAL wsrep_max_ws_rows= 1; +ALTER TABLE t1 CHANGE COLUMN c1 c1 BIGINT; + +--connection node_2 +SHOW CREATE TABLE t1; +SELECT COUNT(*) FROM t1; +DROP TABLE t1; + +--connection node_1 + +--disable_query_log +--eval SET GLOBAL wsrep_max_ws_rows = $wsrep_max_ws_rows_orig +--enable_query_log + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_var_max_ws_size.test b/mysql-test/suite/galera/t/galera_var_max_ws_size.test new file mode 100644 index 00000000..8eb93bda --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_max_ws_size.test @@ -0,0 +1,46 @@ +# +# This test sets wsrep_max_ws_size to a very low value and checks that the transaction is rejected +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 VARCHAR(1024)) Engine=InnoDB; + +--let $wsrep_max_ws_size_orig = `SELECT @@wsrep_max_ws_size` +SET GLOBAL wsrep_max_ws_size = 1024; + +--error ER_ERROR_DURING_COMMIT +INSERT INTO t1 VALUES (DEFAULT, REPEAT('X', 1024)); +SELECT COUNT(*) = 0 FROM t1; + +# +# Changing repl.max_ws_size also changes wsrep_max_ws_size +# + +SET GLOBAL wsrep_provider_options = 'repl.max_ws_size=10000'; +SELECT @@wsrep_max_ws_size = 10000; + + +# +# Changing wsrep_max_ws_size is equivalent to changing repl.max_ws_size +# + +SET GLOBAL wsrep_provider_options = 'repl.max_ws_size=20000'; +--let $provider_options = `SELECT @@wsrep_provider_options` +SET GLOBAL wsrep_provider_options = 'repl.max_ws_size=10000'; + +SET GLOBAL wsrep_max_ws_size = 20000; +--let $provider_options_updated = `SELECT @@wsrep_provider_options` + +--disable_query_log +--eval SELECT STRCMP('$provider_options', '$provider_options_updated') = 0 AS provider_options_match +--enable_query_log + +--disable_query_log +--eval SET GLOBAL wsrep_max_ws_size = $wsrep_max_ws_size_orig +--enable_query_log + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_mysql_replication_bundle.test b/mysql-test/suite/galera/t/galera_var_mysql_replication_bundle.test new file mode 100644 index 00000000..642d9396 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_mysql_replication_bundle.test @@ -0,0 +1,30 @@ +# +# Simple test for the operation on the wsrep-mysql-replication-bundle +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_mysql_replication_bundle_orig = `SELECT @@wsrep_mysql_replication_bundle` + +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; + +SET GLOBAL wsrep_mysql_replication_bundle = 2; + +--connection node_1 +# This statement will not be replicated immediately +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +INSERT INTO t1 VALUES (2); + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; + +--connection node_1 +--eval SET GLOBAL wsrep_mysql_replication_bundle = $wsrep_mysql_replication_bundle_orig + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_node_address.cnf b/mysql-test/suite/galera/t/galera_var_node_address.cnf new file mode 100644 index 00000000..0de0edaa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_node_address.cnf @@ -0,0 +1,10 @@ +!include ../galera_4nodes.cnf + +[mysqld.2] +wsrep_node_address=127.0.0.1 + +[mysqld.3] +wsrep_node_address=localhost + +[mysqld.4] +wsrep_node_address=lo diff --git a/mysql-test/suite/galera/t/galera_var_node_address.test b/mysql-test/suite/galera/t/galera_var_node_address.test new file mode 100644 index 00000000..99cb30e7 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_node_address.test @@ -0,0 +1,32 @@ +# +# Test wsrep_node_address . The galera_var_node_address.cnf contains various settings for +# wsrep_node_address, so in this test we simply confirm that the cluster has started up correctly. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +call mtr.add_suppression("WSREP: Stray state UUID msg: .*"); +call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .*"); +call mtr.add_suppression("WSREP: Sending JOIN failed: .*"); +flush tables; + +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; + +--connection node_2 +set global wsrep_sync_wait=15; +INSERT INTO t1 VALUES (1); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +set global wsrep_sync_wait=15; +SELECT COUNT(*) FROM t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_notify_cmd-master.opt b/mysql-test/suite/galera/t/galera_var_notify_cmd-master.opt new file mode 100644 index 00000000..70dfc987 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_notify_cmd-master.opt @@ -0,0 +1 @@ +--wsrep_notify_cmd=$MYSQL_TEST_DIR/std_data/wsrep_notify.sh --wsrep-sync-wait=0 diff --git a/mysql-test/suite/galera/t/galera_var_notify_cmd.test b/mysql-test/suite/galera/t/galera_var_notify_cmd.test new file mode 100644 index 00000000..fda61bf2 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_notify_cmd.test @@ -0,0 +1,18 @@ +# +# Test wsrep_notify_cmd. We use a version of the support-files/wsrep_notify.sh script that writes +# notifications into a table. +# + +--source include/galera_cluster.inc +--source include/force_restart.inc + +--connection node_1 +--let $wait_condition = SELECT COUNT(DISTINCT uuid) = 2 FROM mtr_wsrep_notify.membership; +--source include/wait_condition.inc + +SELECT COUNT(DISTINCT uuid) AS EXPECT_2 FROM mtr_wsrep_notify.membership; +SELECT MAX(size) AS EXPECT_2 FROM mtr_wsrep_notify.status; +SELECT COUNT(DISTINCT idx) AS EXPECT_2 FROM mtr_wsrep_notify.status; + +# CLEANUP +DROP SCHEMA mtr_wsrep_notify; diff --git a/mysql-test/suite/galera/t/galera_var_reject_queries.test b/mysql-test/suite/galera/t/galera_var_reject_queries.test new file mode 100644 index 00000000..aa31b94d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_reject_queries.test @@ -0,0 +1,49 @@ +# +# Test wsrep_reject_queries +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +call mtr.add_suppression("WSREP has not yet prepared node for application use"); + +CREATE TABLE t1 (f1 INTEGER); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1 +--error ER_GLOBAL_VARIABLE +SET SESSION wsrep_reject_queries = ALL; + +SET GLOBAL wsrep_reject_queries = ALL; + +--error ER_UNKNOWN_COM_ERROR,1047 +SELECT * FROM t1; + +# +# Original behavior was lost connection, +# but since 10.1, we allow controlling connection to remain alive +# +--error 0,2013 +SET GLOBAL wsrep_reject_queries = ALL_KILL; + +--connection node_1a +--error ER_CONNECTION_KILLED,2013,2006 +SELECT * FROM t1; + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--error ER_UNKNOWN_COM_ERROR,1047 +SELECT * FROM t1; + +# Confirm that replication continues + +--connection node_2 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +INSERT INTO t1 VALUES (1); + +--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET GLOBAL wsrep_reject_queries = NONE; + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_replicate_myisam_off.test b/mysql-test/suite/galera/t/galera_var_replicate_myisam_off.test new file mode 100644 index 00000000..a9811283 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_replicate_myisam_off.test @@ -0,0 +1,21 @@ +# +# Simple test for wsrep-replicate-myisam = FALSE +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $wsrep_replicate_myisam_orig = `SELECT @@wsrep_replicate_myisam` + +SET GLOBAL wsrep_replicate_myisam = FALSE; + +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=MyISAM; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test b/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test new file mode 100644 index 00000000..adb5cb04 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_replicate_myisam_on.test @@ -0,0 +1,229 @@ +# +# Simple test for wsrep-replicate-myisam = ON +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +--let $wsrep_replicate_myisam_orig = `SELECT @@wsrep_replicate_myisam` + +--connection node_1 +SET GLOBAL wsrep_replicate_myisam = TRUE; +--connection node_2 +SET GLOBAL wsrep_replicate_myisam = TRUE; + +# +# Simple INSERT +# + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=MyISAM; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2), (3); +INSERT INTO t1 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; + +--connection node_2 +SELECT COUNT(*) = 5 FROM t1; + +DROP TABLE t1; + +# +# REPLACE +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 VARCHAR(100)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1, 'abc'),(2,'abc'), (3, 'xxx'); +REPLACE INTO t1 VALUES (1, 'klm'), (2,'xyz'); +REPLACE INTO t1 SELECT 3, 'yyy' FROM DUAL; + +--connection node_2 +SELECT COUNT(*) = 3 FROM t1; +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 1 AND f2 = 'klm'; +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 2 AND f2 = 'xyz'; +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 3 AND f2 = 'yyy'; + +# +# UPDATE +# + +--connection node_1 +UPDATE t1 SET f2 = 'zzz' WHERE f2 = 'yyy'; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'zzz'; + +# +# DELETE +# + +--connection node_1 +DELETE FROM t1 WHERE f2 = 'zzz'; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'zzz'; + +# +# TRUNCATE +# + +--connection node_1 +TRUNCATE TABLE t1; + +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; +DROP TABLE t1; + +# +# Transaction +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; +CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); +COMMIT; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; + +# +# Transaction rollback +# + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 VALUES (2); +INSERT INTO t2 VALUES (2); +ROLLBACK; + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; +SELECT COUNT(*) = 1 FROM t2; + +DROP TABLE t1; +DROP TABLE t2; + +# +# Transaction conflict +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=MyISAM; +CREATE TABLE t2 (f2 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); + +--connection node_2 +# The MyISAM update is replicated immediately, so a duplicate key error happens even before the COMMIT +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (1); + +--connection node_1 +COMMIT; + +DROP TABLE t1; +DROP TABLE t2; + +--echo # +--echo # MDEV-11152: wsrep_replicate_myisam: SELECT gets replicated using TO +--echo # +--connection node_1 +CREATE TABLE t1 (i INT) ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +# This command should not get replicated. +SELECT * FROM t1; +DROP TABLE t1; + +# +# Test prepared staments +# +--connection node_1 +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); + +PREPARE upd from 'update t1 set b = 100 where id = 5'; +PREPARE ins from 'insert into t1 values (11,11)'; +PREPARE del from 'delete from t1 where id = 4'; +PREPARE rep from 'replace into t1 values (12,12),(6,600)'; + +EXECUTE upd; +EXECUTE ins; +EXECUTE del; +EXECUTE rep; + +SELECT * FROM t1 ORDER BY id; + +--connection node_2 +SELECT * FROM t1 ORDER BY id; + +DROP TABLE t1; + +# +# Test procedure +# +--connection node_1 +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); + +DELIMITER |; +CREATE PROCEDURE proc() +BEGIN + UPDATE t1 set b = 100 WHERE id = 5; + INSERT INTO t1 VALUES (11,11); + DELETE FROM t1 WHERE id = 4; + REPLACE INTO t1 VALUES (12,12),(6,600); + COMMIT; +END| +DELIMITER ;| + +CALL proc(); +SELECT * FROM t1 ORDER BY id; + +--connection node_2 +SELECT * FROM t1 ORDER BY id; + +DROP PROCEDURE proc; +DROP TABLE t1; + +# +# Test trigger +# +--connection node_1 +CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, b INT) ENGINE=MyISAM; +CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT) ENGINE=MyISAM; +INSERT INTO t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10); +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, NEW.b); +CREATE TRIGGER tr2 BEFORE UPDATE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b),(NULL, NEW.b); +CREATE TRIGGER tr3 BEFORE DELETE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (NULL, OLD.b); + +INSERT INTO t1 VALUES (11,11); +UPDATE t1 SET b = 200 WHERE id = 2; +DELETE FROM t1 where id = 5; +SELECT * FROM t1 ORDER BY id; +SELECT * FROM t2 ORDER BY id; + +--connection node_2 +SELECT * FROM t1 ORDER BY id; +SELECT * FROM t2 ORDER BY id; +DROP TRIGGER tr1; +DROP TRIGGER tr2; +DROP TRIGGER tr3; +DROP TABLE t1,t2; + +--connection node_1 +--disable_query_log +--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SET GLOBAL wsrep_replicate_myisam = $wsrep_replicate_myisam_orig +--enable_query_log diff --git a/mysql-test/suite/galera/t/galera_var_retry_autocommit.test b/mysql-test/suite/galera/t/galera_var_retry_autocommit.test new file mode 100644 index 00000000..6bed1b01 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_retry_autocommit.test @@ -0,0 +1,143 @@ +# +# Test that the wsrep_retry_autocommit variable is respected. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +# +# With wsrep_retry_autocommit = 0, error is certain +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +SET SESSION wsrep_retry_autocommit = 0; +SET DEBUG_SYNC = 'wsrep_before_certification SIGNAL before_cert WAIT_FOR continue'; +--send INSERT INTO t1 (f1) VALUES (2) + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR before_cert'; + +--connection node_2 +TRUNCATE TABLE t1; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap +SELECT COUNT(*) = 0 FROM t1; + +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; + + +# +# With wsrep_retry_autocommit = 1, success against one TRUNCATE +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +SET SESSION wsrep_retry_autocommit = 1; +SET DEBUG_SYNC = 'wsrep_before_certification SIGNAL before_cert WAIT_FOR continue'; +--send INSERT INTO t1 (f1) VALUES (3) + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR before_cert'; + +--connection node_2 +TRUNCATE TABLE t1; + +--connection node_1 +--reap +SELECT COUNT(*) = 1 FROM t1; + +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; + + +# +# With wsrep_retry_autcommit = 1, failure against multiple TRUNCATEs +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +SET SESSION wsrep_retry_autocommit = 1; +SET GLOBAL debug_dbug = '+d,sync.wsrep_retry_autocommit'; +SET DEBUG_SYNC = 'wsrep_before_certification SIGNAL before_cert WAIT_FOR continue EXECUTE 2'; + +--send INSERT INTO t1 VALUES (4); + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR before_cert'; + +--connection node_2 +TRUNCATE TABLE t1; + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR wsrep_retry_autocommit_reached'; +SELECT COUNT(*) = 0 FROM t1; +SET DEBUG_SYNC = 'now SIGNAL wsrep_retry_autocommit_continue WAIT_FOR before_cert'; + +--connection node_2 +TRUNCATE TABLE t1; + +--connection node_1a +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = NULL; +DROP TABLE t1; + + +# +# With wsrep_retry_autocommit = 64, success against 64 TRUNCATEs +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +SET SESSION wsrep_retry_autocommit = 64; +SET GLOBAL debug_dbug = '+d,sync.wsrep_retry_autocommit'; +SET DEBUG_SYNC = 'wsrep_before_certification SIGNAL before_cert WAIT_FOR continue EXECUTE 64'; + +--send INSERT INTO t1 VALUES (5) + +--disable_query_log +--disable_result_log +--let $count = 64 +while ($count) +{ + --connection node_1a + SET DEBUG_SYNC = 'now WAIT_FOR before_cert'; + + --connection node_2 + TRUNCATE TABLE t1; + + --connection node_1a + SET DEBUG_SYNC = 'now WAIT_FOR wsrep_retry_autocommit_reached'; + SELECT COUNT(*) = 1 FROM t1; + SET DEBUG_SYNC = 'now SIGNAL wsrep_retry_autocommit_continue'; + + --dec $count +} +--enable_result_log +--enable_query_log + +--connection node_1 +--reap +SELECT COUNT(*) = 1 FROM t1; + +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = NULL; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_slave_threads.cnf b/mysql-test/suite/galera/t/galera_var_slave_threads.cnf new file mode 100644 index 00000000..889c81b4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_slave_threads.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +auto_increment_offset=1 + +[mysqld.2] +auto_increment_offset=2 diff --git a/mysql-test/suite/galera/t/galera_var_slave_threads.test b/mysql-test/suite/galera/t/galera_var_slave_threads.test new file mode 100644 index 00000000..4a2dd070 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_slave_threads.test @@ -0,0 +1,121 @@ +# +# This tests the very basic operations around wsrep-slave-threads +# More complex scenarios will be tested separately in the context of +# parallel replication +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/force_restart.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +--let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads` +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; +CREATE TABLE t2 (f1 INT AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB; + +--connection node_2 +CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); +# Setting wsrep_slave_threads to zero triggers a warning +SET GLOBAL wsrep_slave_threads = 0; +SHOW WARNINGS; +SELECT @@wsrep_slave_threads = 1; + +SET GLOBAL wsrep_slave_threads = 1; +# There is a separate wsrep_aborter thread at all times +SELECT COUNT(*) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 + +--let $wait_timeout=600 +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; + +# +# Increase the number of slave threads. The change takes effect immediately +# +SET GLOBAL wsrep_slave_threads = 64; + +--let $wait_condition = SELECT VARIABLE_VALUE = 64 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--source include/wait_condition.inc + +# +# Reduce the number of slave threads. The change is not immediate -- a thread will only exit after a replication event +# + +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_1 + +--disable_result_log +--disable_query_log +# Generate 70 replication events +--let $count = 70 +while ($count) +{ + INSERT INTO t2 VALUES (DEFAULT); + --dec $count +} +--enable_query_log +--enable_result_log + +--connection node_2 +SELECT COUNT(*) FROM t2; + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--source include/wait_condition.inc + +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig + +DROP TABLE t1; +DROP TABLE t2; + +--echo # +--echo # lp:1372840 - Changing wsrep_slave_threads causes future connections to hang +--echo # + +--connection node_1 +CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY) ENGINE=INNODB; + +--connection node_2 +SET GLOBAL wsrep_slave_threads = 4; +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--source include/wait_condition.inc + +SET GLOBAL wsrep_slave_threads = 1; + +--connection node_1 +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +DROP TABLE t1; + +--connection node_2 + +# Wait until above DDL is replicated +# +# make sure that we are left with exactly one applier thread before we leaving the test +# +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--echo # End of tests diff --git a/mysql-test/suite/galera/t/galera_var_sst_auth.cnf b/mysql-test/suite/galera/t/galera_var_sst_auth.cnf new file mode 100644 index 00000000..114815d4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_sst_auth.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_sst_auth=root: + +[mysqld.2] +wsrep_sst_auth=root: diff --git a/mysql-test/suite/galera/t/galera_var_sst_auth.test b/mysql-test/suite/galera/t/galera_var_sst_auth.test new file mode 100644 index 00000000..ebeaddc0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_sst_auth.test @@ -0,0 +1,39 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +# +# MDEV-10492: Assertion failure on shutdown when wsrep_sst_auth set in config +# + +SELECT @@global.wsrep_sst_auth; +SET @@global.wsrep_sst_auth='foo:bar'; +SELECT @@global.wsrep_sst_auth; + +# +# MDEV-24509 Warning: Memory not freed: 56 on SET @@global.wsrep_sst_auth +# +--connection node_2 +SET @@global.wsrep_sst_auth= 'abcdefghijklmnopqrstuvwxyz'; +SELECT @@global.wsrep_sst_auth; +--echo Shutdown node_2 +--source include/shutdown_mysqld.inc + +# On node_1, verify that the node has left the cluster. +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Restart node_2 +--connection node_2 +--source include/start_mysqld.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SELECT @@global.wsrep_sst_auth; + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_var_sync_wait.test b/mysql-test/suite/galera/t/galera_var_sync_wait.test new file mode 100644 index 00000000..ecb0d92b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_sync_wait.test @@ -0,0 +1,53 @@ +# +# Simple test for the various levels of wsrep-sync-wait +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-10161: wsrep_sync_wait not enabled when set to 1 in config file +--echo # +# galera_2nodes.cnf sets wsrep_sync_wait to 7 +SELECT @@global.wsrep_sync_wait; +SELECT @@global.wsrep_causal_reads; + +--let $wsrep_sync_wait_orig = `SELECT @@wsrep_sync_wait` + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; + +--connection node_2 +SET GLOBAL wsrep_sync_wait = 1; +# Those statements should see the table + +# MW-86 SHOW commands have now their own bitmask +# SHOW TABLES LIKE '%t1'; + +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +CREATE TABLE t2 (f1 INT PRIMARY KEY) Engine=InnoDB; + +--connection node_2 +SET GLOBAL wsrep_sync_wait = 4; +# This insert should see the table and succeed +INSERT INTO t2 VALUES (1); + +--connection node_1 +CREATE TABLE t3 (f1 INT PRIMARY KEY) Engine=InnoDB; +INSERT INTO t3 VALUES (1); + +--connection node_2 +SET GLOBAL wsrep_sync_wait = 2; +# This statement should see and update 1 row +--enable_info +UPDATE t3 SET f1 = 2; +--disable_info + +--connection node_2 +--eval SET GLOBAL wsrep_sync_wait = $wsrep_sync_wait_orig + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; diff --git a/mysql-test/suite/galera/t/galera_var_trx_fragment_size.test b/mysql-test/suite/galera/t/galera_var_trx_fragment_size.test new file mode 100644 index 00000000..f19152f3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_trx_fragment_size.test @@ -0,0 +1,43 @@ +--source include/galera_cluster.inc + +SET SESSION wsrep_trx_fragment_size=DEFAULT; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET SESSION wsrep_trx_fragment_size=0; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET GLOBAL wsrep_trx_fragment_size=DEFAULT; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET GLOBAL wsrep_trx_fragment_size=0; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET GLOBAL wsrep_trx_fragment_size=-1; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET SESSION wsrep_trx_fragment_size=-1; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET GLOBAL wsrep_trx_fragment_size=100; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET SESSION wsrep_trx_fragment_size=100; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +--error ER_WRONG_TYPE_FOR_VAR +SET GLOBAL wsrep_trx_fragment_size='A'; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +--error ER_WRONG_TYPE_FOR_VAR +SET SESSION wsrep_trx_fragment_size='A'; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +--error ER_WRONG_TYPE_FOR_VAR +SET GLOBAL wsrep_trx_fragment_size=NULL; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +--error ER_WRONG_TYPE_FOR_VAR +SET SESSION wsrep_trx_fragment_size=NULL; +SHOW SESSION VARIABLES LIKE 'wsrep_trx_fragment_size'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_trx_fragment_size'; +SET GLOBAL wsrep_trx_fragment_size=DEFAULT; diff --git a/mysql-test/suite/galera/t/galera_var_wsrep_on_off.test b/mysql-test/suite/galera/t/galera_var_wsrep_on_off.test new file mode 100644 index 00000000..25acfe84 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_wsrep_on_off.test @@ -0,0 +1,185 @@ +# +# Test wsrep_on = OFF. Some events will not be replicated +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +SET SESSION wsrep_on = FALSE; + +# This statement will not be replicated +INSERT INTO t1 VALUES (2); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +SET GLOBAL wsrep_on = TRUE; +INSERT INTO t1 VALUES (3); + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; + +# Middle insert is not replicated +SELECT COUNT(*) = 0 FROM t1 WHERE f1 = 2; + +# Final insert is replicated +SELECT COUNT(*) = 1 FROM t1 WHERE f1 = 3; + +DROP TABLE t1; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +# +# Test that variable wsrep_on cannot be changed while in +# active transaction. +# + +--connection node_1 +START TRANSACTION; +--error ER_CANT_DO_THIS_DURING_AN_TRANSACTION +SET SESSION wsrep_on=OFF; +--error ER_CANT_DO_THIS_DURING_AN_TRANSACTION +SET GLOBAL wsrep_on=OFF; +COMMIT; + + +# +# Test that @@global.wsrep_on does not affect the value of +# @@session.wsrep_on of current sessions +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +START TRANSACTION; +INSERT INTO t1 VALUES (1); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +--connection node_1a +SET GLOBAL wsrep_on = OFF; + +--connection node_1 +SHOW SESSION VARIABLES LIKE 'wsrep_on'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_on'; +INSERT INTO t1 VALUES (2); +COMMIT; + +--connection node_2 +SET SESSION wsrep_sync_wait = 15; +SELECT * FROM t1; + +--connection node_1a +SET GLOBAL wsrep_on = ON; +DROP TABLE t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + + +# +# New connections inherit @@session.wsrep_on from @@global.wsrep_on +# + +--connection node_1 +SET GLOBAL wsrep_on = OFF; + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +--connection node_1b +SHOW SESSION VARIABLES LIKE 'wsrep_on'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_on'; +CREATE TABLE t2 (f1 INTEGER); +DROP TABLE t2; + +SET GLOBAL wsrep_on = ON; +SHOW SESSION VARIABLES LIKE 'wsrep_on'; + +--disconnect node_1b + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + + +# +# Can't set @@session.wsrep_on = ON, while @@global.wsrep_on = OFF +# + +--connection node_1 +SET GLOBAL wsrep_on = OFF; +--error ER_WRONG_ARGUMENTS +SET SESSION wsrep_on = ON; + +SET GLOBAL wsrep_on = ON; +SET SESSION wsrep_on = ON; + + +# +# @@global.wsrep_on = OFF followed by @@global.wsrep_on = ON +# in a new connection +# + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +SET GLOBAL wsrep_on = OFF; +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +--connection node_1b +SHOW SESSION VARIABLES LIKE 'wsrep_on'; +SHOW GLOBAL VARIABLES LIKE 'wsrep_on'; +SET GLOBAL wsrep_on = ON; +START TRANSACTION; +INSERT INTO t1 VALUES(1); +COMMIT; + +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; + +DROP TABLE t1; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +# +# Test single statement, multi statement, and +# TOI tansactions while @@session.wsrep_on = OFF +# and then same @@global.wsrep_on = OFF. +# Notice, the combination @@global.wsrep_on = OFF +# and @@session.wsrep_on = ON is not not possible, +# (as tested above in this test case) +# + +--connection node_1 +SET SESSION wsrep_on = OFF; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +INSERT INTO t1 VALUES (1); +START TRANSACTION; +INSERT INTO t1 VALUES (2); +COMMIT; +DROP TABLE t1; +--connection node_2 +SHOW TABLES; +--connection node_1 +SET SESSION wsrep_on = ON; + +SET GLOBAL wsrep_on = OFF; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +INSERT INTO t1 VALUES (1); +START TRANSACTION; +INSERT INTO t1 VALUES (2); +COMMIT; +--connection node_2 +SHOW TABLES; +--connection node_1 +DROP TABLE t1; +SET GLOBAL wsrep_on = ON; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc diff --git a/mysql-test/suite/galera/t/galera_var_wsrep_provider_options.test b/mysql-test/suite/galera/t/galera_var_wsrep_provider_options.test new file mode 100644 index 00000000..3dc2cbaa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_wsrep_provider_options.test @@ -0,0 +1,11 @@ +--source include/galera_cluster.inc + +call mtr.add_suppression("WSREP: Unknown parameter 'a'"); +call mtr.add_suppression("WSREP: Set options returned 7"); + +--error ER_WRONG_ARGUMENTS +SET GLOBAL wsrep_provider_options=NULL; +SET GLOBAL wsrep_provider_options=''; +SET GLOBAL wsrep_provider_options=' '; +--error ER_WRONG_ARGUMENTS +SET GLOBAL wsrep_provider_options='a=1'; diff --git a/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test b/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test new file mode 100644 index 00000000..43fd09b9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test @@ -0,0 +1,76 @@ +--source include/galera_cluster.inc + +--echo # +--echo # wsrep_start_position +--echo # + +CALL mtr.add_suppression("WSREP: SST failed for position .*"); + +SET @wsrep_start_position_global_saved = @@global.wsrep_start_position; +--echo # default +SELECT @@global.wsrep_start_position; + +--echo +--echo # scope +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.wsrep_start_position; +SELECT @@global.wsrep_start_position; + +--echo +--echo # valid values +SET @@global.wsrep_start_position='00000000-0000-0000-0000-000000000000:-1'; +SELECT @@global.wsrep_start_position; + +--echo +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='00000000-0000-0000-0000-000000000000:0'; +SELECT @@global.wsrep_start_position; +--echo # invalid values +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='12345678-1234-1234-1234-123456789012:100'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='00000000-0000-0000-0000-000000000000:-2'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='00000000-0000-0000-0000-000000000000:-2A'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='00000000-0000-0000-0000-000000000000:0A'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='000000000000000-0000-0000-0000-000000000000:-1'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='12345678-1234-1234-12345-123456789012:100'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='12345678-1234-123-12345-123456789012:0'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='12345678-1234-1234-1234-123456789012:_99999'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='12345678-1234-1234-1234-123456789012:a'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='OFF'; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position=ON; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position=''; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position=NULL; +SELECT @@global.wsrep_start_position; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_start_position='junk'; +SELECT @@global.wsrep_start_position; + +--echo +--echo # restore the initial value +SET @@global.wsrep_start_position = @wsrep_start_position_global_saved; + +--echo # End of test diff --git a/mysql-test/suite/galera/t/galera_view.test b/mysql-test/suite/galera/t/galera_view.test new file mode 100644 index 00000000..2bfeb302 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_view.test @@ -0,0 +1,7 @@ +--source include/galera_cluster.inc + +CREATE VIEW v AS SELECT 1; +RENAME TABLE v TO v2; + +# Cleanup +DROP VIEW v2; diff --git a/mysql-test/suite/galera/t/galera_virtual_blob.test b/mysql-test/suite/galera/t/galera_virtual_blob.test new file mode 100644 index 00000000..a10e3025 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_virtual_blob.test @@ -0,0 +1,10 @@ +--source include/galera_cluster.inc + +CREATE TABLE t (f INT GENERATED ALWAYS AS (a+b)VIRTUAL,a INT,b INT,h BLOB); +INSERT INTO t (a,b)VALUES(0,0), (0,0), (0,0), (0,0), (0,0); +SELECT * from t; + +--connection node_2 +SELECT * from t; +--connection node_1 +DROP TABLE t; diff --git a/mysql-test/suite/galera/t/galera_virtual_column.test b/mysql-test/suite/galera/t/galera_virtual_column.test new file mode 100644 index 00000000..84e1da02 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_virtual_column.test @@ -0,0 +1,42 @@ +# +# This test is for testing virtual columnm support in galera cluster +# +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# test case for verifying that cascaded delete in a table with virtual column does not crash slave node +# + +--connection node_1 + +CREATE TABLE p (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT) ENGINE = InnoDB; +CREATE TABLE c (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, pid INT UNSIGNED, bitmap TINYINT UNSIGNED NOT NULL DEFAULT 0, bitmap5 TINYINT UNSIGNED GENERATED ALWAYS AS (bitmap&(1<<5)) VIRTUAL, FOREIGN KEY (pid) REFERENCES p (id) ON DELETE CASCADE ON UPDATE CASCADE); + +# not sure of this index is needed for the test +CREATE INDEX bitmap5 ON c(bitmap5) USING BTREE; + +INSERT INTO p VALUES(1); +INSERT INTO c(pid) VALUES(1); + + +--connection node_2 +# wait until both INSERTS have arrived in node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM c +--source include/wait_condition.inc + +--connection node_1 +# delete from parent table, it will cascade into child table +# node_2 might have problem in applying this cascaded delete +DELETE FROM p WHERE id=1; + +SELECT * FROM p; +SELECT * FROM c; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM c; +--source include/wait_condition.inc + +--connection node_1 +DROP TABLE c; +DROP TABLE p; diff --git a/mysql-test/suite/galera/t/galera_vote_drop_temporary-master.opt b/mysql-test/suite/galera/t/galera_vote_drop_temporary-master.opt new file mode 100644 index 00000000..beae84b3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_vote_drop_temporary-master.opt @@ -0,0 +1 @@ +--log-bin diff --git a/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf b/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf new file mode 100644 index 00000000..022cfcdc --- /dev/null +++ b/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf @@ -0,0 +1,10 @@ +!include ../galera_4nodes.cnf + +[mysqld] +wsrep-ignore-apply-errors=0 + +[mysqld.3] +auto_increment_offset=3 + +[mysqld.4] +auto_increment_offset=4 diff --git a/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test b/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test new file mode 100644 index 00000000..ca75d33b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test @@ -0,0 +1,96 @@ +# +# Test the case where a node that dropped prior to an inconsistency vote is +# able to rejoin via IST after the vote is complete +# + +--source include/galera_cluster.inc +--source include/big_test.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc +# The following has to be set hard as these connection doesn't yet exists and +# the auto_increment_offset value changes during the lifetime of the servers. +--let $node_3=node_3 +--let $auto_increment_offset_node_3 = 3; +--let $node_4=node_4 +--let $auto_increment_offset_node_4 = 4; + +# Isolate node #3 +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +# Wait for node #3 to leave cluster +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Introduce inconsistency on node #4 +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection node_4 +SET SESSION wsrep_on=OFF; +CREATE TABLE t1 (f1 INTEGER); +SET SESSION wsrep_on=ON; +DROP TABLE t1; + +# Wait for node #4 to be voted out +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +# Do some more stuff on the cluster to add to the IST stream +CREATE TABLE t2 (f1 INTEGER); + +# Rejoin node #3 +--connection node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; +--source include/galera_wait_ready.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that all is good +--connection node_3 +SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; + +# Rejoin node #4 +--connection node_4 +SET SESSION wsrep_on=OFF; +--source include/kill_galera.inc +--sleep 1 +--echo Starting mysqld +--source include/start_mysqld.inc + +--connection node_1 +# Confirm node #4 has rejoined +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that all is good and all nodes have identical data +SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table"); + +--connection node_2 +SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table"); + +--connection node_3 +SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; + +--connection node_4 +SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group. Leaving cluster."); + +DROP TABLE t2; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_vote_rejoin_dml.cnf b/mysql-test/suite/galera/t/galera_vote_rejoin_dml.cnf new file mode 100644 index 00000000..af445b25 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_vote_rejoin_dml.cnf @@ -0,0 +1,7 @@ +!include ../galera_4nodes.cnf + +[mysqld] +wsrep-ignore-apply-errors=0 + +[ENV] +galera_cluster_size=4 diff --git a/mysql-test/suite/galera/t/galera_vote_rejoin_dml.test b/mysql-test/suite/galera/t/galera_vote_rejoin_dml.test new file mode 100644 index 00000000..c170bec1 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_vote_rejoin_dml.test @@ -0,0 +1,99 @@ +# +# Test the case where a node that dropped prior to an inconsistency vote is +# able to rejoin via IST after the vote is complete +# + +--source include/galera_cluster.inc +--source include/big_test.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--let $node_4=node_4 +--source include/auto_increment_offset_save.inc + +# Isolate node #3 +--connection node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +# Wait for node #3 to leave cluster +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(10)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 'A'); + +# Introduce inconsistency on node #4 +--connection node_4 +SET SESSION wsrep_on=OFF; +INSERT INTO t1 VALUES (2, 'B'); +SET SESSION wsrep_on=ON; +DELETE FROM t1 WHERE f1 = 2; + +# Wait for node #4 to be voted out +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Rejoin node #3 +--connection node_3 +--source include/wsrep_wait_disconnect.inc +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; +--source include/galera_wait_ready.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that all is good +--connection node_3 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A'; +SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B'; + +# Rejoin node #4 +--connection node_4 +SET SESSION wsrep_on=OFF; +--source include/kill_galera.inc +--sleep 1 +--echo Starting mysqld +--source include/start_mysqld.inc + +# Confirm node #4 has rejoined +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# Confirm that all is good and all nodes have identical data + +--connection node_1 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A'; +SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B'; +CALL mtr.add_suppression("mariadbd: Can't find record in 't1'"); +CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows"); +CALL mtr.add_suppression("WSREP: Event 3 Delete_rows_v1 apply failed: 120, seqno [0-9]*"); + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A'; +SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B'; +CALL mtr.add_suppression("mariadbd: Can't find record in 't1'"); +CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows"); +CALL mtr.add_suppression("WSREP: Event 3 Delete_rows_v1 apply failed: 120, seqno [0-9]*"); + +--connection node_3 +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A'; +SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B'; + +--connection node_4 +--source include/galera_wait_ready.inc +SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'A'; +SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'B'; +CALL mtr.add_suppression("inconsistent with group"); + +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_wan.cnf b/mysql-test/suite/galera/t/galera_wan.cnf new file mode 100644 index 00000000..0effd594 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan.cnf @@ -0,0 +1,14 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=10M;gmcast.segment=1' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=10M;gmcast.segment=1' + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gcache.size=10M;gmcast.segment=2' + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gcache.size=10M;gmcast.segment=3' + diff --git a/mysql-test/suite/galera/t/galera_wan.test b/mysql-test/suite/galera/t/galera_wan.test new file mode 100644 index 00000000..ca86a300 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan.test @@ -0,0 +1,40 @@ +# +# Test WAN replication and the gmcast.segment functionality. +# The galera_wan.cnf file partitions 4 Galera nodes into 3 WAN segments +# +# We can not test any of the actual WAN optimizations from inside MTR and no +# status variables are provided. So we only check that simple replication works. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CALL mtr.add_suppression("WSREP: Stray state UUID msg:.*"); +CALL mtr.add_suppression("WSREP: Sending JOIN failed:.*"); +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +call mtr.add_suppression("WSREP: Sending JOIN failed:.*"); + + +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc +INSERT INTO t1 VALUES (1); + +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection node_4 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE LIKE '%gmcast.segment = 3%' FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'wsrep_provider_options'; + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera_wan_restart_ist.cnf b/mysql-test/suite/galera/t/galera_wan_restart_ist.cnf new file mode 100644 index 00000000..3f7d2a24 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_ist.cnf @@ -0,0 +1,14 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.segment=1' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.segment=1' + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.segment=2' + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gmcast.segment=2' + diff --git a/mysql-test/suite/galera/t/galera_wan_restart_ist.test b/mysql-test/suite/galera/t/galera_wan_restart_ist.test new file mode 100644 index 00000000..8a011d60 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_ist.test @@ -0,0 +1,207 @@ +# +# Test that even after multiple restarts in a WAN context with two segments, the cluster continues to operate correctly. +# +# We can not easily restart the first node, so instead we restart all the other nodes. MTR does not allow multiple nodes +# to be down at the same time, so restarts are sequential. +# +# We can not test any of the actual WAN optimizations from inside MTR and no +# status variables are provided. So we only check that simple replication works. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/force_restart.inc + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--let $node_4=node_4 +--source include/auto_increment_offset_save.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE AS EXPECT_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +INSERT INTO t1 VALUES (2); + +--connection node_3 +INSERT INTO t1 VALUES (3); + +--connection node_4 +INSERT INTO t1 VALUES (4); + +# +# Restart node #3 +# + +--connection node_3 +INSERT INTO t1 VALUES (13); + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE AS EXPECT_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +INSERT INTO t1 VALUES (11); + +--connection node_2 +INSERT INTO t1 VALUES (12); + +--connection node_4 +INSERT INTO t1 VALUES (14); + +--connection node_3 +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE AS EXPECT_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +INSERT INTO t1 VALUES (131); + +# +# Restart node #2 +# + +--connection node_2 +INSERT INTO t1 VALUES (22); + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE AS EXPECT_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +INSERT INTO t1 VALUES (21); + +--connection node_3 +INSERT INTO t1 VALUES (23); + +--connection node_4 +INSERT INTO t1 VALUES (24); + +--connection node_2 +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE AS EXPECT_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +INSERT INTO t1 VALUES (221); + +# +# Restart node #4 +# + +--connection node_4 +INSERT INTO t1 VALUES (34); + +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE AS EXPECT_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +INSERT INTO t1 VALUES (31); + +--connection node_2 +INSERT INTO t1 VALUES (32); + +--connection node_3 +INSERT INTO t1 VALUES (33); + +--connection node_4 +--source include/start_mysqld.inc +--source include/wait_until_connected_again.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE AS EXPECT_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +INSERT INTO t1 VALUES (341); + + +# +# Check all nodes +# + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 19 FROM t1 +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_19 FROM t1; + +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--let $wait_condition = SELECT COUNT(*) = 19 FROM t1 +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_19 FROM t1; + + +--connection node_3 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--let $wait_condition = SELECT COUNT(*) = 19 FROM t1 +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_19 FROM t1; + +--connection node_4 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--let $wait_condition = SELECT COUNT(*) = 19 FROM t1 +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_19 FROM t1; + + +--connection node_1 +DROP TABLE t1; +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); + +--connection node_2 +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_3 +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_4 +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--connection node_1 +--disconnect node_3 +--disconnect node_4 diff --git a/mysql-test/suite/galera/t/galera_wan_restart_sst.cnf b/mysql-test/suite/galera/t/galera_wan_restart_sst.cnf new file mode 100644 index 00000000..3f7d2a24 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_sst.cnf @@ -0,0 +1,14 @@ +!include ../galera_4nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gmcast.segment=1' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gmcast.segment=1' + +[mysqld.3] +wsrep_provider_options='base_port=@mysqld.3.#galera_port;gmcast.segment=2' + +[mysqld.4] +wsrep_provider_options='base_port=@mysqld.4.#galera_port;gmcast.segment=2' + diff --git a/mysql-test/suite/galera/t/galera_wan_restart_sst.test b/mysql-test/suite/galera/t/galera_wan_restart_sst.test new file mode 100644 index 00000000..0ded4032 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wan_restart_sst.test @@ -0,0 +1,138 @@ +# +# Test that even after multiple restarts in a WAN context with two segments, the cluster continues to operate correctly. +# +# We can not easily restart the first node, so instead we restart all the other nodes. MTR does not allow multiple nodes +# to be down at the same time, so restarts are sequential. +# +# We can not test any of the actual WAN optimizations from inside MTR and no +# status variables are provided. So we only check that simple replication works. +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER); +INSERT INTO t1 VALUES (1); + +--connection node_2 +INSERT INTO t1 VALUES (2); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +INSERT INTO t1 VALUES (3); + +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection node_4 +INSERT INTO t1 VALUES (4); + +# +# Restart node #3 +# + +--connection node_3 +INSERT INTO t1 VALUES (13); + +--source include/kill_galera.inc + +--connection node_1 +INSERT INTO t1 VALUES (11); + +--connection node_2 +INSERT INTO t1 VALUES (12); + +--connection node_4 +INSERT INTO t1 VALUES (14); + +--connection node_3 +--source include/start_mysqld.inc + +INSERT INTO t1 VALUES (131); + +# +# Restart node #2 +# + +--connection node_2 +INSERT INTO t1 VALUES (22); + +--source include/kill_galera.inc + +--connection node_1 +INSERT INTO t1 VALUES (21); + +--connection node_3 +INSERT INTO t1 VALUES (23); + +--connection node_4 +INSERT INTO t1 VALUES (24); + +--connection node_2 +--source include/start_mysqld.inc + +INSERT INTO t1 VALUES (221); + +# +# Restart node #4 +# + +--connection node_4 +INSERT INTO t1 VALUES (34); + +--source include/kill_galera.inc + +--connection node_1 +INSERT INTO t1 VALUES (31); + +--connection node_2 +INSERT INTO t1 VALUES (32); + +--connection node_3 +INSERT INTO t1 VALUES (33); + +--connection node_4 +--source include/start_mysqld.inc + +INSERT INTO t1 VALUES (341); + +# +# Check all nodes +# + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_19 FROM t1; + +--connection node_2 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) AS EXPECT_19 FROM t1; + +--connection node_3 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) AS EXPECT_19 FROM t1; + +--connection node_4 +SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +SELECT COUNT(*) AS EXPECT_19 FROM t1; + +--connection node_1 +DROP TABLE t1; +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("WSREP: gcs_caused\\(\\) returned -1 \\(Operation not permitted\\)"); + +--connection node_2 +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_3 +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); + +--connection node_4 +CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); +CALL mtr.add_suppression("Action message in non-primary configuration from member 0"); diff --git a/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test b/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test new file mode 100644 index 00000000..ecf255f5 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test @@ -0,0 +1,59 @@ +# +# Test the wsrep_desync + wsrep_on method for schema upgrades discussed at +# http://www.slideshare.net/Severalnines/schema-upgrades-codershippresodec2013 , slide 30 +# + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE ten (f1 INTEGER); +INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); + +CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; + +# Insert some values before the ALTER +INSERT INTO t1 (f1) SELECT 000000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +--connection node_2 +SELECT COUNT(*) = 100000 FROM t1; + +SET GLOBAL wsrep_desync = TRUE; +SET SESSION wsrep_on = FALSE; + +ALTER TABLE t1 ADD PRIMARY KEY (f1); + +SET SESSION wsrep_on = TRUE; +SET GLOBAL wsrep_desync = FALSE; + +# Insert even more data after the ALTER has completed +INSERT INTO t1 (f1) SELECT 100000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; + +SELECT COUNT(*) = 200000 FROM t1; +SELECT MAX(f1) = 199999 FROM t1; + +--connection node_1 +SELECT COUNT(*) = 200000 FROM t1; +SELECT MAX(f1) = 199999 FROM t1; + +SET GLOBAL wsrep_desync = TRUE; +SET SESSION wsrep_on = FALSE; + +ALTER TABLE t1 ADD PRIMARY KEY (f1); + +SET SESSION wsrep_on = TRUE; +SET GLOBAL wsrep_desync = FALSE; + +# Insert some conflicting values after the ALTER has been applied on all nodes. + +--connection node_2 +--error ER_DUP_ENTRY +INSERT INTO t1 (f1) VALUES (1); + +--connection node_1 +--error ER_DUP_ENTRY +INSERT INTO t1 (f1) VALUES (100); + +DROP TABLE t1; +DROP TABLE ten; diff --git a/mysql-test/suite/galera/t/galera_wsrep_log_conficts.cnf b/mysql-test/suite/galera/t/galera_wsrep_log_conficts.cnf new file mode 100644 index 00000000..440c37be --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_log_conficts.cnf @@ -0,0 +1,12 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_log_conflicts=ON + +[mysqld.2] +wsrep_log_conflicts=ON + + + + + diff --git a/mysql-test/suite/galera/t/galera_wsrep_log_conficts.test b/mysql-test/suite/galera/t/galera_wsrep_log_conficts.test new file mode 100644 index 00000000..3af08cbf --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_log_conficts.test @@ -0,0 +1,55 @@ +# +# Test --wsrep_log_conflicts=ON +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 ( + f1 VARCHAR(255) PRIMARY KEY +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO t1 VALUES ('abc'); + +--connection node_2 +SELECT f1 = 'abc' FROM t1; + +# +# Provoke a conflict +# + +--connection node_1 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'klm'; + +--connection node_2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +UPDATE t1 SET f1 = 'xyz'; + +--connection node_1 +COMMIT; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $wait_condition = SELECT f1 = 'klm' FROM t1; +--source include/wait_condition.inc + +--connection node_2 +--error ER_LOCK_DEADLOCK +COMMIT; + +# +# We can not really check the log output very much because it is quite variable +# + +--let $assert_file = $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_only_after = CURRENT_TEST + +--let $assert_text = cluster conflict due to high priority abort for threads +--let $assert_select = cluster conflict due to high priority abort for threads +--let $assert_match = cluster conflict due to high priority abort for threads +--source include/assert_grep.inc + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_wsrep_new_cluster-master.opt b/mysql-test/suite/galera/t/galera_wsrep_new_cluster-master.opt new file mode 100644 index 00000000..c31150c4 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_new_cluster-master.opt @@ -0,0 +1 @@ +--wsrep-new-cluster diff --git a/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test b/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test new file mode 100644 index 00000000..84b6c032 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test @@ -0,0 +1,39 @@ +# +# Test the --wsrep-new-cluster option by putting it in the galera_wsrep_new_cluster-master.opt file +# +# In MTR, running two nodes, the result is two separate clusters of size 1 +# + +--source include/galera_cluster.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; +SELECT (VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 ) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; + +--connection node_2 + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected'; +SELECT (VARIABLE_VALUE = 0 OR VARIABLE_VALUE = 1 ) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; diff --git a/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test b/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test new file mode 100644 index 00000000..fe1abcf6 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test @@ -0,0 +1,20 @@ +# +# PXC-318: Typo in wsrep_provider_options causes an unhandled exception +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--let LOGF=$MYSQLTEST_VARDIR/log/mysqld.1.err +--disable_info +call mtr.add_suppression("WSREP\: Unknown parameter 'gmcasts\.segment'"); +call mtr.add_suppression("WSREP\: Set options returned 7"); +--error ER_WRONG_ARGUMENTS +SET GLOBAL wsrep_provider_options="gmcasts.segment=1"; +# Search for unhandled exception message. +perl; + use strict; + my $logf= $ENV{'LOGF'} or die "LOGF not set"; + open(FILE, "$logf") or die("Unable to open $logf: $!\n"); + my $count_warnings=grep(/terminate called after throwing an instance of /gi,); + print "Unhandled exceptions: $count_warnings\n"; + close(FILE); +EOF diff --git a/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test b/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test new file mode 100644 index 00000000..7f91495f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_wsrep_provider_unset_set.test @@ -0,0 +1,50 @@ +# +# Test that wsrep_provider can be unset and then set back to its original value +# and replication will continue except for any updates made while the value was 'none' +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +--let $wsrep_provider_orig = `SELECT @@wsrep_provider` +--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address` + +SET GLOBAL wsrep_provider='none'; +INSERT INTO t1 VALUES (2); + +--connection node_1 +INSERT INTO t1 VALUES (3); + +--connection node_2 +--disable_query_log +--eval SET GLOBAL wsrep_provider = '$wsrep_provider_orig'; +--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; +--enable_query_log + +SET SESSION wsrep_sync_wait = 0; + +--source include/wait_until_connected_again.inc +--source include/galera_wait_ready.inc + +INSERT INTO t1 VALUES (4); + +# Node #2 has all the inserts +SELECT COUNT(*) = 4 FROM t1; + +--connection node_1 +# Node #1 is missing the insert made while Node #2 was not replicated +SELECT COUNT(*) = 3 FROM t1; + +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_zero_length_column.test b/mysql-test/suite/galera/t/galera_zero_length_column.test new file mode 100644 index 00000000..6ae81a83 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_zero_length_column.test @@ -0,0 +1,41 @@ +# +# Test columns with size zero. This is known to have tripped other storage engines. +# Keys are not allowed on such columns +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY , f2 VARCHAR(0)) ENGINE=InnoDB; +CREATE TABLE t2 (f1 VARCHAR(0)) ENGINE=InnoDB; + + +INSERT INTO t1 VALUES (1, NULL); +INSERT INTO t1 VALUES (2, ''); + +INSERT INTO t2 VALUES (NULL); +INSERT INTO t2 VALUES (''); + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; +SELECT f2 IS NULL FROM t1 WHERE f1 = 1; +SELECT f2 = '' FROM t1 WHERE f1 = 2; + +SELECT COUNT(*) = 2 FROM t2; +SELECT f1 IS NULL FROM t2 WHERE f1 IS NULL; +SELECT f1 = '' FROM t2 WHERE f1 IS NOT NULL; + +UPDATE t1 SET f2 = '' WHERE f1 = 1; +UPDATE t1 SET f2 = NULL WHERE f1 = 2; + +UPDATE t2 SET f1 = '' WHERE f1 IS NULL; + +--connection node_1 +SELECT f2 = '' FROM t1 WHERE f1 = 1; +SELECT f2 IS NULL FROM t1 WHERE f1 = 2; + +SELECT COUNT(*) = 2 FROM t2 WHERE f1 = ''; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/grant.test b/mysql-test/suite/galera/t/grant.test new file mode 100644 index 00000000..de1c202c --- /dev/null +++ b/mysql-test/suite/galera/t/grant.test @@ -0,0 +1,25 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV#6266: Changing password fails on galera cluster +--echo # + +--echo +--echo # On node_1 +--connection node_1 +GRANT SELECT ON *.* TO 'user_6266'@'localhost' IDENTIFIED BY 'pass'; +--echo +--echo # Now, try changing password for 'user_6266'. This command should also +--echo # execute successfully on the other node. +SET PASSWORD FOR 'user_6266'@'localhost' = PASSWORD('newpass'); + +--echo +--echo # On node_2 +--connection node_2 +SELECT user FROM mysql.user WHERE user='user_6266'; +# cleanup +DROP USER 'user_6266'@'localhost'; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/lp1276424.test b/mysql-test/suite/galera/t/lp1276424.test new file mode 100644 index 00000000..a37e950b --- /dev/null +++ b/mysql-test/suite/galera/t/lp1276424.test @@ -0,0 +1,17 @@ +# +# LP:1276424 Deadlock with insertion of NULL unique ke +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INT DEFAULT NULL, UNIQUE KEY i1 (f1)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (NULL); +INSERT INTO t1 VALUES (NULL); + +--connection node_2 +SELECT COUNT(*) = 2 FROM t1; +SELECT f1 IS NULL FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/lp1347768.test b/mysql-test/suite/galera/t/lp1347768.test new file mode 100644 index 00000000..ad5f5e9c --- /dev/null +++ b/mysql-test/suite/galera/t/lp1347768.test @@ -0,0 +1,24 @@ +# +# LP:1347768 Assertion failure in file ha_innodb.cc line 6759 +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE `r8kmb_redirect_links` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `old_url` varchar(255) DEFAULT NULL, + `new_url` varchar(255) NOT NULL, + `referer` varchar(150) NOT NULL, + `comment` varchar(255) NOT NULL, + `published` tinyint(4) NOT NULL, + `created_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `modified_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE KEY `idx_link_old` (`old_url`), + KEY `idx_link_modifed` (`modified_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO r8kmb_redirect_links VALUES (550,'http://mysite.com/images/download/ßуñûічýøù_ôþóþòір_þфõÑ.doc','','','',0,'2013-07-15 14:29:42','0000-00-00 00:00:00'); + +DROP TABLE r8kmb_redirect_links; diff --git a/mysql-test/suite/galera/t/lp1376747-2.test b/mysql-test/suite/galera/t/lp1376747-2.test new file mode 100644 index 00000000..c570dd7d --- /dev/null +++ b/mysql-test/suite/galera/t/lp1376747-2.test @@ -0,0 +1,29 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + +FLUSH TABLES t1 FOR EXPORT; + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +INSERT INTO t1 VALUES (2,3); + +--connection node_2 +UNLOCK TABLES; + +--echo ### t1 should have column f2 +SHOW CREATE TABLE t1; +SELECT * from t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/lp1376747-3.test b/mysql-test/suite/galera/t/lp1376747-3.test new file mode 100644 index 00000000..75fe7d27 --- /dev/null +++ b/mysql-test/suite/galera/t/lp1376747-3.test @@ -0,0 +1,28 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +FLUSH TABLE WITH READ LOCK; +--echo ### This shouldn't block. +FLUSH TABLES t1 FOR EXPORT; + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_2 +UNLOCK TABLES; + +--echo ### t1 should have column f2 +SHOW CREATE TABLE t1; + +--connection node_1 +INSERT INTO t1 VALUES (2,3); + +--connection node_2 +SELECT * from t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/lp1376747-4.test b/mysql-test/suite/galera/t/lp1376747-4.test new file mode 100644 index 00000000..724901da --- /dev/null +++ b/mysql-test/suite/galera/t/lp1376747-4.test @@ -0,0 +1,60 @@ +# +# Test Flush tables with read lock along with +# flush tables with read lock for compatibility. +# Also, making sure all DDL and DMLs are propagated +# after provider is unpaused +# +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc + +--connection node_1 +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SET session wsrep_sync_wait=0; +FLUSH TABLES WITH READ LOCK; + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +INSERT INTO t1 VALUES (2,3); + +--connection node_2a +SET session wsrep_sync_wait=0; +SHOW CREATE TABLE t1; +SET debug_sync='flush_tables_with_read_lock_after_acquire_locks SIGNAL parked2 WAIT_FOR go2'; +--send FLUSH TABLES t1 WITH READ LOCK; + +--connection node_2 +SET debug_sync='now WAIT_FOR parked2'; + +# let the flush table wait in pause state before we unlock +# table otherwise there is window where-in flush table is +# yet to wait in pause and unlock allows alter table to proceed. +# this is because send is asynchronous. +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE Info LIKE 'FLUSH TABLES t1 WITH READ LOCK'; +--let $wait_condition_on_error_output = SHOW PROCESSLIST +--source include/wait_condition_with_debug.inc + +SET debug_sync='now SIGNAL go2'; +# this will release existing lock but will not resume +# the cluster as there is new FTRL that is still pausing it. +UNLOCK TABLES; +SHOW CREATE TABLE t1; + +--connection node_2a +--reap +set debug_sync= 'RESET'; +UNLOCK TABLES; + +SET SESSION wsrep_sync_wait = DEFAULT; +SHOW CREATE TABLE t1; +SELECT * from t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/lp1376747.test b/mysql-test/suite/galera/t/lp1376747.test new file mode 100644 index 00000000..7daa5446 --- /dev/null +++ b/mysql-test/suite/galera/t/lp1376747.test @@ -0,0 +1,31 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + +FLUSH TABLES t1 WITH READ LOCK; + +--connection node_1 +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +INSERT INTO t1 VALUES (2,3); + +--sleep 2 + +--connection node_2 +UNLOCK TABLES; + +--echo ### t1 should have column f2 +SHOW CREATE TABLE t1; +SELECT * from t1; + +--connection node_1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/lp1438990.test b/mysql-test/suite/galera/t/lp1438990.test new file mode 100644 index 00000000..5d54c333 --- /dev/null +++ b/mysql-test/suite/galera/t/lp1438990.test @@ -0,0 +1,38 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); + +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); + + +DELIMITER |; + +CREATE PROCEDURE p1 (IN x INT) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK TO event_logging; + INSERT t3 VALUES (x); + END; + SAVEPOINT event_logging; + + INSERT INTO t2 VALUES (x); + + RELEASE SAVEPOINT event_logging; +END| +DELIMITER ;| + + +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); + +DROP PROCEDURE p1; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; diff --git a/mysql-test/suite/galera/t/lp959512.test b/mysql-test/suite/galera/t/lp959512.test new file mode 100644 index 00000000..bcc0db24 --- /dev/null +++ b/mysql-test/suite/galera/t/lp959512.test @@ -0,0 +1,26 @@ +# +# LP#959512 IO cache not reset at trx cleanup if write set was empty Edit +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +DROP TABLE IF EXISTS variable; +DROP TABLE IF EXISTS foo; +CREATE TABLE variable ( + name varchar(128) NOT NULL DEFAULT '' COMMENT 'The name of the variable.', + value longblob NOT NULL COMMENT 'The value of the variable.', + PRIMARY KEY (name) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Named variable/value pairs created by Drupal core or any...'; +CREATE TABLE foo (a int); +INSERT INTO variable (name, value) VALUES ('menu_expanded', 'a:0:{}'); +START TRANSACTION; +SELECT 1 AS expression FROM variable variable + WHERE ( (name = 'menu_expanded') ) FOR UPDATE; +UPDATE variable SET value='a:0:{}' WHERE ( (name = 'menu_expanded') ); +COMMIT; +INSERT INTO foo VALUES (1); +UPDATE foo SET a = 2 WHERE a = 1; + +DROP TABLE foo; +DROP TABLE variable; diff --git a/mysql-test/suite/galera/t/mdev-22543.test b/mysql-test/suite/galera/t/mdev-22543.test new file mode 100644 index 00000000..1e7d3712 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev-22543.test @@ -0,0 +1,58 @@ +# The test verifies that the FLUSH TABLES WITH READ LOCK does not +# time out if it needs to wait for another MDL lock for short duration +# during SST donation. + +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--let $node_1 = node_1 +--let $node_2 = node_2 +--source include/auto_increment_offset_save.inc + +--let $galera_connection_name = node_1_ctrl +--let $galera_server_number = 1 +--source include/galera_connect.inc + +# +# Run UPDATE on node_1 and make it block before table locks are taken. +# This should block FTWRL. +# +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 INT); +INSERT INTO t1 VALUES (1, 1); +SET DEBUG_SYNC = "before_lock_tables_takes_lock SIGNAL sync_point_reached WAIT_FOR sync_point_continue"; +--send UPDATE t1 SET f2 = 2 WHERE f1 = 1 + +--connection node_1_ctrl +SET DEBUG_SYNC = "now WAIT_FOR sync_point_reached"; + +# +# Restart node_2, force SST. +# +--connection node_2 +--source include/shutdown_mysqld.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat +# Restart without waiting. The UPDATE should block FTWRL on node_1, +# so the SST cannot be completed and node_2 cannot join before +# UPDATE connection is signalled to continue. +--exec echo "restart:$start_mysqld_params" > $_expect_file_name +# If the bug is present, FTWRL times out on node_1 in couple of +# seconds and node_2 fails to join. +--sleep 10 + +--connection node_1_ctrl +SET DEBUG_SYNC = "now SIGNAL sync_point_continue"; + +--connection node_1 +--reap +SET DEBUG_SYNC = "RESET"; + +--connection node_2 +--enable_reconnect +--source include/wait_until_connected_again.inc + +--connection node_1 +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/mdev_10518.cnf b/mysql-test/suite/galera/t/mdev_10518.cnf new file mode 100644 index 00000000..482334c2 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_10518.cnf @@ -0,0 +1,17 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin +log-slave-updates + +[mysqld.1] +gtid_domain_id=1 +wsrep_gtid_mode=ON +# Maximum allowed wsrep_gtid_domain_id. +wsrep_gtid_domain_id=4294967295 + +[mysqld.2] +gtid_domain_id=2 +wsrep_gtid_mode=ON +#wsrep_gitd_domain_id value will be inherited from donor node (mysqld.1) +#wsrep_gitd_domain_id=X diff --git a/mysql-test/suite/galera/t/mdev_10518.test b/mysql-test/suite/galera/t/mdev_10518.test new file mode 100644 index 00000000..eec47507 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_10518.test @@ -0,0 +1,64 @@ +# Test for @@wsrep_gtid_mode and @@wsrep_gtid_domain_id variables +# +# When @@wsrep_gtid_mode=ON, all DDL/DML commands and transactions that +# are meant to be replicated over Galera cluster nodes are tagged with +# galera gtid_domain_id (@@wsrep_gtid_domain_id), while others are tagged +# with the local domain_id (@@gtid_domain_id). + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # On node_1 +--connection node_1 +# print initial GTIDs +source include/print_gtid.inc; + +--echo # On node_2 +--connection node_2 +# print initial GTIDs +source include/print_gtid.inc; + +--echo # On node_1 +--connection node_1 +CREATE TABLE t1(i INT) ENGINE=INNODB; +CREATE TABLE t2(i INT) ENGINE=MEMORY; +INSERT INTO t1 VALUES(1); +SELECT * FROM t1; +SELECT * FROM t2; +source include/print_gtid.inc; + +--echo # On node_2 +--connection node_2 +SELECT * FROM t1; +source include/print_gtid.inc; + +--echo # On node_1 +--connection node_1 +INSERT INTO t2 VALUES(1); +SELECT * FROM t2; +source include/print_gtid.inc; + +--echo # On node_2 +--connection node_2 +SELECT * FROM t2; +source include/print_gtid.inc; + +--echo # On node_1 +--connection node_1 +# Cleanup +DROP TABLE t1, t2; + +--echo #cleanup +--connection node_1 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--connection node_2 +set global wsrep_on=OFF; +reset master; +set global wsrep_on=ON; + +--source include/galera_end.inc +--echo # End of test + diff --git a/mysql-test/suite/galera/t/mdev_18730.test b/mysql-test/suite/galera/t/mdev_18730.test new file mode 100644 index 00000000..e32bae68 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_18730.test @@ -0,0 +1,71 @@ +# +# Test scenario: +# +# Run an autocommit INSERT and stop the execution after the INSERT +# has released commit order critical section. On another connection, +# run SR transaction which will store one fragment into streaming log. +# If the bug is present, the fragment streaming log commit may +# out of order, and completing INSERT may cause assertion in debug build. +# +# Note that due to nature of this bug, it is may not be possible +# to construct fully deterministic test case which will crash the +# server each time if the bug is present, but will work with fix. +# + +--source include/galera_cluster.inc +--source include/have_log_bin.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY); + +# Control connection for controlling node_1 debug sync points +--let $galera_connection_name = ctrl +--let $galera_server_number = 1 +--source include/galera_connect.inc + +# Another connection for SR transaction +--let $galera_connection_name = node_1_sr +--let $galera_server_number = 1 +--source include/galera_connect.inc + +# Set up sync point and send INSERT +--connection node_1 +SET DEBUG_SYNC = "wsrep_after_commit_order_leave SIGNAL acol_reached WAIT_FOR acol_continue"; +--send INSERT INTO t1 VALUES (1) + +# Wait until INSERT releases commit order +--connection ctrl +SET DEBUG_SYNC = "now WAIT_FOR acol_reached"; + +# Streaming transaction, will replicate fragment for each row separately. +--connection node_1_sr +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_trx_fragment_unit = 'rows'; +SET SESSION wsrep_trx_fragment_size = 1; + +START TRANSACTION; +--send INSERT INTO t1 VALUES (2) + +--connection ctrl +# Now let the thread node_1 continue after a one second sleep. +# The sleep while not completely deterministic, will allow the SR +# insert to complete the commit out of order in most of the cases if +# the bug is present, leading to assertion in debug build. +--sleep 1 +SET DEBUG_SYNC = "now SIGNAL acol_continue"; + +--connection node_1 +--reap +--connection node_1_sr +--reap +ROLLBACK; + +--connection ctrl +SET DEBUG_SYNC = "RESET"; +--disconnect ctrl +--disconnect node_1_sr + +--connection node_1 +DROP TABLE t1; + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/mdev_21025.test b/mysql-test/suite/galera/t/mdev_21025.test new file mode 100644 index 00000000..5179b063 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_21025.test @@ -0,0 +1,22 @@ +# +# MDEV-21205 +# +# Start transaction after INSERT IGNORE which had no effect and +# kept the transaction open caused an assertion on the following +# START TRANSACTION because the empty transaction was not properly +# terminated. +# + +--source include/galera_cluster.inc +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +START TRANSACTION; +INSERT INTO t1 (f1) VALUES (1); + +START TRANSACTION; +# This INSERT succeeds with duplicate key warning due to IGNORE clause +# and keeps the transaction open. The following START TRANSACTION causes +# an assertion if the bug is present. +INSERT IGNORE INTO t1 (f1) VALUES (1); +START TRANSACTION; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/mdev_21718.cnf b/mysql-test/suite/galera/t/mdev_21718.cnf new file mode 100644 index 00000000..9e066597 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_21718.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes.cnf + +[mysqld] +thread-handling=pool-of-threads diff --git a/mysql-test/suite/galera/t/mdev_21718.test b/mysql-test/suite/galera/t/mdev_21718.test new file mode 100644 index 00000000..3fbc4e77 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_21718.test @@ -0,0 +1,35 @@ +# +# MDEV-21718 Reproduce a case where BF abort after +# client session acquires the ownership but before calls +# before_command() causes an assertion in wsrep-lib. +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +--let $galera_connection_name = node_1_ctrl +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL reached WAIT_FOR continue"; +--send COMMIT + +--connection node_1_ctrl +SET DEBUG_SYNC = "now WAIT_FOR reached"; + +--connection node_2 +INSERT INTO t1 VALUES (1); + +# BF abort wakes up node_1 from sync wait. +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +DROP TABLE t1; +SET DEBUG_SYNC = "RESET"; diff --git a/mysql-test/suite/galera/t/mdev_9290.test b/mysql-test/suite/galera/t/mdev_9290.test new file mode 100644 index 00000000..39e02011 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_9290.test @@ -0,0 +1,24 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-9290 : InnoDB: Assertion failure in file trx0sys.cc line 353 +--echo # InnoDB: Failing assertion: xid_seqno > trx_sys_cur_xid_seqno +--echo # + +--connection node_1 +CREATE TABLE t1 (i INT) ENGINE=InnoDB; + +--connection node_2 +# Note: a multi-statement transaction should always be the "first" one to execute +# on this node. +START TRANSACTION; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +COMMIT; + +--connection node_1 +SELECT * FROM t1; +DROP TABLE t1; + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/mysql-wsrep#110.test b/mysql-test/suite/galera/t/mysql-wsrep#110.test new file mode 100644 index 00000000..43520f25 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#110.test @@ -0,0 +1,51 @@ +# +# codership/mysql-wsrep/110 - Assertion `table_found' failed in unpack_row() with SAVEPOINT, trigger, error handler +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY); +CREATE TABLE t3 (f1 INTEGER PRIMARY KEY); + +CREATE TRIGGER tr1 AFTER INSERT ON t1 FOR EACH ROW CALL p1(NEW.f1); + + +DELIMITER |; + +CREATE PROCEDURE p1 (IN x INT) +BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK TO event_logging; + INSERT t3 VALUES (x); + END; + SAVEPOINT event_logging; + + INSERT INTO t2 VALUES (x); +END| +DELIMITER ;| + + +INSERT INTO t2 VALUES (1); +INSERT INTO t1 VALUES (1); + +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 1 FROM t3; + +--connection node_2 + +SELECT COUNT(*) = 1 FROM t1; +SELECT COUNT(*) = 1 FROM t2; +SELECT COUNT(*) = 1 FROM t3; + +--connection node_1 + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP PROCEDURE p1; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#198.cnf b/mysql-test/suite/galera/t/mysql-wsrep#198.cnf new file mode 100644 index 00000000..d599f394 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#198.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin +wsrep-debug=1 + +[mysqld.1] +log-bin +wsrep-debug=1 diff --git a/mysql-test/suite/galera/t/mysql-wsrep#198.test b/mysql-test/suite/galera/t/mysql-wsrep#198.test new file mode 100644 index 00000000..a8190f2a --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#198.test @@ -0,0 +1,40 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/force_restart.inc + +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; + +--connection node_2 +# Ensure that the tables have been created on node #2 +SELECT 1 FROM DUAL; + +LOCK TABLE t2 WRITE; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--send OPTIMIZE TABLE t1,t2; + +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2b +--send REPAIR TABLE t1,t2; + +--connection node_2 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Waiting for table metadata lock' +--source include/wait_condition.inc + +--connection node_1 +INSERT INTO t2 VALUES (1); + +--connection node_2 +UNLOCK TABLES; + +--connection node_2a +--reap + +--connection node_2b +--reap + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#201.cnf b/mysql-test/suite/galera/t/mysql-wsrep#201.cnf new file mode 100644 index 00000000..4a82e9fa --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#201.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +query_cache_type=1 + +[mysqld.2] +query_cache_type=1 + + diff --git a/mysql-test/suite/galera/t/mysql-wsrep#201.test b/mysql-test/suite/galera/t/mysql-wsrep#201.test new file mode 100644 index 00000000..21cf05db --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#201.test @@ -0,0 +1,32 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_query_cache.inc + +CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (DEFAULT); + +--connection node_2 +--let $qcache_size_orig = `SELECT @@GLOBAL.query_cache_size` +SET GLOBAL query_cache_size=1355776; + +--disable_query_log + +--let $count = 500 +while ($count) +{ + --connection node_1 + INSERT INTO t1 VALUES (DEFAULT); + --let $val1 = `SELECT LAST_INSERT_ID()` + --connection node_2 + --let $val2 = `SELECT MAX(id) FROM t1` + --let $val3 = `SELECT $val1 != $val2` + if ($val3) + { + --echo $val1 $val2 + --die wsrep_sync_wait failed + } + --dec $count +} + +--eval SET GLOBAL query_cache_size = $qcache_size_orig +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#237.test b/mysql-test/suite/galera/t/mysql-wsrep#237.test new file mode 100644 index 00000000..174266bd --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#237.test @@ -0,0 +1,34 @@ +# hang because of replicated FLUSH TABLE command + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +CREATE TABLE t (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET DEBUG_SYNC = 'wsrep_before_certification WAIT_FOR continue'; +--send INSERT INTO t values (1); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: wsrep_before_certification' +--source include/wait_condition.inc + +--connection node_2 +FLUSH TABLES; + + +--connection node_1a +SELECT SLEEP(1); + +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +# Cleanup +DROP TABLE t; +--connection node_1a +SET DEBUG_SYNC= 'RESET'; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#247.test b/mysql-test/suite/galera/t/mysql-wsrep#247.test new file mode 100644 index 00000000..8bcd5860 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#247.test @@ -0,0 +1,23 @@ +# +# codership/mysql-wsrep/247 MW-246 - +# DDL with RSU fails if node is desynced upfont +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 + +SET GLOBAL wsrep_desync=1; + +SET wsrep_OSU_method=RSU; + +CREATE TABLE t1 (i int primary key); + +SHOW VARIABLES LIKE 'wsrep_desync'; + +SET GLOBAL wsrep_desync=0; +--sleep 1 +DROP TABLE t1; +SHOW VARIABLES LIKE 'wsrep_desync'; + diff --git a/mysql-test/suite/galera/t/mysql-wsrep#31.test b/mysql-test/suite/galera/t/mysql-wsrep#31.test new file mode 100644 index 00000000..c669d483 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#31.test @@ -0,0 +1,53 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 + +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +INSERT INTO t1 VALUES('test'); +CREATE DATABASE db; + +--connection node_2 +--let $expected_position_uuid = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_uuid'` +--let $expected_position_seqno = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--let $expected_position = $expected_position_uuid:$expected_position_seqno + +--echo Shutting down server 2 ... +--source include/shutdown_mysqld.inc + +--echo Recovering server 2 ... +--let $galera_wsrep_recover_server_id=2 +--source suite/galera/include/galera_wsrep_recover.inc + +if ($galera_wsrep_start_position != $expected_position) +{ + die(Expected position: $expected_position, found $galera_wsrep_start_position); +} + +--echo Restarting server ... +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +--source include/wait_until_ready.inc + +--connection node_1 +DROP TABLE t1; +DROP DATABASE db; + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/wait_until_connected_again.inc + +# Restore original auto_increment_offset values. +--let $node_2=node_2a +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc + + diff --git a/mysql-test/suite/galera/t/mysql-wsrep#33.cnf b/mysql-test/suite/galera/t/mysql-wsrep#33.cnf new file mode 100644 index 00000000..f1c3d802 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#33.cnf @@ -0,0 +1,8 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' + diff --git a/mysql-test/suite/galera/t/mysql-wsrep#33.test b/mysql-test/suite/galera/t/mysql-wsrep#33.test new file mode 100644 index 00000000..a67336cc --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#33.test @@ -0,0 +1,28 @@ + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source suite/galera/include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_sst_set_mysqldump.inc + +--source suite/galera/include/galera_st_disconnect_slave.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +--connection node_2 + +--source suite/galera/include/auto_increment_offset_restore.inc +--source suite/galera/include/galera_sst_restore.inc + +# We have to manually restore global_log and slow_query_log due to mysql-wsrep#108 +# Otherwise MTR's check_testcases complains + +SET GLOBAL general_log = ON; +SET GLOBAL slow_query_log = ON; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#332.test b/mysql-test/suite/galera/t/mysql-wsrep#332.test new file mode 100644 index 00000000..674a5c3d --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#332.test @@ -0,0 +1,113 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +# Open connection node_1a here, MW-369.inc will use it later +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +# +# Test the scenario where a foreign key is added to an existing child table, and +# concurrently UPDATE the parent table so that it violates the constraint. +# +# We expect that ALTER TABLE ADD FOREIGN KEY adds a table level key on both +# parent and child table. And therefore we also expect the UPDATE to fail +# certification. +# +--connection node_1 +CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER) ENGINE=INNODB; + +INSERT INTO p VALUES (1, 0); +INSERT INTO p VALUES (2, 0); + +INSERT INTO c VALUES (1, 1); +INSERT INTO c VALUES (2, 2); + +--let $mw_369_parent_query = UPDATE p SET f1 = f1 + 100 +--let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id) REFERENCES p(f1) + +--source MW-369.inc + +# Expect certification failure +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p; + + +# +# Same as above, except that two foreign keys pointing to different parent +# tables are added, p1 and p2. Concurrently UPDATE p1. +# +# Expect certification error on UPDATE. +# +--connection node_1 +CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id1 INTEGER, p_id2 INTEGER) ENGINE=INNODB; + +INSERT INTO p1 VALUES (1, 0), (2, 0); +INSERT INTO p2 VALUES (1, 0), (2, 0); + +INSERT INTO c VALUES (1, 1, 1); +INSERT INTO c VALUES (2, 2, 2); + +--let $mw_369_parent_query = UPDATE p1 SET f1 = f1 + 100 +--let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1) + +--source MW-369.inc + +# Expect certification failure +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p1; +SELECT * FROM p2; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p1; +DROP TABLE p2; + + +# +# Same as above, except that UPDATE is on p2. +# +--connection node_1 +CREATE TABLE p1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE p2 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; +CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id1 INTEGER, p_id2 INTEGER) ENGINE=INNODB; + +INSERT INTO p1 VALUES (1, 0), (2, 0); +INSERT INTO p2 VALUES (1, 0), (2, 0); + +INSERT INTO c VALUES (1, 1, 1); +INSERT INTO c VALUES (2, 2, 2); + +--let $mw_369_parent_query = UPDATE p2 SET f1 = f1 + 100 +--let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1) + +--source MW-369.inc + +# Expect certification failure +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +--connection node_2 +SELECT * FROM p1; +SELECT * FROM p2; +SELECT * FROM c; + +DROP TABLE c; +DROP TABLE p1; +DROP TABLE p2; diff --git a/mysql-test/suite/galera/t/mysql-wsrep#90.test b/mysql-test/suite/galera/t/mysql-wsrep#90.test new file mode 100644 index 00000000..11ef6416 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep#90.test @@ -0,0 +1,67 @@ +# Crash in galera_to_execute_end when wsrep_OSU_method is changed from RSU to TOI during a DDL + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_2 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; + +--connection node_1 +DROP TABLE t1; +SET DEBUG_SYNC = 'RESET'; + + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; + +--connection node_1 +SET GLOBAL wsrep_OSU_method = "TOI"; +SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; +--send ALTER TABLE t1 ADD COLUMN f2 INTEGER; + +--connection node_1a +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_before_open_tables' +--source include/wait_condition.inc + +SET GLOBAL wsrep_OSU_method = "RSU"; +SET DEBUG_SYNC= 'now SIGNAL continue'; + +--connection node_1 +--reap + +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +INSERT INTO t1 VALUES (1,2); + +--connection node_2 +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +INSERT INTO t1 VALUES (3,4); + +--connection node_1 +DROP TABLE t1; + +SET GLOBAL WSREP_OSU_METHOD = TOI; +SET DEBUG_SYNC = 'RESET'; diff --git a/mysql-test/suite/galera/t/mysql-wsrep-bugs-607.test b/mysql-test/suite/galera/t/mysql-wsrep-bugs-607.test new file mode 100644 index 00000000..c24ec791 --- /dev/null +++ b/mysql-test/suite/galera/t/mysql-wsrep-bugs-607.test @@ -0,0 +1,70 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc +--source include/have_log_bin.inc + +# +# Test case to stress the order of wsrep XID checkpointing. +# +# In buggy version, the transaction which failed certification can +# rush to record wsrep XID checkpoint before the offending applier, +# causing assert in innodb sys header update routine +# + +--echo # +--echo # test the order of wsrep XID storage after certifiation failure +--echo # + +--connection node_1 +set session wsrep_sync_wait=0; + +create table t1 (i int primary key, j int); + +insert into t1 values (4, 0); + +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2b +set session wsrep_sync_wait=0; +# wait for the last insert to be replicated from node 1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t1; +--source include/wait_condition.inc + +# block applier before applying +SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; + +# send update from node 1, it will pause in the sync point +--connection node_1 +UPDATE test.t1 set j=1 where i=4; + +--connection node_2b +# wait until applier has reached the sync point +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +# look number of cert failures so far, and expect one more to happen +--let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` + +# Inject a conflicting update in node 2, it should fail in certification +--connection node_2 +set session wsrep_sync_wait=0; +set session wsrep_retry_autocommit=0; +--send UPDATE test.t1 SET j=2 WHERE i=4 + +--connection node_2b +# wait until the update has hit certification failure + +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition.inc + +# release the applier +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; + +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "RESET"; + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap +select * from t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/partition.test b/mysql-test/suite/galera/t/partition.test new file mode 100644 index 00000000..13e09a4e --- /dev/null +++ b/mysql-test/suite/galera/t/partition.test @@ -0,0 +1,221 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_partition.inc + +--echo # +--echo # MDEV#4953 Galera: DELETE from a partitioned table is not replicated +--echo # + +USE test; +CREATE TABLE t1 (pk INT PRIMARY KEY, i INT) ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2; +INSERT INTO t1 VALUES (1,100), (2,200); +SELECT * FROM t1; + +DELETE FROM t1; +SELECT * FROM t1; + +--echo +--echo # On node_1 +--connection node_1 +SELECT * FROM t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM t1; + +# Cleanup +DROP TABLE t1; + + +--echo # +--echo # MDEV#7501 : alter table exchange partition is not replicated in +--echo # galera cluster +--echo # + +--echo +--echo # On node_1 +--connection node_1 + +CREATE TABLE test.t1 ( + i INT UNSIGNED NOT NULL AUTO_INCREMENT, + PRIMARY KEY (i) + ) ENGINE=INNODB + PARTITION BY RANGE (i) + (PARTITION p1 VALUES LESS THAN (10) ENGINE = INNODB, + PARTITION p2 VALUES LESS THAN (20) ENGINE = INNODB, + PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = INNODB); + +INSERT INTO test.t1 (i) VALUE (9),(19); +CREATE TABLE test.p1 LIKE test.t1; +ALTER TABLE test.p1 REMOVE PARTITIONING; + +ALTER TABLE test.t1 EXCHANGE PARTITION p1 WITH TABLE test.p1; +SELECT * FROM test.t1; +SELECT * FROM test.p1; + +--echo +--echo # On node_2 +--connection node_2 + +SHOW CREATE TABLE t1; +SHOW CREATE TABLE p1; + +SELECT * FROM test.t1; +SELECT * FROM test.p1; + +--echo +--echo # On node_1 +--connection node_1 +ALTER TABLE t1 TRUNCATE PARTITION p2; +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + +--echo +--echo # On node_1 +--connection node_1 +ALTER TABLE t1 DROP PARTITION p2; +SHOW CREATE TABLE t1; + +--echo +--echo # On node_2 +--connection node_2 +SHOW CREATE TABLE t1; + + +# Cleanup +DROP TABLE t1, p1; + +--echo # +--echo # MDEV-5146: Bulk loads into partitioned table not working +--echo # + +# Create 2 files with 20002 & 101 entries in each. +--perl +open(FILE, ">", "$ENV{'MYSQLTEST_VARDIR'}/tmp/mdev-5146-1.dat") or die; +foreach my $i (1..20002) { + print FILE "$i\n"; +} + +open(FILE, ">", "$ENV{'MYSQLTEST_VARDIR'}/tmp/mdev-5146-2.dat") or die; +foreach my $i (1..101) { + print FILE "$i\n"; +} +EOF + +--connection node_1 + +--let $wsrep_load_data_splitting_orig = `SELECT @@wsrep_load_data_splitting` + +--echo # Case 1: wsrep_load_data_splitting = ON & LOAD DATA with 20002 +--echo # entries. + +SET GLOBAL wsrep_load_data_splitting = ON; + +CREATE TABLE t1 (pk INT PRIMARY KEY) + ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2; + +# Record wsrep_last_committed as it was before LOAD DATA +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--disable_query_log +--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/mdev-5146-1.dat' INTO TABLE t1; +--enable_query_log + +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 20002 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; + +# LOAD-ing 20002 rows causes +# 3 commits to be registered when the Galera library does not support streaming replication and +# 5 commits to be registered when the Galera library supports streaming replication +--disable_query_log +--replace_result 3 AS_EXPECTED_3_or_5 5 AS_EXPECTED_3_or_5 +--eval SELECT $wsrep_last_committed_after - $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +DROP TABLE t1; + +--echo # Case 2: wsrep_load_data_splitting = ON & LOAD DATA with 101 entries. + +--connection node_1 + +SET GLOBAL wsrep_load_data_splitting = ON; + +CREATE TABLE t1 (pk INT PRIMARY KEY) + ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2; + +# Record wsrep_last_committed as it was before LOAD DATA +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--disable_query_log +--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/mdev-5146-2.dat' INTO TABLE t1; +--enable_query_log + +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 101 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; + +# LOAD-ing 101 rows causes 1 commit to be registered +--disable_query_log +--eval SELECT $wsrep_last_committed_after - $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +DROP TABLE t1; + +--echo # Case 3: wsrep_load_data_splitting = OFF & LOAD DATA with 20002 +--echo # entries. + +--connection node_1 + +SET GLOBAL wsrep_load_data_splitting = OFF; + +CREATE TABLE t1 (pk INT PRIMARY KEY) + ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2; + +# Record wsrep_last_committed as it was before LOAD DATA +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--disable_query_log +--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/mdev-5146-1.dat' INTO TABLE t1; +--enable_query_log + +--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 20002 FROM t1; +--source include/wait_condition.inc +SELECT COUNT(*) FROM t1; + +# LOAD-ing 20002 rows causes +# 1 commit to be registered when the Galera library does not support streaming replication and +# 2 commits to be registered when the Galera library supports streaming replication +--disable_query_log +--replace_result 1 AS_EXPECTED_1_or_2 2 AS_EXPECTED_1_or_2 +--eval SELECT $wsrep_last_committed_after - $wsrep_last_committed_before AS wsrep_last_committed_diff; +--enable_query_log + +DROP TABLE t1; + +--connection node_1 +# Restore the original value +--eval SET GLOBAL wsrep_load_data_splitting = $wsrep_load_data_splitting_orig; + +# Cleanup +remove_file '$MYSQLTEST_VARDIR/tmp/mdev-5146-1.dat'; +remove_file '$MYSQLTEST_VARDIR/tmp/mdev-5146-2.dat'; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/pxc-421.test b/mysql-test/suite/galera/t/pxc-421.test new file mode 100644 index 00000000..33a2b157 --- /dev/null +++ b/mysql-test/suite/galera/t/pxc-421.test @@ -0,0 +1,67 @@ +# +# PXC-421: Test deadlock involving updates of +# wsrep_provider, wsrep_cluster_address and wsrep_slave_threads. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_1 +--let $wsrep_slave_1 = `SELECT @@wsrep_slave_threads` +set GLOBAL wsrep_slave_threads=26; +CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 (f1) SELECT * from t1 as x1; + +--connection node_2 +--let $wsrep_slave_2 = `SELECT @@wsrep_slave_threads` +set GLOBAL wsrep_slave_threads=16; +--let $wsrep_provider_orig = `SELECT @@wsrep_provider` +--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address` + +SET GLOBAL wsrep_provider='none'; +INSERT INTO t1 VALUES (2); + +--connection node_1 +INSERT INTO t1 VALUES (3); + +--connection node_2 +--disable_query_log +--eval SET GLOBAL wsrep_provider = '$wsrep_provider_orig'; +--eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; +--enable_query_log + +--source include/wait_until_connected_again.inc + +INSERT INTO t1 VALUES (4); +set GLOBAL wsrep_slave_threads=5; + +# Node #2 has all the inserts +SELECT COUNT(*) = 5 FROM t1; + +--connection node_1 +set GLOBAL wsrep_slave_threads=12; +# Node #1 is missing the insert made while Node #2 was not replicated +SELECT COUNT(*) = 4 FROM t1; +INSERT INTO t1 VALUES (100), (101), (102); + +--connection node_2 +set GLOBAL wsrep_slave_threads=5; +INSERT INTO t1 (f1) SELECT * from t1 as x1; +show global variables like 'wsrep_slave_threads'; +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_2 +SELECT COUNT(*) FROM t1; + +--connection node_1 +SELECT COUNT(*) FROM t1; +show global variables like 'wsrep_slave_threads'; +--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_1 +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc + diff --git a/mysql-test/suite/galera/t/query_cache.cnf b/mysql-test/suite/galera/t/query_cache.cnf new file mode 100644 index 00000000..4a82e9fa --- /dev/null +++ b/mysql-test/suite/galera/t/query_cache.cnf @@ -0,0 +1,9 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +query_cache_type=1 + +[mysqld.2] +query_cache_type=1 + + diff --git a/mysql-test/suite/galera/t/query_cache.test b/mysql-test/suite/galera/t/query_cache.test new file mode 100644 index 00000000..aeec67fb --- /dev/null +++ b/mysql-test/suite/galera/t/query_cache.test @@ -0,0 +1,1112 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_query_cache.inc + +--echo +--echo # Execute FLUSH/RESET commands. +--echo # On node-1 +--connection node_1 +SET @query_cache_size_saved=@@GLOBAL.query_cache_size; +SET @query_cache_type_saved=@@GLOBAL.query_cache_type; +set GLOBAL query_cache_size=1355776; +flush query cache; # This crashed in some versions +reset query cache; +flush status; + +--echo # On node-2 +--connection node_2 +SET @query_cache_size_saved=@@GLOBAL.query_cache_size; +SET @query_cache_type_saved=@@GLOBAL.query_cache_type; +set GLOBAL query_cache_size=1355776; +flush query cache; # This crashed in some versions +reset query cache; +flush status; + +# +# INSERT/UPDATE/DELETE/DROP/SELECT +# + +--echo # On node-1 +--connection node_1 +create table t1 (a int not null) engine=innodb; +insert into t1 values (1),(2),(3); +select * from t1; +select * from t1; +select sql_no_cache * from t1; +select length(now()) from t1; + +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 + +select * from t1; +select * from t1; +select sql_no_cache * from t1; +select length(now()) from t1; + +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; + +# DELETE should invalidate cache on both the nodes. +--echo # On node-1 +--connection node_1 +delete from t1 where a=1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +# Add a SELECT to the cache. +--echo # On node-1 +--connection node_1 +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +# UPDATE should invalidate cache on both the nodes. +--echo # On node-1 +--connection node_1 +update t1 set a=1 where a=3; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +# Add a SELECT to the cache. +--echo # On node-1 +--connection node_1 +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +# DROP should invalidate cache on both the nodes. +--echo # On node-1 +--connection node_1 +drop table t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# MERGE TABLES with INSERT/UPDATE and DELETE +# +--echo +--echo # On node-1 +--connection node_1 +create table t1 (a int not null) ENGINE=MyISAM; +insert into t1 values (1),(2),(3); +create table t2 (a int not null) ENGINE=MyISAM; +insert into t2 values (4),(5),(6); +create table t3 (a int not null) engine=MERGE UNION=(t1,t2) INSERT_METHOD=FIRST; +# insert +select * from t3; +select * from t3; +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +insert into t2 values (7); +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t1; +select * from t1; +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +insert into t3 values (8); +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +# update +select * from t3; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +update t2 set a=9 where a=7; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +update t3 set a=10 where a=1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +#delete +select * from t3; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +delete from t2 where a=9; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +delete from t3 where a=10; +select * from t3; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +# MERGE table, expect no records. +select * from t3; +select * from t3; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; + +drop table t1, t2, t3; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# SELECT SQL_CACHE ... +# +--echo # On node-1 +--connection node_1 +set query_cache_type=demand; +create table t1 (a int not null) engine=innodb; +insert into t1 values (1),(2),(3); +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select sql_cache * from t1 union select * from t1; +set query_cache_type=2; +select sql_cache * from t1 union select * from t1; +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; +set query_cache_type=on; + +--echo # On node-2 +--connection node_2 +set query_cache_type=demand; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select sql_cache * from t1 union select * from t1; +set query_cache_type=2; +select sql_cache * from t1 union select * from t1; +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; +set query_cache_type=on; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# SELECT SQL_NO_CACHE +# +--echo # On node-1 +--connection node_1 +select sql_no_cache * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +--echo # On node-2 +--connection node_2 +select sql_no_cache * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Check that queries that uses NOW(), LAST_INSERT_ID()... are not cached. +# +--echo # On node-1 +--connection node_1 +create table t1 (a text not null) engine=innodb; +select CONNECTION_ID() from t1; +select FOUND_ROWS(); +select NOW() from t1; +select CURDATE() from t1; +select CURTIME() from t1; +select DATABASE() from t1; +select ENCRYPT("test") from t1; +select LAST_INSERT_ID() from t1; +select RAND() from t1; +select UNIX_TIMESTAMP() from t1; +select USER() from t1; +select CURRENT_USER() from t1; +select benchmark(1,1) from t1; +explain extended select benchmark(1,1) from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +--echo # On node-2 +--connection node_2 +select CONNECTION_ID() from t1; +select FOUND_ROWS(); +select NOW() from t1; +select CURDATE() from t1; +select CURTIME() from t1; +select DATABASE() from t1; +select ENCRYPT("test") from t1; +select LAST_INSERT_ID() from t1; +select RAND() from t1; +select UNIX_TIMESTAMP() from t1; +select USER() from t1; +select CURRENT_USER() from t1; +select benchmark(1,1) from t1; +explain extended select benchmark(1,1) from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Non-cachable ODBC work around (and prepare cache for drop database) +# +--echo # On node-1 +--connection node_1 +create database mysqltest; +create table mysqltest.t1 (i int not null auto_increment, a int, primary key + (i)) engine=innodb; +insert into mysqltest.t1 values (1, 1); +select * from mysqltest.t1 where i is null; +create table t1(a int) engine=innodb; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from mysqltest.t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from mysqltest.t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +# +# drop db +# +drop database mysqltest; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Charset conversion (cp1251_koi8 always present) +# Note: Queries using different default character sets are cached separately. +# +--echo # On node-1 +--connection node_1 +create table t1 (a char(1) not null collate koi8r_general_ci) engine=innodb; +insert into t1 values(_koi8r 0xc3); +set CHARACTER SET koi8r; +select * from t1; +set CHARACTER SET cp1251_koi8; +select * from t1; +set CHARACTER SET DEFAULT; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +set CHARACTER SET koi8r; +select * from t1; +set CHARACTER SET cp1251_koi8; +select * from t1; +set CHARACTER SET DEFAULT; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Same tables in different dbs +# +--echo # On node-1 +--connection node_1 +create database if not exists mysqltest; +create table mysqltest.t1 (i int not null) engine=innodb; +create table t1 (i int not null) engine=innodb; +insert into mysqltest.t1 (i) values (1); +insert into t1 (i) values (2); + +select * from t1; +use mysqltest; +select * from t1; +select * from t1; +use test; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select * from t1; +use mysqltest; +select * from t1; +select * from t1; +use test; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop database mysqltest; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# FOUND_ROWS() +# +--echo # On node-1 +--connection node_1 +create table t1 (i int not null) engine=innodb; +insert into t1 (i) values (1),(2),(3),(4); + +select SQL_CALC_FOUND_ROWS * from t1 limit 2; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +select * from t1 where i=1; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +select SQL_CALC_FOUND_ROWS * from t1 limit 2; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +select * from t1 where i=1; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +--echo # On node-2 +--connection node_2 +select SQL_CALC_FOUND_ROWS * from t1 limit 2; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +select * from t1 where i=1; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +select SQL_CALC_FOUND_ROWS * from t1 limit 2; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +select * from t1 where i=1; +select FOUND_ROWS(); +show status like "Qcache_hits"; +show status like "Qcache_queries_in_cache"; + +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Test insert delayed (MYISAM) +# + +--echo # On node-2 +--connection node_2 +flush query cache; +reset query cache; + +--echo # On node-1 +--connection node_1 +flush query cache; +reset query cache; + +create table t1 (a int not null) ENGINE=MYISAM; +insert into t1 values (1),(2),(3); +select * from t1; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +insert delayed into t1 values (4); +--sleep 5 # Wait for insert delayed to be executed. +select a from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select * from t1; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +insert delayed into t1 values (4); +--sleep 5 # Wait for insert delayed to be executed. +select a from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +drop table t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-1 +--connection node_1 +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; + +# +# Test of min result data unit size changing +# +--echo # On node-2 +--connection node_2 +show global variables like "query_cache_min_res_unit"; +set GLOBAL query_cache_min_res_unit=1001; +show global variables like "query_cache_min_res_unit"; + +--echo # On node-1 +--connection node_1 +show global variables like "query_cache_min_res_unit"; +set GLOBAL query_cache_min_res_unit=1001; +show global variables like "query_cache_min_res_unit"; +create table t1 (a int not null) engine=innodb; +insert into t1 values (1),(2),(3); +create table t2 (a int not null) engine=innodb; +insert into t2 values (1),(2),(3); +select * from t1; +select * from t1; +select * from t2; +select * from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; + +--echo # On node-2 +--connection node_2 +select * from t1; +select * from t1; +select * from t2; +select * from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop table t1; +select a from t2; +select a from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +set GLOBAL query_cache_min_res_unit=default; +show global variables like "query_cache_min_res_unit"; + +--echo # On node-1 +--connection node_1 +select a from t2; +select a from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +drop table t2; +set GLOBAL query_cache_min_res_unit=default; +show global variables like "query_cache_min_res_unit"; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Case sensitive test +# +--echo # On node-1 +--connection node_1 +create table t1 (a int not null) engine=innodb; +insert into t1 values (1); +select "aaa" from t1; +select "AAA" from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; + +--echo # On node-2 +--connection node_2 +select "aaa" from t1; +select "AAA" from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Test of query cache resizing +# +--echo # On node-1 +--connection node_1 +create table t1 (a int) engine=innodb; +set GLOBAL query_cache_size=1000; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=1024; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=10240; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=20480; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=40960; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=51200; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=61440; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=81920; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=102400; +show global variables like "query_cache_size"; +select * from t1; + +--echo # On node-2 +--connection node_2 +set GLOBAL query_cache_size=1000; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=1024; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=10240; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=20480; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=40960; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=51200; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=61440; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=81920; +show global variables like "query_cache_size"; +select * from t1; +set GLOBAL query_cache_size=102400; +show global variables like "query_cache_size"; +select * from t1; + +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Temporary tables (ignored by Galera) +# +--echo # On node-1 +--connection node_1 +set GLOBAL query_cache_size=1048576; +create table t1 (i int not null) engine=innodb; +create table t2 (i int not null) engine=innodb; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +create temporary table t3 (i int not null); +select * from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t3; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +update t1 set i=(select distinct 1 from (select * from t2) a); +drop table t3; + +--echo # On node-2 +--connection node_2 +set GLOBAL query_cache_size=1048576; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +drop table t1, t2; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# System databse test (no need to perform it on node_2) +# Note: Queries on system tables are not cached. +# +--echo # On node-1 +--connection node_1 +use mysql; +disable_result_log; +select * from db; +enable_result_log; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +use test; +disable_result_log; +select * from mysql.db; +enable_result_log; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +# +# Simple rename test +# +--echo # On node-1 +--connection node_1 +create table t1(id int auto_increment primary key) engine=innodb; +insert into t1 values (1), (2), (3); +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-1 +--connection node_1 +alter table t1 rename to t2; +--error ER_NO_SUCH_TABLE +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +--error ER_NO_SUCH_TABLE +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +drop table t2; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Load data invalidation test +# +--echo # On node-1 +--connection node_1 +create table t1 (word char(20) not null) engine=innodb; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval load data infile '$MYSQLTEST_VARDIR/std_data/words.dat' into table t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +--let $wait_condition = SELECT COUNT(*) = 70 FROM t1; +--source include/wait_condition.inc + +--echo # On node-2 +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 70 FROM t1; +--source include/wait_condition.inc +select count(*) from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval load data infile '$MYSQLTEST_VARDIR/std_data/words.dat' into table t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select count(*) from t1; + +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +--echo # +--echo # INTO OUTFILE/DUMPFILE test +--echo # +--echo # On node-1 +--connection node_1 +create table t1 (a int) engine=innodb; +insert into t1 values (1),(2),(3); +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t1 into outfile "query_cache.out.file"; +--error ER_FILE_EXISTS_ERROR +select * from t1 into outfile "query_cache.out.file"; +select * from t1 limit 1 into dumpfile "query_cache.dump.file"; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +drop table t1; +let $datadir=`select @@datadir`; +--remove_file $datadir/test/query_cache.dump.file +--remove_file $datadir/test/query_cache.out.file + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +--echo # +--echo # Test of SQL_SELECT_LIMIT +--echo # +--echo # On node-1 +--connection node_1 +create table t1 (a int) engine=innodb; +insert into t1 values (1),(2); +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t1; +SET SQL_SELECT_LIMIT=1; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +SET SQL_SELECT_LIMIT=DEFAULT; + +--echo # On node-2 +--connection node_2 +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +select * from t1; +SET SQL_SELECT_LIMIT=1; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +SET SQL_SELECT_LIMIT=DEFAULT; + +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +--echo # +--echo # WRITE LOCK & QC +--echo # +--echo # On node-1 +--connection node_1 +create table t1 (a int not null) engine=innodb; +create table t2 (a int not null) engine=innodb; + +set query_cache_wlock_invalidate=1; +create view v1 as select * from t1; +select * from t1; +select * from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +lock table t1 write, t2 read; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +unlock table; +select * from t1; +# Implicit locking of t1 does not invalidate QC +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +lock table v1 write; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +unlock table; +drop view v1; +set query_cache_wlock_invalidate=default; + +--echo # On node-2 +--connection node_2 +set query_cache_wlock_invalidate=1; +create view v1 as select * from t1; +select * from t1; +select * from t2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +lock table t1 write, t2 read; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +unlock table; +select * from t1; +# Implicit locking of t1 does not invalidate QC +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +lock table v1 write; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +unlock table; +drop view v1; +set query_cache_wlock_invalidate=default; + +drop table t1,t2; + +--echo # +--echo # Hiding real table stored in query cache by temporary table +--echo # +--echo # On node-1 +--connection node_1 +create table t1 (id int primary key) engine=innodb; +insert into t1 values (1),(2),(3); +select * from t1; +create temporary table t1 (a int not null auto_increment primary key); +select * from t1; +drop table t1; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +# +# Test character set related variables: +# character_set_result +# character_set_client +# charactet_set_connection/collation_connection +# If at least one of the above variables has changed, +# the cached query can't be reused. In the below test +# absolutely the same query is used several times, +# SELECT should fetch different results for every instance. +# No hits should be produced. +# New cache entry should appear for every SELECT. +# + +--echo # On node-1 +--connection node_1 +SET NAMES koi8r; +CREATE TABLE t1 (a char(1) character set koi8r) engine=innodb; +INSERT INTO t1 VALUES (_koi8r 0xc3),(_koi8r 0xc3); +# +# Run select +# +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +# +# Change collation_connection and run the same query again +# +set collation_connection=koi8r_bin; +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +# +# Now change character_set_client and run the same query again +# +set character_set_client=cp1251; +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +# +# And finally change character_set_results and run the same query again +# +set character_set_results=cp1251; +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +SET NAMES default; + +--echo # On node-2 +--connection node_2 + +--echo # +--echo # Run select +--echo # + +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +# +# Change collation_connection and run the same query again +# +set collation_connection=koi8r_bin; +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +# +# Now change character_set_client and run the same query again +# +set character_set_client=cp1251; +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; +# +# And finally change character_set_results and run the same query again +# +set character_set_results=cp1251; +SELECT a,'Â','â'='Â' FROM t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +show status like "Qcache_inserts"; + +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +--echo # +--echo # Comments before command +--echo # + +--echo # On node-1 +--connection node_1 +create table t1 (a int) engine=innodb; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +/**/ select * from t1; +/**/ select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; +/**/ select * from t1; +/**/ select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_hits"; + +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +--echo # +--echo # Information schema & query cache test +--echo # + +--echo # On node-1 +--connection node_1 +set session query_cache_type = 2; +create table t1(a int) engine=innodb; +select table_name from information_schema.tables +where table_schema="test"; +drop table t1; +select table_name from information_schema.tables +where table_schema="test"; +# Bug #8480: REPAIR TABLE needs to flush the table from the query cache +set session query_cache_type = 1; +set global query_cache_size=1024*1024; +flush query cache; +create table t1 ( a int ) engine=myisam; # myisam for repair tables +insert into t1 values (1); +select a from t1; +select a from t1; +show status like 'qcache_queries_in_cache'; +show status like "Qcache_hits"; +repair table t1; +show status like 'qcache_queries_in_cache'; +show status like "Qcache_hits"; + +--echo # On node-2 +--connection node_2 +select a from t1; +select a from t1; +show status like 'qcache_queries_in_cache'; +show status like "Qcache_hits"; +repair table t1; +show status like 'qcache_queries_in_cache'; +show status like "Qcache_hits"; +drop table t1; + +# +# RESET QUERY CACHE +# +--source include/reset_query_cache.inc + +--echo # Restore original settings. +--echo # On node-1 +--connection node_1 +SET GLOBAL query_cache_size=@query_cache_size_saved; +SET GLOBAL query_cache_type=@query_cache_type_saved; +--echo +--echo # On node-2 +--connection node_2 +SET GLOBAL query_cache_size=@query_cache_size_saved; +SET GLOBAL query_cache_type=@query_cache_type_saved; + +--echo # End of test diff --git a/mysql-test/suite/galera/t/rename.test b/mysql-test/suite/galera/t/rename.test new file mode 100644 index 00000000..326d64d3 --- /dev/null +++ b/mysql-test/suite/galera/t/rename.test @@ -0,0 +1,53 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-8598 : Failed MySQL DDL commands and Galera replication +--echo # +--echo # On node 1 +--connection node_1 +USE test; +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +--enable_warnings + +CREATE TABLE t1(i INT) ENGINE=INNODB; +INSERT INTO t1 VALUE(1); +SELECT * FROM t1; + +--echo # Create a new user 'foo' with limited privileges +CREATE USER foo@localhost; +GRANT SELECT on test.* TO foo@localhost; + +--echo # Open connection to the 1st node using 'test_user1' user. +--let $port_1= \$NODE_MYPORT_1 +--connect(foo_node_1,localhost,foo,,test,$port_1,) + +--connection foo_node_1 +SELECT * FROM t1; +--echo # Following RENAME should not replicate to other node. +--error ER_TABLEACCESS_DENIED_ERROR +RENAME TABLE t1 TO t2; + +--echo # On node 2 +--connection node_2 +USE test; +SELECT * FROM t1; + +--echo # On node_1 +--connection node_1 +RENAME TABLE t1 TO t2; +SHOW TABLES; + +--echo # On node 2 +--connection node_2 +USE test; +SELECT * FROM t2; + +# Cleanup +--connection node_1 +DROP USER foo@localhost; +DROP TABLE t2; + +--echo # End of tests + diff --git a/mysql-test/suite/galera/t/rpl_row_annotate.cnf b/mysql-test/suite/galera/t/rpl_row_annotate.cnf new file mode 100644 index 00000000..1f1d83df --- /dev/null +++ b/mysql-test/suite/galera/t/rpl_row_annotate.cnf @@ -0,0 +1,6 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin +log-slave-updates +binlog-annotate-row-events=ON diff --git a/mysql-test/suite/galera/t/rpl_row_annotate.test b/mysql-test/suite/galera/t/rpl_row_annotate.test new file mode 100644 index 00000000..0ec30829 --- /dev/null +++ b/mysql-test/suite/galera/t/rpl_row_annotate.test @@ -0,0 +1,45 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # On node_2 +--connection node_2 +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; + +--echo # On node_1 +--connection node_1 +SET GLOBAL wsrep_on=OFF; +RESET MASTER; +SET GLOBAL wsrep_on=ON; +CREATE TABLE t1(i INT)ENGINE=INNODB; +INSERT INTO t1 VALUES(1); +DELETE FROM t1 WHERE i = 1; + +--echo # On node_2 +--connection node_2 +INSERT INTO t1 VALUES(2); +DELETE FROM t1 WHERE i = 2; + +--echo # On node_1 +--connection node_1 +--source include/binlog_start_pos.inc +let $start_pos= `select @binlog_start_pos`; +--replace_column 2 # 5 # +--replace_result $start_pos +--replace_regex /table_id: [0-9]+/table_id: #/ /\/\* xid=.* \*\//\/* xid= *\// +--eval SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM $start_pos + +--echo # On node_2 +--connection node_2 +--source include/binlog_start_pos.inc +let $start_pos= `select @binlog_start_pos`; +--replace_column 2 # 5 # +--replace_result $start_pos +--replace_regex /table_id: [0-9]+/table_id: #/ /\/\* xid=.* \*\//\/* xid= *\// +--eval SHOW BINLOG EVENTS IN 'mysqld-bin.000001' FROM $start_pos + +# Cleanup +DROP TABLE t1; + +--echo # End of test diff --git a/mysql-test/suite/galera/t/sql_log_bin.test b/mysql-test/suite/galera/t/sql_log_bin.test new file mode 100644 index 00000000..9f8f7c84 --- /dev/null +++ b/mysql-test/suite/galera/t/sql_log_bin.test @@ -0,0 +1,56 @@ +# Test to check the behavior of galera cluster with sql_log_bin=ON|OFF & binary +# logging is disabled. sql_bin_log should not affect galera replication. +# +# The following bugfixes are tested: +# +# MDEV-9510: Segmentation fault in binlog thread. +# A scenario otherwise causing a similar segfault is replayed. +# The test must pass having no crashes. +# The sequence of sql statements is provided by original +# sql_log_bin.test augmented with a FLUSH BINLOG LOGS, below. + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo +--echo # On node_1 +--connection node_1 + +USE test; +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t1 VALUES (1); + +--echo # Disable binary logging for current session +SET SQL_LOG_BIN=OFF; +INSERT INTO t1 VALUES (2); + +# MDEV-9510: the following binlog rotation due to FLUSH segfaults wo/ the fixes +FLUSH BINARY LOGS; + +CREATE TABLE t2(c1 INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t2 VALUES (1); +CREATE TABLE test.t3 AS SELECT * from t1; + +--echo # Enable binary logging for current session +SET SQL_LOG_BIN=ON; +INSERT INTO t2 VALUES (2); +CREATE TABLE t4 AS SELECT * from t2; +SELECT * FROM t1; +SELECT * FROM t2; +SELECT * FROM t3; +SELECT * FROM t4; + +--echo +--echo # On node_2 +--connection node_2 +USE test; +SELECT * FROM t1; +SELECT * FROM t2; +SELECT * FROM t3; +SELECT * FROM t4; + +# Cleanup +DROP TABLE t1, t2, t3, t4; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/unique_key.test b/mysql-test/suite/galera/t/unique_key.test new file mode 100644 index 00000000..00b85d57 --- /dev/null +++ b/mysql-test/suite/galera/t/unique_key.test @@ -0,0 +1,54 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV#5552 Deadlock when inserting NULL column value in column with +--echo # UNIQUE index +--echo # + +USE test; +--echo +--echo # On node_1 +--connection node_1 +CREATE TABLE t1(c1 INT DEFAULT NULL, UNIQUE KEY c1(c1)) ENGINE=INNODB; +INSERT INTO t1 VALUES (NULL); +INSERT INTO t1 VALUES (NULL); +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + + +--echo +--echo # On node_1 +--connection node_1 +INSERT INTO t1 VALUES (1); +UPDATE t1 SET c1=NULL WHERE c1=1; +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + +--echo +--echo # On node_1 +--connection node_1 +DELETE FROM t1 WHERE c1<=>NULL; +SELECT * FROM test.t1; + +--echo +--echo # On node_2 +--connection node_2 +SELECT * FROM test.t1; + +--let $galera_diff_statement = SELECT * FROM t1 +--source include/galera_diff.inc + +# Cleanup +DROP TABLE t1; + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/versioning_trx_id.cnf b/mysql-test/suite/galera/t/versioning_trx_id.cnf new file mode 100644 index 00000000..f7aecd36 --- /dev/null +++ b/mysql-test/suite/galera/t/versioning_trx_id.cnf @@ -0,0 +1 @@ +!include ../galera_4nodes.cnf diff --git a/mysql-test/suite/galera/t/versioning_trx_id.test b/mysql-test/suite/galera/t/versioning_trx_id.test new file mode 100644 index 00000000..017379c3 --- /dev/null +++ b/mysql-test/suite/galera/t/versioning_trx_id.test @@ -0,0 +1,42 @@ +--source include/galera_cluster.inc + +call mtr.add_suppression("Sending JOIN failed:.*"); + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +--connection node_1 +create table t1 (a int, s bigint unsigned as row start, e bigint unsigned as row end, period for system_time(s,e)) engine=InnoDB with system versioning; +insert into t1 (a) values (1),(2); + +--connection node_2 +set session wsrep_sync_wait=15; +insert into t1 (a) values (3),(4); +select a from t1; +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp`) { + select * from mysql.transaction_registry; +} +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; + +--connection node_3 +set session wsrep_sync_wait=15; +insert into t1 (a) values (5),(6); +select a from t1; +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp`) { + select * from mysql.transaction_registry; +} +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; + +--connection node_1 +set session wsrep_sync_wait=15; +select a from t1; +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp`) { + select * from mysql.transaction_registry; +} +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; + +drop table t1; + +--disconnect node_3 diff --git a/mysql-test/suite/galera/t/view.test b/mysql-test/suite/galera/t/view.test new file mode 100644 index 00000000..fa2cd8b2 --- /dev/null +++ b/mysql-test/suite/galera/t/view.test @@ -0,0 +1,50 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-7222: Cluster Node Crash at CREATE DEFINER statement +--echo # +USE test; +CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1; +DROP VIEW v1; + +--echo # +--echo # MDEV-8464 : ALTER VIEW not replicated in some cases +--echo # +--echo # On node_1 +--connection node_1 +USE test; +CREATE TABLE t1(i INT) ENGINE=INNODB; +CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT * FROM t1; +CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t1; +CREATE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t1; +CREATE ALGORITHM=UNDEFINED DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM t1; + +--echo # On node_2 +--connection node_2 +USE test; +SHOW CREATE VIEW v1; +SHOW CREATE VIEW v2; +SHOW CREATE VIEW v3; +SHOW CREATE VIEW v4; + +--echo # On node_1 +--connection node_1 +ALTER ALGORITHM=MERGE VIEW v1 AS SELECT * FROM t1; +ALTER ALGORITHM=UNDEFINED VIEW v2 AS SELECT * FROM t1; +ALTER DEFINER=CURRENT_USER VIEW v3 AS SELECT * FROM t1; +ALTER ALGORITHM=TEMPTABLE DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM t1; + +--echo # On node_2 +--connection node_2 +SHOW CREATE VIEW v1; +SHOW CREATE VIEW v2; +SHOW CREATE VIEW v3; +SHOW CREATE VIEW v4; + +--echo # Cleanup +DROP VIEW v1, v2, v3, v4; +DROP TABLE t1; + +--echo # End of tests + diff --git a/mysql-test/suite/galera/t/wsrep_strict_ddl.test b/mysql-test/suite/galera/t/wsrep_strict_ddl.test new file mode 100644 index 00000000..c0a0cd75 --- /dev/null +++ b/mysql-test/suite/galera/t/wsrep_strict_ddl.test @@ -0,0 +1,133 @@ +--source include/galera_cluster.inc + +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); + +--connection node_1 +SET GLOBAL binlog_format='ROW'; +create table before_t1(a int, count int, b int, key(b)) engine=Aria; +INSERT INTO before_t1 values (1,1,1); + +set @@global.wsrep_strict_ddl=ON; +select @@global.wsrep_strict_ddl; + +--connection node_2 +set @@global.wsrep_strict_ddl=ON; +select @@global.wsrep_strict_ddl; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +CREATE TABLE t1(a int) engine=Aria; +SHOW WARNINGS; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +--connection node_1 +CREATE TABLE t2(a int not null primary key) engine=InnoDB; + +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +ALTER TABLE t2 engine=MyISAM; +SHOW WARNINGS; +SHOW CREATE TABLE t2; + +--connection node_2 +SHOW CREATE TABLE t2; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +TRUNCATE TABLE before_t1; +SELECT * FROM before_t1; + +--connection node_2 +SET SESSION wsrep_sync_wait=15; +SELECT @@wsrep_sync_wait; +SELECT * FROM before_t1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +CREATE VIEW x1 AS SELECT * FROM before_t1; +--error ER_NO_SUCH_TABLE +SHOW CREATE VIEW x1; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SHOW CREATE VIEW x1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +CREATE DEFINER=`root`@`localhost` TRIGGER increment_before_t1 + AFTER INSERT ON before_t1 FOR EACH ROW + UPDATE before_t1 SET before_t1.count = before_t1.count+1; + +--error ER_TRG_DOES_NOT_EXIST +SHOW CREATE TRIGGER increment_before_t1; + +--connection node_2 + +--error ER_TRG_DOES_NOT_EXIST +SHOW CREATE TRIGGER increment_before_t1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +CREATE INDEX xx2 ON before_t1(a); +SHOW CREATE TABLE before_t1; + +--connection node_2 +SHOW CREATE TABLE before_t1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +DROP INDEX b ON before_t1; +SHOW CREATE TABLE before_t1; + +--connection node_2 +SHOW CREATE TABLE before_t1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +ALTER TABLE before_t1 ADD COLUMN f int; +SHOW CREATE TABLE before_t1; + +--connection node_2 +SHOW CREATE TABLE before_t1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +RENAME TABLE before_t1 to after_t1; +SHOW CREATE TABLE before_t1; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE after_t1; + +--connection node_2 +SHOW CREATE TABLE before_t1; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE after_t1; + +--connection node_1 +--error ER_GALERA_REPLICATION_NOT_SUPPORTED +DROP TABLE before_t1; + +SHOW CREATE TABLE before_t1; + +--connection node_2 +SHOW CREATE TABLE before_t1; + +# +# PROCEDURE, EVENT, FUNCTION +# Unfortunately accessed tables are opened only +# in SP execution so no hope at CREATE + +# +# USER, ROLE, SERVER, DATABASE not really storage engine objects +# + +--connection node_1 +set @@global.wsrep_strict_ddl=OFF; +select @@global.wsrep_strict_ddl; + +--connectIon node_2 +set @@global.wsrep_strict_ddl=OFF; +select @@global.wsrep_strict_ddl; +DROP TABLE t2; +DROP TABLE before_t1; diff --git a/mysql-test/suite/galera/t/wsrep_trx_fragment_size_sr.test b/mysql-test/suite/galera/t/wsrep_trx_fragment_size_sr.test new file mode 100644 index 00000000..a970cc09 --- /dev/null +++ b/mysql-test/suite/galera/t/wsrep_trx_fragment_size_sr.test @@ -0,0 +1,22 @@ +-- source include/galera_cluster.inc + +-- let $sr = `SELECT variable_value LIKE '%:STREAMING:%' FROM information_schema.session_status WHERE variable_name = 'wsrep_provider_capabilities'` + +if (!$sr) +{ + -- skip The test requires a wsrep provider that supports streaming replication. +} + +SELECT variable_value FROM information_schema.session_variables +WHERE variable_name = 'wsrep_trx_fragment_size'; + +SET SESSION wsrep_trx_fragment_size = 0; +SET SESSION wsrep_trx_fragment_size = 123; + +SELECT variable_value FROM information_schema.global_variables +WHERE variable_name = 'wsrep_trx_fragment_size'; + +SET GLOBAL wsrep_trx_fragment_size = 0; +SET GLOBAL wsrep_trx_fragment_size = 123; + +SET GLOBAL wsrep_trx_fragment_size = default; -- cgit v1.2.3