mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.4 into 10.5
This commit is contained in:
@@ -702,49 +702,30 @@ err:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define WSREP_SST_AUTH_ENV "WSREP_SST_OPT_AUTH"
|
||||
#define WSREP_SST_AUTH_ENV "WSREP_SST_OPT_AUTH"
|
||||
#define WSREP_SST_REMOTE_AUTH_ENV "WSREP_SST_OPT_REMOTE_AUTH"
|
||||
#define DATA_HOME_DIR_ENV "INNODB_DATA_HOME_DIR"
|
||||
|
||||
static int sst_append_auth_env(wsp::env& env, const char* sst_auth)
|
||||
static int sst_append_env_var(wsp::env& env,
|
||||
const char* const var,
|
||||
const char* const val)
|
||||
{
|
||||
int const sst_auth_size= strlen(WSREP_SST_AUTH_ENV) + 1 /* = */
|
||||
+ (sst_auth ? strlen(sst_auth) : 0) + 1 /* \0 */;
|
||||
int const env_str_size= strlen(var) + 1 /* = */
|
||||
+ (val ? strlen(val) : 0) + 1 /* \0 */;
|
||||
|
||||
wsp::string sst_auth_str(sst_auth_size); // for automatic cleanup on return
|
||||
if (!sst_auth_str()) return -ENOMEM;
|
||||
wsp::string env_str(env_str_size); // for automatic cleanup on return
|
||||
if (!env_str()) return -ENOMEM;
|
||||
|
||||
int ret= snprintf(sst_auth_str(), sst_auth_size, "%s=%s",
|
||||
WSREP_SST_AUTH_ENV, sst_auth ? sst_auth : "");
|
||||
int ret= snprintf(env_str(), env_str_size, "%s=%s", var, val ? val : "");
|
||||
|
||||
if (ret < 0 || ret >= sst_auth_size)
|
||||
if (ret < 0 || ret >= env_str_size)
|
||||
{
|
||||
WSREP_ERROR("sst_append_auth_env(): snprintf() failed: %d", ret);
|
||||
WSREP_ERROR("sst_append_env_var(): snprintf(%s=%s) failed: %d",
|
||||
var, val, ret);
|
||||
return (ret < 0 ? ret : -EMSGSIZE);
|
||||
}
|
||||
|
||||
env.append(sst_auth_str());
|
||||
return -env.error();
|
||||
}
|
||||
|
||||
#define DATA_HOME_DIR_ENV "INNODB_DATA_HOME_DIR"
|
||||
|
||||
static int sst_append_data_dir(wsp::env& env, const char* data_dir)
|
||||
{
|
||||
int const data_dir_size= strlen(DATA_HOME_DIR_ENV) + 1 /* = */
|
||||
+ (data_dir ? strlen(data_dir) : 0) + 1 /* \0 */;
|
||||
|
||||
wsp::string data_dir_str(data_dir_size); // for automatic cleanup on return
|
||||
if (!data_dir_str()) return -ENOMEM;
|
||||
|
||||
int ret= snprintf(data_dir_str(), data_dir_size, "%s=%s",
|
||||
DATA_HOME_DIR_ENV, data_dir ? data_dir : "");
|
||||
|
||||
if (ret < 0 || ret >= data_dir_size)
|
||||
{
|
||||
WSREP_ERROR("sst_append_data_dir(): snprintf() failed: %d", ret);
|
||||
return (ret < 0 ? ret : -EMSGSIZE);
|
||||
}
|
||||
|
||||
env.append(data_dir_str());
|
||||
env.append(env_str());
|
||||
return -env.error();
|
||||
}
|
||||
|
||||
@@ -1155,7 +1136,7 @@ static ssize_t sst_prepare_other (const char* method,
|
||||
return -env.error();
|
||||
}
|
||||
|
||||
if ((ret= sst_append_auth_env(env, sst_auth)))
|
||||
if ((ret= sst_append_env_var(env, WSREP_SST_AUTH_ENV, sst_auth)))
|
||||
{
|
||||
WSREP_ERROR("sst_prepare_other(): appending auth failed: %d", ret);
|
||||
return ret;
|
||||
@@ -1163,7 +1144,7 @@ static ssize_t sst_prepare_other (const char* method,
|
||||
|
||||
if (data_home_dir)
|
||||
{
|
||||
if ((ret= sst_append_data_dir(env, data_home_dir)))
|
||||
if ((ret= sst_append_env_var(env, DATA_HOME_DIR_ENV, data_home_dir)))
|
||||
{
|
||||
WSREP_ERROR("sst_prepare_other(): appending data "
|
||||
"directory failed: %d", ret);
|
||||
@@ -1375,7 +1356,7 @@ std::string wsrep_sst_prepare()
|
||||
|
||||
const char* method_ptr(ret.data());
|
||||
const char* addr_ptr(ret.data() + strlen(method_ptr) + 1);
|
||||
WSREP_INFO ("Prepared SST request: %s|%s", method_ptr, addr_ptr);
|
||||
WSREP_DEBUG("Prepared SST request: %s|%s", method_ptr, addr_ptr);
|
||||
|
||||
if (addr_out != addr_in) /* malloc'ed */ free ((char*)addr_out);
|
||||
|
||||
@@ -1872,6 +1853,7 @@ static int sst_donate_other (const char* method,
|
||||
"wsrep_sst_%s "
|
||||
WSREP_SST_OPT_ROLE " 'donor' "
|
||||
WSREP_SST_OPT_ADDR " '%s' "
|
||||
WSREP_SST_OPT_LPORT " '%u' "
|
||||
WSREP_SST_OPT_SOCKET " '%s' "
|
||||
WSREP_SST_OPT_DATA " '%s' "
|
||||
"%s"
|
||||
@@ -1880,7 +1862,8 @@ static int sst_donate_other (const char* method,
|
||||
"%s"
|
||||
"%s"
|
||||
"%s",
|
||||
method, addr, mysqld_unix_port, mysql_real_data_home,
|
||||
method, addr, mysqld_port, mysqld_unix_port,
|
||||
mysql_real_data_home,
|
||||
wsrep_defaults_file,
|
||||
uuid_oss.str().c_str(), gtid.seqno().get(), wsrep_gtid_server.domain_id,
|
||||
binlog_opt_val, binlog_index_opt_val,
|
||||
@@ -1969,7 +1952,21 @@ int wsrep_sst_donate(const std::string& msg,
|
||||
|
||||
const char* data= method + method_len + 1;
|
||||
|
||||
if (check_request_str(data, address_char))
|
||||
/* check for auth@addr separator */
|
||||
const char* addr= strrchr(data, '@');
|
||||
wsp::string remote_auth;
|
||||
if (addr)
|
||||
{
|
||||
remote_auth.set(strndup(data, addr - data));
|
||||
addr++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// no auth part
|
||||
addr= data;
|
||||
}
|
||||
|
||||
if (check_request_str(addr, address_char))
|
||||
{
|
||||
WSREP_ERROR("Bad SST address string. SST canceled.");
|
||||
return WSREP_CB_FAILURE;
|
||||
@@ -1983,15 +1980,25 @@ int wsrep_sst_donate(const std::string& msg,
|
||||
}
|
||||
|
||||
int ret;
|
||||
if ((ret= sst_append_auth_env(env, sst_auth_real)))
|
||||
if ((ret= sst_append_env_var(env, WSREP_SST_AUTH_ENV, sst_auth_real)))
|
||||
{
|
||||
WSREP_ERROR("wsrep_sst_donate_cb(): appending auth env failed: %d", ret);
|
||||
return WSREP_CB_FAILURE;
|
||||
}
|
||||
|
||||
if (remote_auth())
|
||||
{
|
||||
if ((ret= sst_append_env_var(env, WSREP_SST_REMOTE_AUTH_ENV,remote_auth())))
|
||||
{
|
||||
WSREP_ERROR("wsrep_sst_donate_cb(): appending remote auth env failed: "
|
||||
"%d", ret);
|
||||
return WSREP_CB_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
if (data_home_dir)
|
||||
{
|
||||
if ((ret= sst_append_data_dir(env, data_home_dir)))
|
||||
if ((ret= sst_append_env_var(env, DATA_HOME_DIR_ENV, data_home_dir)))
|
||||
{
|
||||
WSREP_ERROR("wsrep_sst_donate_cb(): appending data "
|
||||
"directory failed: %d", ret);
|
||||
|
Reference in New Issue
Block a user