Files
oceanbase/src/storage/ob_i_table.h

599 lines
23 KiB
C++

/**
* 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 SRC_STORAGE_OB_I_TABLE_H_
#define SRC_STORAGE_OB_I_TABLE_H_
#include "common/ob_range.h"
#include "lib/allocator/ob_allocator.h"
#include "lib/atomic/ob_atomic.h"
#include "lib/container/ob_iarray.h"
#include "lib/container/ob_se_array_iterator.h"
#include "lib/hash/ob_hashmap.h"
#include "lib/lock/ob_drw_lock.h"
#include "lib/oblog/ob_log_module.h"
#include "storage/ob_i_store.h"
#include "storage/access/ob_table_read_info.h"
#include "storage/meta_mem/ob_tenant_meta_obj_pool.h"
#include "storage/meta_mem/ob_storage_meta_cache.h"
#include "share/ob_table_range.h"
#include "share/scn.h"
namespace oceanbase
{
namespace memtable
{
class ObMemtable;
class ObIMemtable;
}
namespace transaction
{
namespace tablelock
{
class ObLockMemtable;
}
}
namespace blocksstable
{
struct ObDatumRowkey;
struct ObDatumRange;
class ObSSTable;
}
namespace share
{
struct ObScnRange;
}
namespace storage
{
class ObTxDataMemtable;
class ObTxCtxMemtable;
class ObLSMemberMemtable;
class ObTenantMetaMemMgr;
struct ObTableIterParam;
struct ObTableAccessParam;
struct ObTableAccessContext;
struct ObRowsInfo;
class ObStoreRowIterator;
struct ObStoreCtx;
class ObITable
{
OB_UNIS_VERSION_V(1);
public:
// Attention! keep update with table_types in GV$OB_SSTABLES
enum TableType : unsigned char
{
// < memtable start from here
DATA_MEMTABLE = 0,
TX_DATA_MEMTABLE = 1,
TX_CTX_MEMTABLE = 2,
LOCK_MEMTABLE = 3,
// < add new memtable here
// < sstable start from here
MAJOR_SSTABLE = 10, //Reuse type, also represents row store column group in column store
MINOR_SSTABLE = 11,
MINI_SSTABLE = 12,
META_MAJOR_SSTABLE = 13,
DDL_DUMP_SSTABLE = 14,
REMOTE_LOGICAL_MINOR_SSTABLE = 15,
DDL_MEM_SSTABLE = 16,
COLUMN_ORIENTED_SSTABLE = 17,
NORMAL_COLUMN_GROUP_SSTABLE = 18,
ROWKEY_COLUMN_GROUP_SSTABLE = 19,
COLUMN_ORIENTED_META_SSTABLE = 20,
DDL_MERGE_CO_SSTABLE = 21, // used for column store ddl, for base sstable
DDL_MERGE_CG_SSTABLE = 22, // used for column store ddl, for normal cg sstable, rowkey cg not supported
DDL_MEM_CO_SSTABLE = 23,
DDL_MEM_CG_SSTABLE = 24,
// < add new sstable before here, See is_sstable()
MAX_TABLE_TYPE
};
OB_INLINE static bool is_table_type_valid(const TableType &type);
struct TableKey
{
OB_UNIS_VERSION(1);
public:
TableKey();
uint64_t hash() const;
int hash(uint64_t &hash_val) const { hash_val = hash(); return OB_SUCCESS; }
void reset();
OB_INLINE bool is_valid() const;
OB_INLINE bool operator ==(const TableKey &table_key) const;
OB_INLINE bool operator !=(const TableKey &table_key) const;
// table type interfaces
OB_INLINE bool is_memtable() const { return ObITable::is_memtable(table_type_); }
OB_INLINE bool is_resident_memtable() const { return ObITable::is_resident_memtable(table_type_); }
OB_INLINE bool is_data_memtable() const { return ObITable::is_data_memtable(table_type_); }
OB_INLINE bool is_tx_data_memtable() const { return ObITable::is_tx_data_memtable(table_type_); }
OB_INLINE bool is_tx_ctx_memtable() const { return ObITable::is_tx_ctx_memtable(table_type_); }
OB_INLINE bool is_lock_memtable() const { return ObITable::is_lock_memtable(table_type_); }
OB_INLINE bool is_minor_sstable() const { return ObITable::is_minor_sstable(table_type_); }
OB_INLINE bool is_mini_sstable() const { return ObITable::is_mini_sstable(table_type_); }
OB_INLINE bool is_major_sstable() const { return ObITable::is_major_sstable(table_type_) || ObITable::is_meta_major_sstable(table_type_); }
OB_INLINE bool is_major_or_ddl_merge_sstable() const { return is_major_sstable() || ObITable::is_ddl_merge_sstable(table_type_); }
OB_INLINE bool is_ddl_merge_sstable() const { return ObITable::is_ddl_merge_sstable(table_type_); }
OB_INLINE bool is_ddl_mem_co_cg_sstable() const { return ObITable::is_ddl_mem_co_cg_sstable(table_type_); }
OB_INLINE bool is_meta_major_sstable() const { return ObITable::is_meta_major_sstable(table_type_); }
OB_INLINE bool is_multi_version_table() const { return ObITable::is_multi_version_table(table_type_); }
OB_INLINE bool is_ddl_sstable() const { return ObITable::is_ddl_sstable(table_type_); }
OB_INLINE bool is_ddl_dump_sstable() const { return ObITable::is_ddl_dump_sstable(table_type_); }
OB_INLINE bool is_ddl_mem_sstable() const { return ObITable::is_ddl_mem_sstable(table_type_); }
OB_INLINE bool is_table_with_scn_range() const { return ObITable::is_table_with_scn_range(table_type_); }
OB_INLINE bool is_remote_logical_minor_sstable() const { return ObITable::is_remote_logical_minor_sstable(table_type_); }
OB_INLINE bool is_co_sstable() const { return ObITable::is_co_sstable(table_type_); }
OB_INLINE bool is_rowkey_cg_sstable() const { return ObITable::is_rowkey_cg_sstable(table_type_); }
OB_INLINE bool is_normal_cg_sstable() const { return ObITable::is_normal_cg_sstable(table_type_); }
OB_INLINE bool is_cg_sstable() const { return ObITable::is_cg_sstable(table_type_); }
OB_INLINE bool is_column_store_sstable() const { return is_co_sstable() || is_cg_sstable(); }
OB_INLINE const common::ObTabletID &get_tablet_id() const { return tablet_id_; }
OB_INLINE share::SCN get_start_scn() const { return scn_range_.start_scn_; }
OB_INLINE share::SCN get_end_scn() const { return scn_range_.end_scn_; }
OB_INLINE int64_t get_snapshot_version() const
{
return version_range_.snapshot_version_;
}
OB_INLINE uint16_t get_column_group_id() const { return column_group_idx_; }
OB_INLINE TableKey& operator=(const TableKey &key)
{
table_type_ = key.table_type_;
tablet_id_ = key.tablet_id_;
scn_range_ = key.scn_range_;
column_group_idx_ = key.column_group_idx_;
return *this;
}
TO_STRING_KV(K_(tablet_id), K_(column_group_idx), "table_type", get_table_type_name(table_type_), K_(scn_range));
public:
common::ObTabletID tablet_id_;
union {
common::ObNewVersionRange version_range_;
share::ObScnRange scn_range_;
};
uint16_t column_group_idx_;
ObITable::TableType table_type_;
};
ObITable();
virtual ~ObITable() {}
int init(const TableKey &table_key);
void reset();
virtual int safe_to_destroy(bool &is_safe);
OB_INLINE const TableKey &get_key() const { return key_; }
void set_scn_range(share::ObScnRange scn_range) { key_.scn_range_ = scn_range; }
void set_table_type(ObITable::TableType table_type) { key_.table_type_ = table_type; }
void set_snapshot_version(int64_t version) { key_.version_range_.snapshot_version_ = version; }
virtual int exist(
ObStoreCtx &ctx,
const uint64_t table_id,
const storage::ObITableReadInfo &read_info,
const blocksstable::ObDatumRowkey &rowkey,
bool &is_exist,
bool &has_found);
virtual int exist(
const ObTableIterParam &param,
ObTableAccessContext &context,
const blocksstable::ObDatumRowkey &rowkey,
bool &is_exist,
bool &has_found);
virtual int exist(
ObRowsInfo &rowsInfo,
bool &is_exist,
bool &has_found);
virtual int scan(
const ObTableIterParam &param,
ObTableAccessContext &context,
const blocksstable::ObDatumRange &key_range,
ObStoreRowIterator *&row_iter) = 0;
virtual int get(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const blocksstable::ObDatumRowkey &rowkey,
ObStoreRowIterator *&row_iter) = 0;
virtual int multi_get(
const ObTableIterParam &param,
ObTableAccessContext &context,
const common::ObIArray<blocksstable::ObDatumRowkey> &rowkeys,
ObStoreRowIterator *&row_iter) = 0;
virtual int multi_scan(
const ObTableIterParam &param,
ObTableAccessContext &context,
const common::ObIArray<blocksstable::ObDatumRange> &ranges,
ObStoreRowIterator *&row_iter) = 0;
virtual OB_INLINE share::SCN get_start_scn() const;
virtual OB_INLINE share::SCN get_end_scn() const;
virtual OB_INLINE share::ObScnRange &get_scn_range() { return key_.scn_range_; }
virtual OB_INLINE bool is_trans_state_deterministic() { return get_upper_trans_version() < INT64_MAX; }
virtual int64_t get_snapshot_version() const { return key_.get_snapshot_version(); }
virtual int64_t get_upper_trans_version() const { return get_snapshot_version(); }
virtual int64_t get_max_merged_trans_version() const { return get_snapshot_version(); }
virtual int get_frozen_schema_version(int64_t &schema_version) const = 0;
OB_INLINE uint16_t get_column_group_id() const { return key_.get_column_group_id(); }
virtual void inc_ref();
virtual int64_t dec_ref();
virtual int64_t get_ref() const { return ATOMIC_LOAD(&ref_cnt_); }
// TODO @hanhui so many table type judgement
virtual bool is_sstable() const { return is_sstable(key_.table_type_); }
virtual bool is_co_sstable() const { return is_co_sstable(key_.table_type_); }
virtual bool is_rowkey_cg_sstable() const { return is_rowkey_cg_sstable(key_.table_type_); }
virtual bool is_normal_cg_sstable() const { return is_normal_cg_sstable(key_.table_type_); }
virtual bool is_cg_sstable() const { return is_cg_sstable(key_.table_type_); }
virtual bool is_column_store_sstable() const { return is_co_sstable() || is_cg_sstable(); }
virtual bool is_meta_major_sstable() const { return is_meta_major_sstable(key_.table_type_); }
virtual bool is_major_sstable() const { return is_major_sstable(key_.table_type_) || is_meta_major_sstable(key_.table_type_); }
virtual bool is_major_or_ddl_merge_sstable() const { return is_major_sstable() || is_ddl_merge_sstable(key_.table_type_); }
virtual bool is_minor_sstable() const { return is_minor_sstable(key_.table_type_); }
virtual bool is_mini_sstable() const { return is_mini_sstable(key_.table_type_); }
virtual bool is_multi_version_minor_sstable() const { return is_multi_version_minor_sstable(key_.table_type_); }
virtual bool is_multi_version_table() const { return is_multi_version_table(key_.table_type_); }
virtual bool is_memtable() const { return is_memtable(key_.table_type_); }
virtual bool is_resident_memtable() const { return is_resident_memtable(key_.table_type_); }
virtual bool is_data_memtable() const { return is_data_memtable(key_.table_type_); }
virtual bool is_tx_data_memtable() const { return is_tx_data_memtable(key_.table_type_); }
virtual bool is_tx_ctx_memtable() const { return is_tx_ctx_memtable(key_.table_type_); }
virtual bool is_lock_memtable() const { return is_lock_memtable(key_.table_type_); }
virtual bool is_frozen_memtable() const { return false; }
virtual bool is_active_memtable() const { return false; }
OB_INLINE bool is_table_with_scn_range() const { return is_table_with_scn_range(key_.table_type_); }
virtual OB_INLINE int64_t get_timestamp() const { return 0; }
virtual bool is_ddl_sstable() const { return is_ddl_sstable(key_.table_type_); }
virtual bool is_ddl_dump_sstable() const { return is_ddl_dump_sstable(key_.table_type_); }
virtual bool is_ddl_mem_sstable() const { return is_ddl_mem_sstable(key_.table_type_); }
virtual bool is_ddl_merge_sstable() const { return is_ddl_merge_sstable(key_.table_type_); }
virtual bool is_ddl_mem_co_cg_sstable() const { return is_ddl_mem_co_cg_sstable(key_.table_type_); }
virtual bool is_remote_logical_minor_sstable() const { return is_remote_logical_minor_sstable(key_.table_type_); }
virtual bool is_empty() const = 0;
virtual bool no_data_to_read() const { return is_empty(); }
virtual bool is_ddl_merge_empty_sstable() const { return is_empty() && is_ddl_merge_sstable(); }
DECLARE_VIRTUAL_TO_STRING;
static bool is_sstable(const TableType table_type)
{
return ObITable::MAJOR_SSTABLE <= table_type && table_type < ObITable::MAX_TABLE_TYPE;
}
static bool is_major_sstable(const TableType table_type)
{
return ObITable::TableType::MAJOR_SSTABLE == table_type
|| ObITable::TableType::COLUMN_ORIENTED_SSTABLE == table_type
|| ObITable::TableType::NORMAL_COLUMN_GROUP_SSTABLE == table_type
|| ObITable::TableType::ROWKEY_COLUMN_GROUP_SSTABLE == table_type;
}
static bool is_minor_sstable(const TableType table_type)
{
return ObITable::TableType::MINOR_SSTABLE == table_type
|| ObITable::TableType::MINI_SSTABLE == table_type
|| ObITable::TableType::REMOTE_LOGICAL_MINOR_SSTABLE == table_type;
}
static bool is_multi_version_minor_sstable(const TableType table_type)
{
return ObITable::TableType::MINOR_SSTABLE == table_type
|| ObITable::TableType::MINI_SSTABLE == table_type
|| ObITable::TableType::REMOTE_LOGICAL_MINOR_SSTABLE == table_type;
}
static bool is_multi_version_table(const TableType table_type)
{
// Note (yanyuan.cxf) why we need TX_CTX_MEMTABLE and TX_DATA_MEMTABLE
return ObITable::TableType::DATA_MEMTABLE == table_type
|| ObITable::TableType::TX_CTX_MEMTABLE == table_type
|| ObITable::TableType::TX_DATA_MEMTABLE == table_type
|| ObITable::TableType::LOCK_MEMTABLE == table_type
|| is_multi_version_minor_sstable(table_type);
}
static bool is_mini_sstable(const TableType table_type)
{
return ObITable::TableType::MINI_SSTABLE == table_type;
}
/*
*column store sstables
*/
static bool is_co_sstable(const TableType table_type)
{
return ObITable::TableType::COLUMN_ORIENTED_SSTABLE == table_type
|| ObITable::TableType::COLUMN_ORIENTED_META_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CO_SSTABLE == table_type;
}
static bool is_normal_cg_sstable(const TableType table_type)
{
return ObITable::TableType::NORMAL_COLUMN_GROUP_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CG_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_CG_SSTABLE == table_type;
}
static bool is_rowkey_cg_sstable(const TableType table_type)
{
return ObITable::TableType::ROWKEY_COLUMN_GROUP_SSTABLE == table_type;
}
static bool is_cg_sstable(const TableType table_type)
{
return is_normal_cg_sstable(table_type)
|| is_rowkey_cg_sstable(table_type);
}
static bool is_column_store_sstable(const TableType table_type)
{
return is_co_sstable(table_type)
|| is_cg_sstable(table_type)
|| ObITable::TableType::DDL_MEM_CO_SSTABLE == table_type;
}
static bool is_remote_logical_minor_sstable(const TableType table_type)
{
return ObITable::TableType::REMOTE_LOGICAL_MINOR_SSTABLE == table_type;
}
static bool is_memtable(const TableType table_type)
{
// TODO: yanyuan.cxf maybe we need > and <
return (ObITable::TableType::TX_DATA_MEMTABLE == table_type
|| ObITable::TableType::TX_CTX_MEMTABLE == table_type
|| ObITable::TableType::DATA_MEMTABLE == table_type
|| ObITable::TableType::LOCK_MEMTABLE == table_type);
}
static bool is_resident_memtable(const TableType table_type)
{
return (ObITable::TableType::TX_CTX_MEMTABLE == table_type
|| ObITable::TableType::LOCK_MEMTABLE == table_type);
}
static bool is_data_memtable(const TableType table_type)
{
return ObITable::TableType::DATA_MEMTABLE == table_type;
}
static bool is_tx_data_memtable(const TableType table_type)
{
return ObITable::TableType::TX_DATA_MEMTABLE == table_type;
}
static bool is_tx_ctx_memtable(const TableType table_type)
{
return ObITable::TableType::TX_CTX_MEMTABLE == table_type;
}
static bool is_lock_memtable(const TableType table_type)
{
return ObITable::TableType::LOCK_MEMTABLE == table_type;
}
static bool is_meta_major_sstable(const TableType table_type)
{
return ObITable::TableType::META_MAJOR_SSTABLE == table_type
|| ObITable::TableType::COLUMN_ORIENTED_META_SSTABLE == table_type;
}
static bool is_ddl_sstable(const TableType table_type)
{
return ObITable::TableType::DDL_DUMP_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CO_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CG_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_CO_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_CG_SSTABLE == table_type;
}
static bool is_ddl_dump_sstable(const TableType table_type)
{
return ObITable::TableType::DDL_DUMP_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CO_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CG_SSTABLE == table_type;
}
static bool is_ddl_mem_sstable(const TableType table_type)
{
return ObITable::TableType::DDL_MEM_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_CO_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_CG_SSTABLE == table_type;
}
static bool is_ddl_merge_sstable(const TableType table_type)
{
return ObITable::TableType::DDL_MERGE_CO_SSTABLE == table_type
|| ObITable::TableType::DDL_MERGE_CG_SSTABLE == table_type;
}
static bool is_ddl_mem_co_cg_sstable(const TableType table_type)
{
return ObITable::TableType::DDL_MEM_CG_SSTABLE == table_type
|| ObITable::TableType::DDL_MEM_CO_SSTABLE == table_type;
}
static bool is_table_with_scn_range(const TableType table_type)
{
return is_multi_version_table(table_type) || is_meta_major_sstable(table_type);
}
OB_INLINE static const char* get_table_type_name(const TableType &table_type)
{
return is_table_type_valid(table_type) ? table_type_name_[table_type] : nullptr;
}
protected:
TableKey key_;
int64_t ref_cnt_;
private:
const static char * table_type_name_[];
DISALLOW_COPY_AND_ASSIGN(ObITable);
};
inline void ObITable::inc_ref()
{
int64_t cnt = ATOMIC_AAF(&ref_cnt_, 1);
STORAGE_LOG(DEBUG, "table inc ref", KP(this), "table_key", key_, "ref_cnt", cnt, K(lbt()));
}
inline int64_t ObITable::dec_ref()
{
int64_t cnt = ATOMIC_SAF(&ref_cnt_, 1 /* just sub 1 */);
STORAGE_LOG(DEBUG, "table dec ref", KP(this), "table_key", key_, "ref_cnt", cnt, K(lbt()));
return cnt;
}
class ObTableHandleV2 final
{
friend class ObTablesHandleArray;
public:
ObTableHandleV2();
~ObTableHandleV2();
bool is_valid() const;
void reset();
OB_INLINE ObITable *get_table() { return table_; }
OB_INLINE const ObITable *get_table() const { return table_; }
OB_INLINE common::ObIAllocator *get_allocator() { return allocator_; }
int get_sstable(blocksstable::ObSSTable *&sstable);
int get_sstable(const blocksstable::ObSSTable *&sstable) const;
int get_memtable(memtable::ObIMemtable *&memtable);
int get_memtable(const memtable::ObIMemtable *&memtable) const;
int get_data_memtable(memtable::ObMemtable *&memtable);
int get_data_memtable(const memtable::ObMemtable *&memtable) const;
int get_tx_data_memtable(ObTxDataMemtable *&memtable);
int get_tx_data_memtable(const ObTxDataMemtable *&memtable) const;
int get_tx_ctx_memtable(ObTxCtxMemtable *&memtable);
int get_tx_ctx_memtable(const ObTxCtxMemtable *&memtable) const;
int get_lock_memtable(transaction::tablelock::ObLockMemtable *&memtable);
int get_lock_memtable(const transaction::tablelock::ObLockMemtable *&memtable) const;
ObTableHandleV2(const ObTableHandleV2 &other);
ObTableHandleV2 &operator= (const ObTableHandleV2 &other);
int set_table(ObITable *const table, ObTenantMetaMemMgr *const t3m, const ObITable::TableType table_type);
// TODO: simplify set_sstable interfaces
// only used when create stand alone sstable
int set_sstable(ObITable *table, common::ObIAllocator *allocator);
// set sstable when lifetime is guaranteed by tablet
int set_sstable_with_tablet(ObITable *table);
int set_sstable(ObITable *table, const ObStorageMetaHandle &meta_handle);
TO_STRING_KV(KP_(table), KP(t3m_), KP(allocator_), K(table_type_),
K_(meta_handle), K_(lifetime_guaranteed_by_tablet));
private:
ObITable *table_;
ObTenantMetaMemMgr *t3m_;
common::ObIAllocator *allocator_;
ObStorageMetaHandle meta_handle_;
ObITable::TableType table_type_;
bool lifetime_guaranteed_by_tablet_;
};
class ObTablesHandleArray final
{
public:
typedef common::ObArray<storage::ObTableHandleV2> HandlesArray;
ObTablesHandleArray();
ObTablesHandleArray(const uint64_t tenant_id);
~ObTablesHandleArray();
void reset();
OB_INLINE bool empty() const { return handles_array_.empty(); }
OB_INLINE int64_t get_count() const { return handles_array_.count(); }
OB_INLINE ObITable *get_table(const int64_t idx) const
{
return (idx < 0 || idx >= handles_array_.count()) ? nullptr : handles_array_.at(idx).table_;
}
int get_table(const int64_t idx, ObTableHandleV2 &table_handle) const;
int get_table(const ObITable::TableKey &table_key, ObTableHandleV2 &table_handle) const;
// TODO: simplify this add_sstable interface
int add_sstable(ObITable *table, const ObStorageMetaHandle &meta_handle);
int add_memtable(ObITable *table);
int add_table(const ObTableHandleV2 &handle);
int assign(const ObTablesHandleArray &other);
int get_tables(common::ObIArray<ObITable *> &tables) const;
int get_first_memtable(memtable::ObIMemtable *&memtable) const;
int get_all_minor_sstables(common::ObIArray<ObITable *> &tables) const;
int check_continues(const share::ObScnRange *scn_range) const;
DECLARE_TO_STRING;
private:
int tablet_id_check(const common::ObTabletID &tablet_id);
private:
common::ObTabletID tablet_id_;
HandlesArray handles_array_;
DISALLOW_COPY_AND_ASSIGN(ObTablesHandleArray);
};
OB_INLINE bool ObITable::is_table_type_valid(const TableType &type)
{
return (type >= ObITable::DATA_MEMTABLE && type <= ObITable::LOCK_MEMTABLE)
|| (type >= ObITable::MAJOR_SSTABLE && type < ObITable::MAX_TABLE_TYPE);
}
OB_INLINE bool ObITable::TableKey::is_valid() const
{
bool valid = true;
if (!ObITable::is_table_type_valid(table_type_)) {
valid = false;
} else if (!tablet_id_.is_valid()) {
valid = false;
} else if (ObITable::is_table_with_scn_range(table_type_)
&& !scn_range_.is_valid()) {
valid = false;
} else if (ObITable::is_major_sstable(table_type_)
&& !version_range_.is_valid()) {
valid = false;
}
return valid;
}
OB_INLINE share::SCN ObITable::get_start_scn() const
{
return key_.get_start_scn();
}
OB_INLINE share::SCN ObITable::get_end_scn() const
{
return key_.get_end_scn();
}
bool ObITable::TableKey::operator ==(const TableKey &table_key) const
{
bool bret = table_type_ == table_key.table_type_
&& column_group_idx_ == table_key.column_group_idx_
&& tablet_id_ == table_key.tablet_id_
&& scn_range_ == table_key.scn_range_;
return bret;
}
bool ObITable::TableKey::operator !=(const TableKey &table_key) const
{
return !(this->operator ==(table_key));
}
}//storage
}//oceanbase
#endif /* SRC_STORAGE_OB_I_TABLE_H_ */