Files
openGauss-server/src/include/utils/knl_localsystabcache.h
openGaussDev 0c08e764e0 Global SysCache
Offering: openGaussDev

More detail:
修复闪回功能未适配GSC导致DDL数据无法丢弃问题

# Conflicts:
#	src/gausskernel/storage/tcap/tcap_truncate.cpp

Match-id-e09ce9c267ac9ae227186b0e7cbc9377b1cfb06a
2022-03-14 19:34:44 +08:00

275 lines
9.2 KiB
C++

/*
* Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* 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 PSL v2 for more details.
* ---------------------------------------------------------------------------------------
*
* knl_localsystabcache.h
*
*
*
* IDENTIFICATION
* src/include/utils/knl_localsystabcache.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef KNL_LOCALSYSTABCACHE_H
#define KNL_LOCALSYSTABCACHE_H
#include "utils/catcache.h"
#include "utils/inval.h"
#include "utils/knl_localsystupcache.h"
using FetTupleFrom = HeapTuple (*)(CatCList *, int);
class LocalSysTabCache : public BaseObject {
public:
/* common interface */
LocalSysTabCache()
{
m_is_inited = false;
local_systupcaches = NULL;
CatCacheNeedEOXActWork = false;
}
void ResetInitFlag(bool include_shared)
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
if (!include_shared && local_systupcaches[cache_id]->GetCCRelIsShared()) {
continue;
}
local_systupcaches[cache_id]->ResetInitFlag();
}
m_is_inited = false;
}
void AtEOXact_CatCache(bool isCommit)
{
if (!CatCacheNeedEOXActWork) {
return;
}
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
local_systupcaches[cache_id]->AtEOXact_CatCache(isCommit);
}
CatCacheNeedEOXActWork = false;
}
/* systup may be shared table cache. not cleaned when cleardb */
MemoryContext GetLocalTupCacheMemoryCxt(Oid cache_id)
{
return local_systupcaches[cache_id]->GetMemoryCxt();
}
// call when rebuild db
void ReleaseGlobalRefcount(bool include_shared)
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
if (!include_shared && local_systupcaches[cache_id]->GetCCRelIsShared()) {
continue;
}
local_systupcaches[cache_id]->ReleaseGlobalRefcount();
}
}
void ResetCatalogCaches()
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
local_systupcaches[cache_id]->ResetCatalogCache();
}
}
void CatalogCacheFlushCatalogLocal(Oid rel_oid)
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
Assert(cacheinfo[cache_id].reloid == local_systupcaches[cache_id]->GetCCRelOid() && m_is_inited);
if (cacheinfo[cache_id].reloid == rel_oid) {
/* Yes, so flush all its contents */
local_systupcaches[cache_id]->ResetCatalogCache();
/* Tell inval.c to call syscache callbacks for this cache */
/* sessionsyscachecallback called by SessionCatCacheCallBack */
CallThreadSyscacheCallbacks(cache_id, 0);
}
}
}
void CatalogCacheFlushCatalogGlobal(Oid db_id, Oid rel_oid, bool is_commit)
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
Assert(cacheinfo[cache_id].reloid == local_systupcaches[cache_id]->GetCCRelOid());
if (cacheinfo[cache_id].reloid == rel_oid) {
local_systupcaches[cache_id]->ResetGlobal(db_id, is_commit);
}
}
}
void CatCacheCallBack(Oid rel_oid)
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
Assert(cacheinfo[cache_id].reloid == local_systupcaches[cache_id]->GetCCRelOid() && m_is_inited);
if (cacheinfo[cache_id].reloid == rel_oid) {
CallThreadSyscacheCallbacks(cache_id, 0);
}
}
}
void SessionCatCacheCallBack(Oid rel_oid)
{
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
Assert(cacheinfo[cache_id].reloid == local_systupcaches[cache_id]->GetCCRelOid() && m_is_inited);
if (cacheinfo[cache_id].reloid == rel_oid) {
CallSessionSyscacheCallbacks(cache_id, 0);
}
}
}
void CacheIdHashValueInvalidateLocal(int cache_id, uint32 hash_value)
{
local_systupcaches[cache_id]->HashValueInvalidateLocal(hash_value);
}
void CacheIdHashValueInvalidateGlobal(Oid db_id, int cache_id, uint32 hash_value, bool is_commit)
{
local_systupcaches[cache_id]->HashValueInvalidateGlobal(db_id, hash_value, is_commit);
}
void PrepareToInvalidateCacheTuple(Relation relation, HeapTuple tuple, HeapTuple newtuple,
void (*function)(int, uint32, Oid))
{
Oid reloid;
CACHE1_elog(DEBUG2, "RelationHeapTupleInvalidate: called");
/*
* sanity checks
*/
Assert(RelationIsValid(relation));
Assert(HeapTupleIsValid(tuple));
reloid = RelationGetRelid(relation);
/* ----------------
* for each cache
* if the cache contains tuples from the specified relation
* compute the tuple's hash value(s) in this cache,
* and call the GlobalCatalogCacheIdInvalidate.
* ----------------
*/
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
Assert(cacheinfo[cache_id].reloid == local_systupcaches[cache_id]->GetCCRelOid() && m_is_inited);
if (cacheinfo[cache_id].reloid != reloid) {
continue;
}
local_systupcaches[cache_id]->PrepareToInvalidateCacheTuple(tuple, newtuple, function);
}
CatCacheNeedEOXActWork = true;
}
void CreateObject();
void CreateCatBuckets();
void Init()
{
if (m_is_inited) {
return;
}
for (int cache_id = 0; cache_id < SysCacheSize; cache_id++) {
local_systupcaches[cache_id]->Init();
}
m_is_inited = true;
}
/*
* GetCatCacheHashValue
*
* Compute the hash value for a given set of search keys.
*
* The reason for exposing this as part of the API is that the hash value is
* exposed in cache invalidation operations, so there are places outside the
* LocalCatCache code that need to be able to compute the hash values.
*/
uint32 GetCatCacheHashValue(int cache_id, Datum v1, Datum v2, Datum v3, Datum v4)
{
return local_systupcaches[cache_id]->GetCatCacheHashValue(v1, v2, v3, v4);
}
const TupleDesc GetCCTupleDesc(int cache_id)
{
return local_systupcaches[cache_id]->GetCCTupleDesc();
}
const LocalSysTupCache *GetLocalSysTupCache(int cache_id)
{
return local_systupcaches[cache_id];
}
/* search interface */
HeapTuple SearchTuple(int cache_id, Datum v1, Datum v2, Datum v3, Datum v4, int level = DEBUG2)
{
return SearchTupleN(cache_id, local_systupcaches[cache_id]->GetCCNKeys(), v1, v2, v3, v4, level);
}
/*
* SearchTupleN() are SearchTuple() versions for a specific number of
* arguments. The compiler can inline the body and unroll loops, making them a
* bit faster than SearchTuple().
*/
HeapTuple SearchTuple1(int cache_id, Datum v1)
{
return SearchTupleN(cache_id, 1, v1, 0, 0, 0);
}
HeapTuple SearchTuple2(int cache_id, Datum v1, Datum v2)
{
return SearchTupleN(cache_id, 2, v1, v2, 0, 0);
}
HeapTuple SearchTuple3(int cache_id, Datum v1, Datum v2, Datum v3)
{
return SearchTupleN(cache_id, 3, v1, v2, v3, 0);
}
HeapTuple SearchTuple4(int cache_id, Datum v1, Datum v2, Datum v3, Datum v4)
{
return SearchTupleN(cache_id, 4, v1, v2, v3, v4);
}
#ifndef ENABLE_MULTIPLE_NODES
/*
* Specific SearchTuple Function to support ProcedureCreate!
*/
HeapTuple SearchTupleForProcAllArgs(Datum v1, Datum v2, Datum v3, Datum v4, Datum proArgModes)
{
LocalCatCTup *ct = local_systupcaches[PROCALLARGS]->SearchLocalCatCTupleForProcAllArgs(
v1, v2, v3, v4, proArgModes);
if (ct == NULL) {
return NULL;
}
return &ct->global_ct->tuple;
}
#endif
CatCList *SearchCatCList(int cache_id, int nkeys, Datum v1, Datum v2, Datum v3, Datum v4, int level = DEBUG2)
{
Assert(m_is_inited);
LocalCatCList *tuples = local_systupcaches[cache_id]->SearchLocalCatCList(nkeys, v1, v2, v3, v4, level);
CatCList *cl = (CatCList *)tuples;
return cl;
}
/* catcahe manage struct */
LocalSysTupCache **local_systupcaches;
private:
HeapTuple SearchTupleN(int cache_id, int nkeys, Datum v1, Datum v2, Datum v3, Datum v4, int level = DEBUG2)
{
Assert(m_is_inited);
LocalCatCTup *ct = local_systupcaches[cache_id]->SearchLocalCatCTuple(nkeys, v1, v2, v3, v4, level);
if (ct == NULL) {
return NULL;
}
return &ct->global_ct->tuple;
}
bool m_is_inited;
bool CatCacheNeedEOXActWork;
};
#endif