oceanbase

Форк
0
/
obmp_reset_connection.cpp 
116 строк · 4.2 Кб
1
/**
2
 * Copyright (c) 2021 OceanBase
3
 * OceanBase CE is licensed under Mulan PubL v2.
4
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
5
 * You may obtain a copy of Mulan PubL v2 at:
6
 *          http://license.coscl.org.cn/MulanPubL-2.0
7
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
 * See the Mulan PubL v2 for more details.
11
 */
12

13
#define USING_LOG_PREFIX SERVER
14
#include "observer/mysql/obmp_reset_connection.h"
15
#include "rpc/obmysql/obsm_struct.h"
16
#include "observer/mysql/ob_mysql_end_trans_cb.h"
17
#include "lib/string/ob_sql_string.h"
18
#include "rpc/obmysql/ob_mysql_util.h"
19
#include "rpc/obmysql/packet/ompk_ok.h"
20
//#include "share/schema/ob_schema_getter_guard.h"
21
//#include "share/schema/ob_schema_getter_guard.h"
22
#include "share/schema/ob_schema_struct.h"
23
#include "share/schema/ob_multi_version_schema_service.h"
24
#include "sql/ob_sql.h"
25
#include "sql/ob_end_trans_callback.h"
26
#include "sql/session/ob_sql_session_mgr.h"
27
#include "sql/session/ob_sql_session_info.h"
28
#include "sql/parser/ob_parser.h"
29
#include "sql/parser/ob_parser_utils.h"
30

31

32
using namespace oceanbase::common;
33
using namespace oceanbase::rpc;
34
using namespace oceanbase::obmysql;
35
using namespace oceanbase::share::schema;
36
namespace oceanbase
37
{
38
namespace observer
39
{
40

41
int ObMPResetConnection::process()
42
{
43
  int ret = OB_SUCCESS;
44
  bool need_disconnect = false;
45
  ObSQLSessionInfo *session = NULL;
46
  ObSMConnection *conn = NULL;
47
  ObSchemaGetterGuard schema_guard;
48
  uint64_t tenant_id = OB_INVALID_ID;
49
  const ObSysVariableSchema *sys_variable_schema = NULL;
50
  if (OB_FAIL(get_session(session))) {
51
    LOG_ERROR("get session  fail", K(ret));
52
  } else if (OB_ISNULL(conn = get_conn())) {
53
    ret = OB_ERR_UNEXPECTED;
54
    LOG_ERROR("null conn", K(ret));
55
  } else if (OB_ISNULL(session)) {
56
    ret = OB_ERR_UNEXPECTED;
57
    LOG_ERROR("fail to get session info", K(ret), K(session));
58
  } else {
59
    THIS_WORKER.set_session(session);
60
    ObSQLSessionInfo::LockGuard lock_guard(session->get_query_lock());
61
    session->update_last_active_time();
62
    tenant_id = session->get_effective_tenant_id();
63
    if (OB_FAIL(ObSqlTransControl::rollback_trans(session, need_disconnect))) {
64
      OB_LOG(WARN, "fail to rollback trans for change user", K(ret), K(need_disconnect));
65
    } else if (OB_FAIL(gctx_.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) {
66
      OB_LOG(WARN,"fail get schema guard", K(ret));
67
    } else if (OB_FAIL(schema_guard.get_sys_variable_schema(tenant_id, sys_variable_schema))) {
68
        LOG_WARN("get sys variable schema failed", K(ret));
69
    } else if (OB_ISNULL(sys_variable_schema)) {
70
      ret = OB_ERR_UNEXPECTED;
71
      LOG_WARN("sys variable schema is null", K(ret));
72
    } else if (OB_FAIL(session->load_all_sys_vars(*sys_variable_schema, true))) {
73
      LOG_WARN("load system variables failed", K(ret));
74
    } else if (OB_FAIL(session->update_database_variables(&schema_guard))) {
75
      OB_LOG(WARN, "failed to update database variables", K(ret));
76
    } else if (OB_FAIL(update_proxy_sys_vars(*session))) {
77
      LOG_WARN("update_proxy_sys_vars failed", K(ret));
78
    } else if (OB_FAIL(update_charset_sys_vars(*conn, *session))) {
79
        LOG_WARN("fail to update charset sys vars", K(ret));
80
    } else {
81
      session->clean_status();
82
    }
83
  }
84

85
  //send packet to client
86
  if (OB_SUCC(ret)) {
87
    ObOKPParam ok_param;
88
    ok_param.is_on_change_user_ = true;
89
    if (OB_FAIL(send_ok_packet(*session, ok_param))) {
90
      OB_LOG(WARN, "response ok packet fail", K(ret));
91
    }
92
  } else {
93
    if (OB_FAIL(send_error_packet(ret, NULL))) {
94
      OB_LOG(WARN,"response fail packet fail", K(ret));
95
    }
96
  }
97

98
  if (OB_UNLIKELY(need_disconnect) && is_conn_valid()) {
99
    if (NULL == session) {
100
      LOG_WARN("will disconnect connection", K(ret), K(need_disconnect));
101
    } else {
102
      LOG_WARN("will disconnect connection", K(ret), K(session->get_sessid()),
103
               K(need_disconnect));
104
    }
105
    force_disconnect();
106
  }
107

108
  THIS_WORKER.set_session(NULL);
109
  if (session != NULL) {
110
    revert_session(session);
111
  }
112
  return ret;
113
}
114

115
} //namespace observer
116
} //namespace oceanbase
117

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.