ob_upgrade_utils.h 9.6 KB
Newer Older
O
oceanbase-admin 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/**
 * Copyright (c) 2021 OceanBase
 * OceanBase CE is licensed under Mulan PubL v2.
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 * You may obtain a copy of Mulan PubL v2 at:
 *          http://license.coscl.org.cn/MulanPubL-2.0
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PubL v2 for more details.
 */

#ifndef OCEANBASE_SHARE_UPGRADE_UTILS_H_
#define OCEANBASE_SHARE_UPGRADE_UTILS_H_

#include "lib/mysqlclient/ob_mysql_proxy.h"
#include "share/ob_common_rpc_proxy.h"
#include "share/ob_check_stop_provider.h"
#include "share/schema/ob_multi_version_schema_service.h"
#include "rootserver/ob_rs_job_table_operator.h"
#include "rootserver/ob_ddl_operator.h"

namespace oceanbase {
namespace share {

static const int64_t UPGRADE_JOB_TYPE_COUNT = 4;
static const rootserver::ObRsJobType upgrade_job_type_array[UPGRADE_JOB_TYPE_COUNT] = {
    rootserver::JOB_TYPE_INVALID,
    rootserver::JOB_TYPE_STATISTIC_PRIMARY_ZONE_ENTITY_COUNT,
    rootserver::JOB_TYPE_SCHEMA_SPLIT_V2,
    rootserver::JOB_TYPE_SCHEMA_REVISE,
};

class ObUpgradeUtils {
G
gm 已提交
35
public:
O
oceanbase-admin 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
  ObUpgradeUtils()
  {}
  virtual ~ObUpgradeUtils()
  {}
  static int create_tenant_tables(share::schema::ObMultiVersionSchemaService& schema_service, const uint64_t table_id);
  static int can_run_upgrade_job(rootserver::ObRsJobType job_type, bool& can);
  static int check_upgrade_job_passed(rootserver::ObRsJobType job_type);
  static int force_create_tenant_table(
      const uint64_t tenant_id, const uint64_t table_id, const uint64_t last_replay_log_id);
  static int create_tenant_table(
      const uint64_t tenant_id, share::schema::ObTableSchema& table_schema, bool in_sync, bool& allow_sys_create_table);
  static int check_schema_sync(bool& is_sync);
  /* physical restore related */
  // Can't call upgrade_sys_variable()/upgrade_sys_stat() concurrenly.
  static int upgrade_sys_variable(common::ObISQLClient& sql_client, const uint64_t tenant_id);
  static int upgrade_sys_stat(common::ObISQLClient& sql_client, const uint64_t tenant_id);
  /* ----------------------- */
G
gm 已提交
53
private:
O
oceanbase-admin 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
  static int check_table_exist(uint64_t table_id, bool& exist);
  static int check_table_partition_exist(uint64_t table_id, bool& exist);
  static int check_rs_job_exist(rootserver::ObRsJobType job_type, bool& exist);
  static int check_rs_job_success(rootserver::ObRsJobType job_type, bool& success);

  /* upgrade sys variable */
  static int calc_diff_sys_var(common::ObISQLClient& sql_client, const uint64_t tenant_id,
      common::ObArray<int64_t>& update_list, common::ObArray<int64_t>& add_list);
  static int update_sys_var(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, common::ObArray<int64_t>& update_list);
  static int add_sys_var(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, common::ObArray<int64_t>& add_list);
  static int execute_update_sys_var_sql(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, const share::schema::ObSysParam& sys_param);
  static int execute_update_sys_var_history_sql(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, const share::schema::ObSysParam& sys_param);
  static int execute_add_sys_var_sql(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, const share::schema::ObSysParam& sys_param);
  static int execute_add_sys_var_history_sql(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, const share::schema::ObSysParam& sys_param);
  static int convert_sys_variable_value(
      const int64_t var_store_idx, common::ObIAllocator& allocator, common::ObString& value);
  static int gen_basic_sys_variable_dml(
      const uint64_t tenant_id, const share::schema::ObSysParam& sys_param, share::ObDMLSqlSplicer& dml);
  /* upgrade sys variable end */
  static int filter_sys_stat(
      common::ObISQLClient& sql_client, const uint64_t tenant_id, rootserver::ObSysStat& sys_stat);

G
gm 已提交
82
private:
O
oceanbase-admin 已提交
83 84 85 86 87 88 89 90
  typedef common::ObFixedLengthString<OB_MAX_CONFIG_NAME_LEN> Name;
};

/* =========== upgrade processor ============= */

// Special upgrade actions for specific cluster version,
// which should be stateless and reentrant.
class ObBaseUpgradeProcessor {
G
gm 已提交
91
public:
O
oceanbase-admin 已提交
92 93
  enum UpgradeMode { UPGRADE_MODE_INVALID, UPGRADE_MODE_OB, UPGRADE_MODE_PHYSICAL_RESTORE };

G
gm 已提交
94
public:
O
oceanbase-admin 已提交
95 96 97
  ObBaseUpgradeProcessor();
  virtual ~ObBaseUpgradeProcessor(){};

G
gm 已提交
98
public:
O
oceanbase-admin 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
  int init(int64_t cluster_version, UpgradeMode mode, common::ObMySQLProxy& sql_proxy, obrpc::ObSrvRpcProxy& rpc_proxy,
      share::schema::ObMultiVersionSchemaService& schema_service, share::ObCheckStopProvider& check_server_provider);
  int64_t get_version() const
  {
    return cluster_version_;
  }
  void set_tenant_id(const uint64_t tenant_id)
  {
    tenant_id_ = tenant_id;
  }
  int64_t get_tenant_id() const
  {
    return tenant_id_;
  }
  virtual int pre_upgrade() = 0;
  virtual int post_upgrade() = 0;
  TO_STRING_KV(K_(inited), K_(cluster_version), K_(tenant_id), K_(mode));

G
gm 已提交
117
protected:
O
oceanbase-admin 已提交
118 119
  virtual int check_inner_stat() const;

G
gm 已提交
120
protected:
O
oceanbase-admin 已提交
121 122 123 124 125 126 127 128 129
  bool inited_;
  int64_t cluster_version_;
  uint64_t tenant_id_;
  UpgradeMode mode_;
  common::ObMySQLProxy* sql_proxy_;
  obrpc::ObSrvRpcProxy* rpc_proxy_;
  share::schema::ObMultiVersionSchemaService* schema_service_;
  share::ObCheckStopProvider* check_stop_provider_;

G
gm 已提交
130
private:
O
oceanbase-admin 已提交
131 132 133 134
  DISALLOW_COPY_AND_ASSIGN(ObBaseUpgradeProcessor);
};

class ObUpgradeProcesserSet {
G
gm 已提交
135
public:
O
oceanbase-admin 已提交
136 137 138 139 140 141 142 143 144
  ObUpgradeProcesserSet();
  virtual ~ObUpgradeProcesserSet();
  int init(ObBaseUpgradeProcessor::UpgradeMode mode, common::ObMySQLProxy& sql_proxy, obrpc::ObSrvRpcProxy& rpc_proxy,
      share::schema::ObMultiVersionSchemaService& schema_service, share::ObCheckStopProvider& check_server_provider);
  int get_processor_by_idx(const int64_t idx, ObBaseUpgradeProcessor*& processor) const;
  int get_processor_by_version(const int64_t version, ObBaseUpgradeProcessor*& processor) const;
  int get_processor_idx_by_range(
      const int64_t start_version, const int64_t end_version, int64_t& start_idx, int64_t& end_idx);

G
gm 已提交
145
private:
O
oceanbase-admin 已提交
146 147 148
  virtual int check_inner_stat() const;
  int get_processor_idx_by_version(const int64_t version, int64_t& idx) const;

G
gm 已提交
149
private:
O
oceanbase-admin 已提交
150 151 152 153 154 155 156 157
  bool inited_;
  common::ObArenaAllocator allocator_;
  common::ObArray<ObBaseUpgradeProcessor*> processor_list_;
  DISALLOW_COPY_AND_ASSIGN(ObUpgradeProcesserSet);
};

#define DEF_SIMPLE_UPGRARD_PROCESSER(MAJOR, MINOR, PATCH)                              \
  class ObUpgradeFor##MAJOR##MINOR##PATCH##Processor : public ObBaseUpgradeProcessor { \
G
gm 已提交
158
  public:                                                                              \
O
oceanbase-admin 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
    ObUpgradeFor##MAJOR##MINOR##PATCH##Processor() : ObBaseUpgradeProcessor()          \
    {}                                                                                 \
    virtual ~ObUpgradeFor##MAJOR##MINOR##PATCH##Processor()                            \
    {}                                                                                 \
    virtual int pre_upgrade() override                                                 \
    {                                                                                  \
      return common::OB_SUCCESS;                                                       \
    }                                                                                  \
    virtual int post_upgrade() override                                                \
    {                                                                                  \
      return common::OB_SUCCESS;                                                       \
    }                                                                                  \
  };

/*
 * NOTE: The Following code should be modified when CLUSTER_CURRENT_VERSION changed.
 * 1. ObUpgradeChecker: CLUTER_VERSION_NUM, UPGRADE_PATH
 * 2. Implement new ObUpgradeProcessor by cluster version.
 * 3. Modify int ObUpgradeProcesserSet::init().
 */
class ObUpgradeChecker {
G
gm 已提交
180
public:
O
oceanbase-admin 已提交
181 182
  static bool check_cluster_version_exist(const uint64_t version);

G
gm 已提交
183
public:
184
  static const int64_t CLUTER_VERSION_NUM = 5;
O
oceanbase-admin 已提交
185 186 187 188 189 190 191
  static const uint64_t UPGRADE_PATH[CLUTER_VERSION_NUM];
};

// 2.2.60
DEF_SIMPLE_UPGRARD_PROCESSER(2, 2, 60);
// 2.2.70
class ObUpgradeFor2270Processor : public ObBaseUpgradeProcessor {
G
gm 已提交
192
public:
O
oceanbase-admin 已提交
193 194 195 196 197 198 199
  ObUpgradeFor2270Processor() : ObBaseUpgradeProcessor()
  {}
  virtual ~ObUpgradeFor2270Processor()
  {}
  virtual int pre_upgrade() override;
  virtual int post_upgrade() override;

G
gm 已提交
200
private:
O
oceanbase-admin 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
  int modify_trigger_package_source_body();
  int modify_oracle_public_database_name();

  int rebuild_subpart_partition_gc_info();
  int batch_replace_partition_gc_info(const common::ObIArray<common::ObPartitionKey>& keys);
};
// 2.2.71
DEF_SIMPLE_UPGRARD_PROCESSER(2, 2, 71);
// 2.2.72
DEF_SIMPLE_UPGRARD_PROCESSER(2, 2, 72);
// 2.2.73
DEF_SIMPLE_UPGRARD_PROCESSER(2, 2, 73);
// 2.2.74
DEF_SIMPLE_UPGRARD_PROCESSER(2, 2, 74);

class ObUpgradeFor2275Processor : public ObBaseUpgradeProcessor {
G
gm 已提交
217
public:
O
oceanbase-admin 已提交
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
  ObUpgradeFor2275Processor() : ObBaseUpgradeProcessor()
  {}
  virtual ~ObUpgradeFor2275Processor()
  {}
  virtual int pre_upgrade() override
  {
    return common::OB_SUCCESS;
  };
  virtual int post_upgrade() override;
};

// 2.2.76
DEF_SIMPLE_UPGRARD_PROCESSER(2, 2, 76);
// 3.1.0
DEF_SIMPLE_UPGRARD_PROCESSER(3, 1, 0);
L
LINxiansheng 已提交
233
DEF_SIMPLE_UPGRARD_PROCESSER(3, 1, 1);
234
DEF_SIMPLE_UPGRARD_PROCESSER(3, 1, 2);
235
DEF_SIMPLE_UPGRARD_PROCESSER(3, 1, 3);
236
DEF_SIMPLE_UPGRARD_PROCESSER(3, 1, 4);
237
DEF_SIMPLE_UPGRARD_PROCESSER(3, 1, 5);
O
oceanbase-admin 已提交
238 239 240 241 242 243

/* =========== upgrade processor end ============= */

}  // end namespace share
}  // end namespace oceanbase
#endif /* _OB_UPGRADE_UTILS_H */