Commit 4d33f9dc authored by Nirbhay Choubey's avatar Nirbhay Choubey

Merge branch '5.5-galera' into 10.0-galera

parents eac8e435 13615c5e
......@@ -17,6 +17,9 @@ set -e
set -u
${DEBIAN_SCRIPT_DEBUG:+ set -v -x}
# Prevent Debian's init scripts from calling systemctl
_SYSTEMCTL_SKIP_REDIRECT=true
test -x /usr/sbin/mysqld || exit 0
. /lib/lsb/init-functions
......@@ -179,8 +182,15 @@ case "${1:-''}" in
fi
;;
'bootstrap')
# Bootstrap the cluster, start the first node
# that initiates the cluster
log_daemon_msg "Bootstrapping the cluster" "mysqld"
$SELF start "${@:2}" --wsrep-new-cluster
;;
*)
echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
echo "Usage: $SELF start|stop|restart|reload|force-reload|status|bootstrap"
exit 1
;;
esac
......
......@@ -4,5 +4,15 @@ INSERT INTO t1 VALUES (1);
SELECT COUNT(*) = 1 FROM t1;
COUNT(*) = 1
1
CREATE USER foo@localhost;
# Open connection to node 2 using 'foo' user.
# Connect with foo_node_2
INSERT INTO t1 VALUES (2);
ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement
SELECT COUNT(*) = 1 FROM t1;
COUNT(*) = 1
1
SET GLOBAL read_only=FALSE;
DROP TABLE t1;
DROP USER foo@localhost;
......@@ -17,7 +17,23 @@ INSERT INTO t1 VALUES (1);
--connection node_2
SELECT COUNT(*) = 1 FROM t1;
SET GLOBAL read_only=FALSE;
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;
......@@ -104,6 +104,7 @@ void init_alloc_root(MEM_ROOT *mem_root, size_t block_size,
void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
size_t pre_alloc_size __attribute__((unused)))
{
DBUG_ENTER("reset_root_defaults");
DBUG_ASSERT(alloc_root_inited(mem_root));
mem_root->block_size= (((block_size - ALLOC_ROOT_MIN_BLOCK_SIZE) & ~1) |
......@@ -126,7 +127,7 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
{
/* We found a suitable block, no need to do anything else */
mem_root->pre_alloc= mem;
return;
DBUG_VOID_RETURN;
}
if (mem->left + ALIGN_SIZE(sizeof(USED_MEM)) == mem->size)
{
......@@ -156,6 +157,8 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
else
#endif
mem_root->pre_alloc= 0;
DBUG_VOID_RETURN;
}
......
......@@ -5104,6 +5104,39 @@ static int init_server_components()
}
plugins_are_initialized= TRUE; /* Don't separate from init function */
#ifdef WITH_WSREP
/* Wait for wsrep threads to get created. */
if (wsrep_creating_startup_threads == 1) {
mysql_mutex_lock(&LOCK_thread_count);
while (wsrep_running_threads < 2)
{
mysql_cond_wait(&COND_thread_count, &LOCK_thread_count);
}
/* Now is the time to initialize threads for queries. */
THD *tmp;
I_List_iterator<THD> it(threads);
while ((tmp= it++))
{
if (tmp->wsrep_applier == true)
{
/*
Set THR_THD to temporally point to this THD to register all the
variables that allocates memory for this THD.
*/
THD *current_thd_saved= current_thd;
set_current_thd(tmp);
tmp->init_for_queries();
/* Restore current_thd. */
set_current_thd(current_thd_saved);
}
}
mysql_mutex_unlock(&LOCK_thread_count);
}
#endif
/* we do want to exit if there are any other unknown options */
if (remaining_argc > 1)
{
......@@ -5340,16 +5373,11 @@ pthread_handler_t start_wsrep_THD(void *arg)
THD *thd;
wsrep_thd_processor_fun processor= (wsrep_thd_processor_fun)arg;
if (my_thread_init())
if (my_thread_init() || (!(thd= new THD(true))))
{
WSREP_ERROR("Could not initialize thread");
return(NULL);
goto error;
}
if (!(thd= new THD(true)))
{
return(NULL);
}
mysql_mutex_lock(&LOCK_thread_count);
thd->thread_id=thread_id++;
......@@ -5374,13 +5402,13 @@ pthread_handler_t start_wsrep_THD(void *arg)
mysql_thread_set_psi_id(thd->thread_id);
thd->thr_create_utime= microsecond_interval_timer();
if (MYSQL_CALLBACK_ELSE(thread_scheduler, init_new_connection_thread, (), 0))
{
close_connection(thd, ER_OUT_OF_RESOURCES);
statistic_increment(aborted_connects,&LOCK_status);
MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0));
return(NULL);
goto error;
}
// </5.1.17>
......@@ -5403,8 +5431,7 @@ pthread_handler_t start_wsrep_THD(void *arg)
statistic_increment(aborted_connects,&LOCK_status);
MYSQL_CALLBACK(thread_scheduler, end_thread, (thd, 0));
delete thd;
return(NULL);
goto error;
}
thd->system_thread= SYSTEM_THREAD_SLAVE_SQL;
......@@ -5414,12 +5441,21 @@ pthread_handler_t start_wsrep_THD(void *arg)
//thd->version= refresh_version;
thd->proc_info= 0;
thd->set_command(COM_SLEEP);
thd->set_time();
if (wsrep_creating_startup_threads == 0)
{
thd->init_for_queries();
}
mysql_mutex_lock(&LOCK_thread_count);
wsrep_running_threads++;
mysql_cond_broadcast(&COND_thread_count);
if (wsrep_running_threads > 2)
{
wsrep_creating_startup_threads= 0;
}
mysql_mutex_unlock(&LOCK_thread_count);
processor(thd);
......@@ -5457,6 +5493,15 @@ pthread_handler_t start_wsrep_THD(void *arg)
mysql_mutex_unlock(&LOCK_thread_count);
}
return(NULL);
error:
WSREP_ERROR("Failed to create/initialize system thread");
/* Abort if its the first applier/rollbacker thread. */
if (wsrep_creating_startup_threads < 2)
unireg_abort(1);
else
return NULL;
}
/**/
......
......@@ -1199,22 +1199,6 @@ static my_bool deny_updates_if_read_only_option(THD *thd,
}
#ifdef WITH_WSREP
static my_bool wsrep_read_only_option(THD *thd, TABLE_LIST *all_tables)
{
int opt_readonly_saved = opt_readonly;
ulong flag_saved = (ulong)(thd->security_ctx->master_access & SUPER_ACL);
opt_readonly = 0;
thd->security_ctx->master_access &= ~SUPER_ACL;
my_bool ret = !deny_updates_if_read_only_option(thd, all_tables);
opt_readonly = opt_readonly_saved;
thd->security_ctx->master_access |= flag_saved;
return ret;
}
static void wsrep_copy_query(THD *thd)
{
thd->wsrep_retry_command = thd->get_command();
......@@ -1228,6 +1212,7 @@ static void wsrep_copy_query(THD *thd)
thd->wsrep_retry_query[thd->wsrep_retry_query_len] = '\0';
}
#endif /* WITH_WSREP */
/**
Perform one connection-level (COM_XXXX) command.
......@@ -6989,8 +6974,7 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
bool is_autocommit=
!thd->in_multi_stmt_transaction_mode() &&
thd->wsrep_conflict_state == NO_CONFLICT &&
!thd->wsrep_applier &&
wsrep_read_only_option(thd, thd->lex->query_tables);
!thd->wsrep_applier;
do
{
......
......@@ -71,6 +71,13 @@ my_bool wsrep_restart_slave_activated = 0; // node has dropped, and slave
// restart will be needed
my_bool wsrep_slave_UK_checks = 0; // slave thread does UK checks
my_bool wsrep_slave_FK_checks = 0; // slave thread does FK checks
/*
Set during the creation of first wsrep applier and rollback threads.
Since these threads are critical, abort if the thread creation fails.
*/
my_bool wsrep_creating_startup_threads = 0;
/*
* End configuration options
*/
......@@ -671,6 +678,7 @@ void wsrep_init_startup (bool first)
if (!wsrep_start_replication()) unireg_abort(1);
wsrep_creating_startup_threads= 1;
wsrep_create_rollbacker();
wsrep_create_appliers(1);
......
......@@ -107,6 +107,7 @@ extern my_bool wsrep_restart_slave_activated;
extern my_bool wsrep_slave_FK_checks;
extern my_bool wsrep_slave_UK_checks;
extern bool wsrep_new_cluster; // bootstrap the cluster ?
extern my_bool wsrep_creating_startup_threads;
enum enum_wsrep_OSU_method {
WSREP_OSU_TOI,
......
......@@ -25,6 +25,14 @@
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO
# Prevent OpenSUSE's init scripts from calling systemd, so that
# both 'bootstrap' and 'start' are handled entirely within this
# script
SYSTEMD_NO_WRAP=1
# Prevent Debian's init scripts from calling systemctl
_SYSTEMCTL_SKIP_REDIRECT=true
# If you install MySQL on some other places than @prefix@, then you
# have to do one of the following things for this script to work:
#
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment