[CP] Add schema history cache
This commit is contained in:
@ -385,6 +385,7 @@ int ObMultiVersionSchemaService::get_schema(const ObSchemaMgr *mgr,
|
||||
int ret = OB_SUCCESS;
|
||||
const bool is_lazy = (NULL == mgr);
|
||||
uint64_t tenant_id = schema_status.tenant_id_;
|
||||
bool update_history_cache = false;
|
||||
schema = NULL;
|
||||
if (TENANT_SCHEMA == schema_type && !is_sys_tenant(tenant_id)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
@ -473,51 +474,66 @@ int ObMultiVersionSchemaService::get_schema(const ObSchemaMgr *mgr,
|
||||
}
|
||||
if (OB_SUCC(ret) && !not_exist) {
|
||||
int i = 0;
|
||||
int64_t precise_version = OB_INVALID_VERSION;
|
||||
for (; i < val.valid_cnt_; ++i) {
|
||||
if (val.versions_[i] <= schema_version) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < val.valid_cnt_) {
|
||||
const int64_t precise_version = val.versions_[i];
|
||||
if (0 == i && val.is_deleted_) {
|
||||
not_exist = true;
|
||||
LOG_INFO("schema has been deleted under specified version", K(ret),
|
||||
LOG_INFO("schema has been deleted under specified version", KR(ret),
|
||||
K(key), K(val), K(schema_version), K(precise_version));
|
||||
} else {
|
||||
// Access cache with accurate version
|
||||
if (OB_FAIL(schema_cache_.get_schema(schema_type,
|
||||
tenant_id,
|
||||
schema_id,
|
||||
precise_version,
|
||||
handle,
|
||||
schema))) {
|
||||
if (ret != OB_ENTRY_NOT_EXIST) {
|
||||
LOG_WARN("get schema from cache failed", K(tenant_id), K(key),
|
||||
K(schema_version), K(precise_version), K(ret));
|
||||
} else {
|
||||
ret = OB_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
// Accurate version hits, return directly
|
||||
LOG_TRACE("precise version hit", K(tenant_id), K(key),
|
||||
K(schema_version), K(precise_version), K(schema_id),
|
||||
"schema_type", schema_type_str(schema_type));
|
||||
has_hit = true;
|
||||
}
|
||||
precise_version = val.versions_[i];
|
||||
}
|
||||
} else if (schema_version < val.min_version_) {
|
||||
not_exist = true;
|
||||
LOG_INFO("schema has not been created under specified version", K(ret),
|
||||
K(tenant_id), K(key), K(val), K(schema_version));
|
||||
LOG_INFO("schema has not been created under specified version",
|
||||
KR(ret), K(key), K(val), K(schema_version));
|
||||
} else if (schema_version == val.min_version_) {
|
||||
precise_version = val.min_version_;
|
||||
LOG_INFO("use min schema version as precise schema version",
|
||||
KR(ret), K(key), K(val), K(schema_version));
|
||||
} else {
|
||||
// i >= cnt
|
||||
// Older than the cached version, this situation is considered to be a very rare scenario,
|
||||
// the "two" in the 28 theory
|
||||
// directly uses the given schema_version to look up the table
|
||||
LOG_INFO("precise version not founded since schema version is too old, " \
|
||||
"will retrieve it from inner table", K(tenant_id), K(key), K(val),
|
||||
K(schema_version), "schema_type", schema_type_str(schema_type));
|
||||
// i >= cnt && schema_version > val.min_version_
|
||||
// try use discrete schema version relationship
|
||||
if (OB_FAIL(schema_cache_.get_schema_history_cache(
|
||||
schema_type, tenant_id, schema_id, schema_version, precise_version))) {
|
||||
if (OB_ENTRY_NOT_EXIST != ret) {
|
||||
LOG_WARN("get schema history cache failed",
|
||||
KR(ret), K(schema_type), K(tenant_id), K(schema_id), K(schema_version));
|
||||
} else {
|
||||
ret = OB_SUCCESS;
|
||||
update_history_cache = true;
|
||||
LOG_INFO("precise version not founded since schema version is too old, " \
|
||||
"will retrieve it from inner table", KR(ret), K(key), K(val),
|
||||
K(schema_version), "schema_type", schema_type_str(schema_type));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// try use precise_version
|
||||
if (OB_SUCC(ret) && precise_version > 0) {
|
||||
if (OB_FAIL(schema_cache_.get_schema(schema_type,
|
||||
tenant_id,
|
||||
schema_id,
|
||||
precise_version,
|
||||
handle,
|
||||
schema))) {
|
||||
if (ret != OB_ENTRY_NOT_EXIST) {
|
||||
LOG_WARN("get schema from cache failed", KR(ret), K(key),
|
||||
K(schema_version), K(precise_version));
|
||||
} else {
|
||||
ret = OB_SUCCESS;
|
||||
}
|
||||
} else {
|
||||
LOG_TRACE("precise version hit", K(key), K(schema_version), K(precise_version),
|
||||
K(tenant_id), K(schema_id), "schema_type", schema_type_str(schema_type));
|
||||
has_hit = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -642,6 +658,11 @@ int ObMultiVersionSchemaService::get_schema(const ObSchemaMgr *mgr,
|
||||
schema))) {
|
||||
LOG_WARN("put and fetch schema failed", K(tenant_id), K(schema_type),
|
||||
K(schema_id), K(precise_version), K(schema_version), KR(ret));
|
||||
} else if (update_history_cache
|
||||
&& OB_FAIL(schema_cache_.put_schema_history_cache(
|
||||
schema_type, tenant_id, schema_id, schema_version, precise_version))) {
|
||||
LOG_WARN("fail to put schema history cache", KR(ret), K(schema_type),
|
||||
K(tenant_id), K(schema_id), K(schema_version), K(precise_version));
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
|
||||
Reference in New Issue
Block a user