[CP] fix proxy cap not sync when changing user

This commit is contained in:
obdev 2023-09-22 10:13:55 +00:00 committed by ob-robot
parent 8c12503083
commit 4f995347ac
5 changed files with 36 additions and 26 deletions

View File

@ -607,5 +607,29 @@ int ObMPBase::process_extra_info(sql::ObSQLSessionInfo &session,
return ret;
}
int ObMPBase::update_charset_sys_vars(ObSMConnection &conn, ObSQLSessionInfo &sess_info)
{
int ret = OB_SUCCESS;
int64_t cs_type = conn.client_cs_type_;
const int64_t LATIN1_CS = 8;
//background: mysqltest give a default connect_charset=latin1
// but for history reason, oceanbase use utf8 as
// default charset for mysqltest
//TODO: after obclient&mysqltest support default charset = utf8
// login for cs_type != LATIN1_CS would be deleted
if (ObCharset::is_valid_collation(cs_type)) {
if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CLIENT, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
} else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_RESULTS, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
} else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CONNECTION, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
} else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_COLLATION_CONNECTION, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
}
}
return ret;
}
} // namespace observer
} // namespace oceanbase

View File

@ -110,6 +110,7 @@ protected:
bool need_flush_buffer() const;
int update_transmission_checksum_flag(const sql::ObSQLSessionInfo &session);
int update_proxy_sys_vars(sql::ObSQLSessionInfo &session);
int update_charset_sys_vars(ObSMConnection &conn, sql::ObSQLSessionInfo &sess_info);
int build_encode_param_(obmysql::ObProtoEncodeParam &param,
obmysql::ObMySQLPacket *pkt, const bool is_last);

View File

@ -276,9 +276,13 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session)
int ret = OB_SUCCESS;
ObSchemaGetterGuard schema_guard;
ObSMConnection *conn = NULL;
if (OB_ISNULL(session) || OB_ISNULL(gctx_.schema_service_)) {
ret = OB_INVALID_ARGUMENT;
OB_LOG(WARN,"invalid argument", K(session), K(gctx_.schema_service_));
} else if (OB_ISNULL(conn = get_conn())) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("null conn", K(ret));
} else if (OB_FAIL(gctx_.schema_service_->get_tenant_schema_guard(
session->get_effective_tenant_id(), schema_guard))) {
OB_LOG(WARN,"fail get schema guard", K(ret));
@ -308,8 +312,7 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session)
login_info.client_ip_ = session->get_client_ip();
OB_LOG(INFO, "com change user", "username", login_info.user_name_,
"tenant name", login_info.tenant_name_);
const ObSMConnection &conn = *get_conn();
login_info.scramble_str_.assign_ptr(conn.scramble_buf_, sizeof(conn.scramble_buf_));
login_info.scramble_str_.assign_ptr(conn->scramble_buf_, sizeof(conn->scramble_buf_));
login_info.passwd_ = auth_response_;
}
@ -354,6 +357,12 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session)
session->get_database_name(),
db_id))) {
OB_LOG(WARN, "failed to get database id", K(ret));
} else if (OB_FAIL(update_transmission_checksum_flag(*session))) {
LOG_WARN("update transmisson checksum flag failed", K(ret));
} else if (OB_FAIL(update_proxy_sys_vars(*session))) {
LOG_WARN("update_proxy_sys_vars failed", K(ret));
} else if (OB_FAIL(update_charset_sys_vars(*conn, *session))) {
LOG_WARN("fail to update charset sys vars", K(ret));
} else {
session->set_database_id(db_id);
session->reset_user_var();

View File

@ -2147,26 +2147,3 @@ int ObMPConnect::set_client_version(ObSMConnection &conn)
return ret;
}
int ObMPConnect::update_charset_sys_vars(ObSMConnection &conn, ObSQLSessionInfo &sess_info)
{
int ret = OB_SUCCESS;
int64_t cs_type = conn.client_cs_type_;
const int64_t LATIN1_CS = 8;
//background: mysqltest give a default connect_charset=latin1
// but for history reason, oceanbase use utf8 as
// default charset for mysqltest
//TODO: after obclient&mysqltest support default charset = utf8
// login for cs_type != LATIN1_CS would be deleted
if (ObCharset::is_valid_collation(cs_type)) {
if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CLIENT, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
} else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_RESULTS, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
} else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CONNECTION, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
} else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_COLLATION_CONNECTION, cs_type))) {
SQL_ENG_LOG(WARN, "failed to update sys var", K(ret));
}
}
return ret;
}

View File

@ -123,7 +123,6 @@ private:
int set_proxy_version(ObSMConnection &conn);
int set_client_version(ObSMConnection &conn);
int update_charset_sys_vars(ObSMConnection &conn, sql::ObSQLSessionInfo &sess_info);
private:
DISALLOW_COPY_AND_ASSIGN(ObMPConnect);
obmysql::OMPKHandshakeResponse hsr_;