oceanbase

Форк
0
/
ob_tablet_drop.cpp 
342 строки · 13.8 Кб
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 RS
14
#include "ob_tablet_drop.h"
15
#include "ob_root_service.h"
16
#include "share/ob_share_util.h"
17
#include "share/tablet/ob_tablet_to_table_history_operator.h" // ObTabletToTableHistoryOperator
18
#include "share/tablet/ob_tablet_to_ls_operator.h"
19
#include "observer/ob_inner_sql_connection.h"
20

21
namespace oceanbase
22
{
23
namespace rootserver
24
{
25

26
ObTabletDrop::~ObTabletDrop()
27
{
28
  FOREACH(iter, args_map_) {
29
    if (OB_NOT_NULL(iter->second)
30
        && FALSE_IT(iter->second->~ObIArray<ObTabletID>())) {
31
    }
32
  }
33
}
34

35
void ObTabletDrop::reset()
36
{
37
  FOREACH(iter, args_map_) {
38
    if (OB_NOT_NULL(iter->second)
39
        && FALSE_IT(iter->second->~ObIArray<ObTabletID>())) {
40
    }
41
  }
42
  args_map_.clear();
43
}
44

45
int ObTabletDrop::init()
46
{
47
  int ret = OB_SUCCESS;
48
  if (OB_UNLIKELY(inited_)) {
49
    ret = OB_INIT_TWICE;
50
    LOG_WARN("ObTabletDrop init twice", KR(ret));
51
  } else if (OB_FAIL(args_map_.create(MAP_BUCKET_NUM, "TabletCtr"))) {
52
    LOG_WARN("fail to args map", KR(ret));
53
  } else {
54
    inited_ = true;
55
  }
56
  return ret;
57
}
58

59
int ObTabletDrop::add_drop_tablets_of_table_arg(
60
                  const common::ObIArray<const share::schema::ObTableSchema*> &schemas)
61
{
62
  int ret = OB_SUCCESS;
63
  common::ObArray<share::ObLSID> ls_ids;
64
  int64_t all_part_num = 0;
65
  if (OB_UNLIKELY(!inited_)) {
66
    ret = OB_NOT_INIT;
67
    LOG_WARN("ObTabletCreator not init", KR(ret));
68
  } else if (schemas.count() < 1) {
69
    ret = OB_INVALID_ARGUMENT;
70
    LOG_WARN("schemas count is less 1", KR(ret), K(schemas));
71
  } else if (OB_ISNULL(schemas.at(0))) {
72
    ret = OB_INVALID_ARGUMENT;
73
    LOG_WARN("NULL ptr", KR(ret), K(schemas));
74
  } else {
75
    const share::schema::ObTableSchema &table_schema = *schemas.at(0);
76
    if (is_inner_table(table_schema.get_table_id())) {
77
      ret = OB_INVALID_ARGUMENT;
78
      LOG_WARN("sys table cannot drop", K(table_schema), KR(ret));
79
    } else if (schemas.count() > 1) {
80
      int64_t data_table_id = OB_INVALID_ID;
81
      if (table_schema.is_index_local_storage()
82
          || table_schema.is_aux_lob_table()
83
          || table_schema.is_mlog_table()) {
84
        data_table_id = table_schema.get_data_table_id();
85
      } else {
86
        data_table_id = table_schema.get_table_id();
87
      }
88
      for (int64_t i = 1; OB_SUCC(ret) && i < schemas.count(); ++i) {
89
        const share::schema::ObTableSchema *aux_table_schema = schemas.at(i);
90
        if (OB_ISNULL(aux_table_schema)) {
91
          ret = OB_INVALID_ARGUMENT;
92
          LOG_WARN("ptr is null", KR(ret), K(schemas));
93
        } else if (is_inner_table(aux_table_schema->get_table_id())) {
94
          ret = OB_INVALID_ARGUMENT;
95
          LOG_WARN("sys table cannot drop", KPC(aux_table_schema), KR(ret));
96
        } else if (!aux_table_schema->is_index_local_storage()
97
            && !aux_table_schema->is_aux_lob_table()
98
            && !aux_table_schema->is_mlog_table()) {
99
          ret = OB_INVALID_ARGUMENT;
100
          LOG_WARN("aux_table_schema must be local index or aux lob table", KR(ret), K(schemas), KPC(aux_table_schema));
101
        } else if (data_table_id != aux_table_schema->get_data_table_id()) {
102
          ret = OB_INVALID_ARGUMENT;
103
          LOG_WARN("aux table schema must be of same data table", KR(ret), K(schemas), KPC(aux_table_schema));
104
        }
105
      }
106
    }
107
    if (OB_FAIL(ret)) {
108
    } else if (OB_FAIL(get_ls_from_table(table_schema, ls_ids))) {
109
      LOG_WARN("fail to get ls from table", KR(ret));
110
    } else {
111
      int64_t ls_idx = 0;
112
      ObPartitionLevel part_level = table_schema.get_part_level();
113
      if (PARTITION_LEVEL_ZERO == part_level) {
114
        if (OB_FAIL(drop_tablet_(schemas, ls_ids.at(ls_idx++),
115
                    OB_INVALID_INDEX, OB_INVALID_INDEX))) {
116
          LOG_WARN("fail to drop tablet", K(table_schema), KR(ret));
117
        }
118
      } else {
119
        ObPartition **part_array = table_schema.get_part_array();
120
        int64_t part_num = table_schema.get_partition_num();
121
        if (OB_ISNULL(part_array)) {
122
          ret = OB_ERR_UNEXPECTED;
123
          LOG_WARN("part array is null", K(table_schema), KR(ret));
124
        } else {
125
          for (int64_t i = 0; i < part_num && OB_SUCC(ret); ++i) {
126
            if (OB_ISNULL(part_array[i])) {
127
              ret = OB_ERR_UNEXPECTED;
128
              LOG_WARN("NULL ptr", K(i), K(table_schema), KR(ret));
129
            } else if (PARTITION_LEVEL_ONE == part_level) {
130
              if (OB_FAIL(drop_tablet_(schemas, ls_ids.at(ls_idx++), i,
131
                          OB_INVALID_INDEX))) {
132
                LOG_WARN("fail to drop tablet", K(table_schema), KR(ret));
133
              }
134
            } else if (PARTITION_LEVEL_TWO == part_level) {
135
              ObSubPartition **subpart_array = part_array[i]->get_subpart_array();
136
              int64_t sub_part_num = part_array[i]->get_subpartition_num();
137
              if (OB_ISNULL(subpart_array)) {
138
                ret = OB_ERR_UNEXPECTED;
139
                LOG_WARN("part array is null", K(table_schema), KR(ret));
140
              } else {
141
                for (int64_t j = 0; j < sub_part_num && OB_SUCC(ret); j++) {
142
                  if (OB_ISNULL(subpart_array[j])) {
143
                    ret = OB_ERR_UNEXPECTED;
144
                    LOG_WARN("NULL ptr", K(j), K(table_schema), KR(ret));
145
                  } else {
146
                    if (OB_FAIL(drop_tablet_(schemas, ls_ids.at(ls_idx++), i, j))) {
147
                      LOG_WARN("fail to drop tablet", K(table_schema), KR(ret));
148
                    }
149
                  }
150
                }
151
              }
152
            } else {
153
              ret = OB_ERR_UNEXPECTED;
154
              LOG_WARN("4.0 not support part type", K(table_schema), KR(ret));
155
            }
156
          }
157
        }
158
      }
159
    }
160
  }
161
  return ret;
162
}
163

164
int ObTabletDrop::get_ls_from_table(const share::schema::ObTableSchema &table_schema,
165
                                    common::ObIArray<share::ObLSID> &assign_ls_id_array)
166
{
167
  int ret = OB_SUCCESS;
168
  int64_t all_part_num = 0;
169
  if (-1 == (all_part_num = table_schema.get_all_part_num())) {
170
    ret = OB_ERR_UNEXPECTED;
171
    LOG_WARN("fail to get tablet num", K(table_schema), KR(ret));
172
  } else if (OB_FAIL(assign_ls_id_array.reserve(all_part_num))) {
173
    LOG_WARN("fail to reserve array", KR(ret), K(all_part_num));
174
  } else if (is_sys_tenant(table_schema.get_tenant_id())) {
175
    for (int64_t i = 0; i < all_part_num && OB_SUCC(ret); i++) {
176
      if (OB_FAIL(assign_ls_id_array.push_back(share::SYS_LS))) {
177
        LOG_WARN("failed to push_back", KR(ret));
178
      }
179
    }
180
  } else {
181
    ObArray<ObTabletID> tablet_ids;
182
    if (OB_FAIL(table_schema.get_tablet_ids(tablet_ids))) {
183
      LOG_WARN("fail to get tablet ids", KR(ret), K(table_schema));
184
    } else if (OB_FAIL(share::ObTabletToLSTableOperator::batch_get_ls(trans_, tenant_id_, tablet_ids, assign_ls_id_array))) {
185
      LOG_WARN("fail to batch_get_ls", KR(ret), K(tenant_id_), K(table_schema));
186
    }
187
  }
188

189
  if (OB_FAIL(ret)) {
190
  } else if (assign_ls_id_array.count() != all_part_num) {
191
    ret = OB_ERR_UNEXPECTED;
192
    LOG_WARN("the ls of tablet is not equal partition num",
193
              KR(ret), K(assign_ls_id_array.count()), K(all_part_num));
194
  }
195
  return ret;
196
}
197

198
int ObTabletDrop::drop_tablet_(
199
    const common::ObIArray<const share::schema::ObTableSchema *> &table_schema_ptr_array,
200
    const share::ObLSID &ls_id,
201
    const int64_t part_idx,
202
    const int64_t subpart_idx)
203
{
204
  int ret = OB_SUCCESS;
205
  common::ObIArray<ObTabletID> *tablet_id_array = NULL;
206

207
  if (table_schema_ptr_array.count() < 1) {
208
    ret = OB_ERR_UNEXPECTED;
209
    LOG_WARN("table_schema_ptr_array is empty", K(table_schema_ptr_array), KR(ret));
210
  } else if (OB_SUCC(args_map_.get_refactored(ls_id, tablet_id_array))) {
211
    //already exist
212
  } else if (OB_HASH_NOT_EXIST == ret) {
213
    //create new tablet_id_array
214
    void *ptr1 = allocator_.alloc(sizeof(ObArray<ObTabletID>));
215
    void *ptr2 = allocator_.alloc(sizeof(ObArray<ObTabletID>));
216
    if (OB_ISNULL(ptr1) || OB_ISNULL(ptr2)) {
217
      ret = OB_ALLOCATE_MEMORY_FAILED;
218
      LOG_WARN("fail alloc memory", KR(ret));
219
    } else {
220
      tablet_id_array = new (ptr1)ObArray<ObTabletID, ObIAllocator &>(
221
                                OB_MALLOC_NORMAL_BLOCK_SIZE, allocator_);
222
      if (OB_FAIL(args_map_.set_refactored(ls_id, tablet_id_array, 0/*not overwrite*/))) {
223
        LOG_WARN("fail to set refactored", KR(ret), K(ls_id));
224
      }
225
    }
226
  } else {
227
    LOG_WARN("fail to get element from args_map", KR(ret), K(ls_id));
228
  }
229

230
  if (OB_FAIL(ret)) {
231
  } else if (OB_ISNULL(tablet_id_array)) {
232
    ret = OB_ERR_UNEXPECTED;
233
    LOG_WARN("NULL ptr", K(table_schema_ptr_array), KR(ret));
234
  } else if (OB_ISNULL(table_schema_ptr_array.at(0))) {
235
    ret = OB_ERR_UNEXPECTED;
236
    LOG_WARN("NULL ptr", K(table_schema_ptr_array), KR(ret));
237
  } else {
238
    bool only_drop_index = table_schema_ptr_array.at(0)->is_index_local_storage();
239
    ObBasePartition *first_table_part = NULL;
240
    ObBasePartition *part = NULL;
241
    for (int r = 0; r < table_schema_ptr_array.count() && OB_SUCC(ret); r++) {
242
      const share::schema::ObTableSchema *table_schema_ptr = table_schema_ptr_array.at(r);
243
      if (OB_ISNULL(table_schema_ptr)) {
244
        ret = OB_ERR_UNEXPECTED;
245
        LOG_WARN("NULL ptr", K(r), K(table_schema_ptr_array), KR(ret));
246
      } else if (PARTITION_LEVEL_ZERO == table_schema_ptr->get_part_level()) {
247
        ObTabletID tablet_id = table_schema_ptr->get_tablet_id();
248
        if (OB_FAIL(tablet_id_array->push_back(tablet_id))) {
249
          LOG_WARN("failed to assign table schema point", KR(ret), KPC(table_schema_ptr));
250
        }
251
      } else if (OB_FAIL(table_schema_ptr->get_part_by_idx(part_idx, subpart_idx, part))) {
252
        LOG_WARN("fail to get index part", KR(ret), KPC(table_schema_ptr), K(part_idx), K(subpart_idx));
253
      } else if (OB_ISNULL(part)) {
254
        ret = OB_INVALID_ARGUMENT;
255
        LOG_WARN("NULL ptr", KR(ret), KPC(table_schema_ptr), K(part_idx), K(subpart_idx));
256
      } else {
257
        if (r == 0) {
258
          first_table_part = part;
259
        } else {
260
          if (OB_UNLIKELY(!first_table_part->same_base_partition(*part))) {
261
            ret = OB_INVALID_ARGUMENT;
262
            LOG_WARN("parts in table and index table is not equal", KR(ret), KPC(first_table_part), KPC(part));
263
          }
264
        }
265
        if (OB_FAIL(ret)) {
266
        } else if (OB_FAIL(tablet_id_array->push_back(part->get_tablet_id()))) {
267
          LOG_WARN("failed to assign table schema point", KR(ret), K(part_idx), K(subpart_idx));
268
        }
269
      }
270
    }
271
  }
272
  return ret;
273
}
274
int ObTabletDrop::execute()
275
{
276
  int ret = OB_SUCCESS;
277
  ObTimeoutCtx ctx;
278
  const int64_t default_timeout_ts = GCONF.rpc_timeout;
279
  const int64_t SLEEP_INTERVAL = 100 * 1000L; // 100ms
280
  observer::ObInnerSQLConnection *conn = NULL;
281
  if (OB_UNLIKELY(!inited_)) {
282
    ret = OB_NOT_INIT;
283
    LOG_WARN("ObTabletCreator not init", KR(ret));
284
  } else if (OB_ISNULL(conn = dynamic_cast<observer::ObInnerSQLConnection *>
285
                       (trans_.get_connection()))) {
286
    ret = OB_ERR_UNEXPECTED;
287
    LOG_WARN("conn_ is NULL", KR(ret));
288
  } else if (OB_UNLIKELY(0 >= args_map_.size())) {
289
    ret = OB_INVALID_ARGUMENT;
290
    LOG_WARN("batch arg count is invalid", KR(ret));
291
  } else {
292
    FOREACH_X(iter, args_map_, OB_SUCC(ret)) {
293
      common::ObIArray<ObTabletID> *tablet_ids = iter->second;
294
      obrpc::ObBatchRemoveTabletArg arg;
295
      if (OB_ISNULL(tablet_ids)) {
296
        ret = OB_ERR_UNEXPECTED;
297
        LOG_WARN("tablet_ids is NULL ptr", KR(ret));
298
      } else if (tablet_ids->count() < 1) {
299
        ret = OB_ERR_UNEXPECTED;
300
        LOG_WARN("tablet_ids is empty", KR(ret));
301
      } else if (OB_FAIL(share::ObTabletToLSTableOperator::batch_remove(trans_, tenant_id_, *tablet_ids))) {
302
        LOG_WARN("tablet_ids count less than 1", KR(ret));
303
      } else if (OB_FAIL(share::ObTabletToTableHistoryOperator::drop_tablet_to_table_history(
304
                         trans_, tenant_id_, schema_version_, *tablet_ids))) {
305
        LOG_WARN("fail to create tablet to table history", KR(ret), K_(tenant_id), K(schema_version_));
306
      } else if (OB_FAIL(arg.init(*(tablet_ids), iter->first))) {
307
        LOG_WARN("failed to find leader", KR(ret), K(iter->first), KPC(tablet_ids));
308
      } else {
309
        LOG_INFO("generate remove arg", K(arg), K(lbt()), KPC(tablet_ids));
310
        int64_t buf_len = arg.get_serialize_size();
311
        int64_t pos = 0;
312
        char *buf = (char*)allocator_.alloc(buf_len);
313
        if (OB_ISNULL(buf)) {
314
          ret = OB_ALLOCATE_MEMORY_FAILED;
315
          LOG_WARN("fail alloc memory", KR(ret));
316
        } else if (OB_FAIL(arg.serialize(buf, buf_len, pos))) {
317
          LOG_WARN("fail to serialize", KR(ret), K(arg));
318
        } else if (OB_FAIL(share::ObShareUtil::set_default_timeout_ctx(ctx, default_timeout_ts))) {
319
          LOG_WARN("fail to set timeout ctx", KR(ret), K(default_timeout_ts));
320
        } else {
321
          do {
322
            if (ctx.is_timeouted()) {
323
              ret = OB_TIMEOUT;
324
              LOG_WARN("already timeout", KR(ret), K(ctx));
325
            } else if (OB_FAIL(conn->register_multi_data_source(tenant_id_, iter->first,
326
                                transaction::ObTxDataSourceType::DELETE_TABLET_NEW_MDS, buf, buf_len))) {
327
              LOG_WARN("fail to register_tx_data", KR(ret), K(arg), K(buf), K(buf_len));
328
              if (OB_LS_LOCATION_LEADER_NOT_EXIST == ret || OB_NOT_MASTER == ret) {
329
                LOG_INFO("fail to find leader, try again", K_(tenant_id), K(arg));
330
                ob_usleep(SLEEP_INTERVAL);
331
              }
332
            }
333
          } while (OB_LS_LOCATION_LEADER_NOT_EXIST == ret || OB_NOT_MASTER == ret);
334
        }
335
      }
336
    }
337
  }
338
  return ret;
339
}
340

341
} // rootserver
342
} // oceanbase
343

344

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

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

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

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