Files
openGauss-server/src/include/utils/knl_globalbasedefcache.h
openGaussDev b77b6b371f optimize GSC memory state
Offering: openGaussDev
More detail: optimize GSC memory state
2024-08-06 15:28:04 +08:00

151 lines
5.4 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_globalbasedefcache.h
*
*
*
* IDENTIFICATION
* src/include/utils/knl_globalbasedefcache.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef KNL_GLOBALBASEDEFCACHE_H
#define KNL_GLOBALBASEDEFCACHE_H
#include "nodes/memnodes.h"
#include "postgres.h"
#include "utils/knl_globalsyscache_common.h"
#include "utils/knl_globalsystupcache.h"
#include "utils/palloc.h"
/*
* GSC's base class, normally as super class for RelCache CatCache
* (1). class GlobalTabDefCache for "RelCache" see details in knl_globaltabdefcache.cpp
* (2). class GlobalPartDefCache for "PartCache" see details in knl_globalpartdefcache.cpp
*/
class GlobalBaseDefCache : public BaseObject {
public:
GlobalBaseDefCache(Oid dbOid, bool isShared, struct GlobalSysDBCacheEntry *entry, char relkind);
virtual ~GlobalBaseDefCache() {}
/* simple getter/setter routines in GSC base class */
/*
* Return the number of "active elements" in current GSC object(RelCache, PartCache)
* depends on where it inheritend
*/
inline uint64 GetActiveElementsNum()
{
return m_bucket_list.GetActiveElementCount();
}
/*
* Return the number of "dead elements" in current GSC object(RelCache, PartCache)
* depends on where it inheritend
*/
inline uint64 GetDeadElementsNum()
{
return m_dead_entries.GetLength();
}
/*
* Return the object lock for rel when being inserted into current GSC
*/
inline pthread_rwlock_t *GetHashValueLock(uint32 hash_value)
{
Assert(m_oid_locks != NULL);
Index hash_index = HASH_INDEX(hash_value, m_nbuckets);
return m_oid_locks + hash_index;
}
template <bool is_relation>
void RemoveAllTailElements();
template <bool is_relation> void FreeDeadElements(); /* free elem */
protected:
/* base class initialization funciton */
void Init(int nbucket);
void InitHashTable();
/*
* Cache entry lookup related functions
*
* Note: Normally, besides objOid we also pass in hash_value/hash_index to avoid
* hashfunc recalculation, oid here indicates its inheritant class relOid or
* partRelOid.
*/
/* search an entry with given obj_oid and hash_value, */
GlobalBaseEntry *SearchReadOnly(Oid objOid, uint32 hash_value);
/* search and entry with given objOid/hash_index*/
GlobalBaseEntry *FindEntryWithIndex(Oid objOid, Index hash_index, int *location);
/* check given objOid and hash_index exist */
bool EntryExist(Oid objOid, Index hash_index);
/* functions to handle message invalidation */
template <bool is_relation> void Invalidate(Oid dbOid, Oid objOid);
template <bool is_relation> void InvalidateRelationNodeListBy(bool (*IsInvalidEntry)(GlobalBaseEntry *));
/* fucntions to remove/free elem from GSC hashtable */
template <bool is_relation> void HandleDeadEntry(GlobalBaseEntry *entry); /* remove from hashtable */
/* function to handle GSC memory swapout */
template <bool is_relation, bool force> void ResetCaches();
template <bool is_relation> void RemoveTailElements(Index hash_index);
/* function to add/remove elem to GSC hashtable */
template <bool is_relation> void AddHeadToBucket(Index hash_index, GlobalBaseEntry *base);
/* GSC Identifier fields */
Oid m_db_oid;
/* GSC status control fields */
bool m_is_shared;
bool m_is_inited;
char m_relkind; /* dev-debug only, no real process so far */
volatile uint32 *m_is_swappingouts;
volatile uint32 m_recovery_basedef_flag;
/* GSC statistic information, assigned from GlobalSysCacheStat class */
volatile uint64 *m_searches;
volatile uint64 *m_hits;
volatile uint64 *m_newloads;
volatile uint64 m_base_space;
/* GSC container fields */
GlobalBucketList m_bucket_list; /* GSC hashtable to hold buckets/elements */
int m_nbuckets; /* GSC hashtable's bucket num, assigned in constructor */
pthread_rwlock_t *m_obj_locks; /* GSC internal bucket level locks, type as array
with length m_nbuckets */
/* List with elem removed from current GSC, its element type couble be
* 1. GlobalRelationEntry(for RelCache)
* 2. GlobalPartEntry(for PartCache)
*
* Note: CatCache's dead list implemented in its original way
*/
DllistWithLock m_dead_entries;
pthread_rwlock_t *m_oid_locks; /* locks for GSC object, partRelOid or relOid, avoid xact
commit thread conflict with other threads */
/* GSC other fields */
struct GlobalSysDBCacheEntry *m_db_entry; /* pointer to global DB-level syscache pointer */
};
#endif