tcache.h 6.2 KB
Newer Older
H
hzcheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef TDENGINE_TCACHE_H
#define TDENGINE_TCACHE_H

#ifdef __cplusplus
extern "C" {
#endif

23
#include "os.h"
B
Bomin Zhang 已提交
24
#include "tlockfree.h"
25 26
#include "hash.h"

S
TD-1530  
Shengliang Guan 已提交
27 28 29 30 31 32 33 34
#if defined(_TD_ARM_32) 
  #define TSDB_CACHE_PTR_KEY  TSDB_DATA_TYPE_INT
  #define TSDB_CACHE_PTR_TYPE int32_t
#else
  #define TSDB_CACHE_PTR_KEY  TSDB_DATA_TYPE_BIGINT  
  #define TSDB_CACHE_PTR_TYPE int64_t
#endif

35
typedef void (*__cache_free_fn_t)(void*);
H
Haojun Liao 已提交
36

37 38 39 40 41 42 43
typedef struct SCacheStatis {
  int64_t missCount;
  int64_t hitCount;
  int64_t totalAccess;
  int64_t refreshCount;
} SCacheStatis;

44 45
struct STrashElem;

46
typedef struct SCacheDataNode {
47 48 49 50 51 52
  uint64_t           addedTime;    // the added time when this element is added or updated into cache
  uint64_t           lifespan;     // life duration when this element should be remove from cache
  uint64_t           expireTime;   // expire time
  uint64_t           signature;
  struct STrashElem *pTNodeHeader; // point to trash node head
  uint16_t           keySize: 15;  // max key size: 32kb
H
Haojun Liao 已提交
53
  bool               inTrashcan: 1;// denote if it is in trash or not
54
  uint32_t           size;         // allocated size for current SCacheDataNode
55
  T_REF_DECLARE()
56 57
  char              *key;
  char               data[];
58 59 60 61 62
} SCacheDataNode;

typedef struct STrashElem {
  struct STrashElem *prev;
  struct STrashElem *next;
63
  SCacheDataNode    *pData;
64 65
} STrashElem;

66 67 68 69 70 71 72 73
/*
 * to accommodate the old data which has the same key value of new one in hashList
 * when an new node is put into cache, if an existed one with the same key:
 * 1. if the old one does not be referenced, update it.
 * 2. otherwise, move the old one to pTrash, addedTime the new one.
 *
 * when the node in pTrash does not be referenced, it will be release at the expired expiredTime
 */
74
typedef struct {
75 76 77
  int64_t         totalSize;          // total allocated buffer in this hash table, SCacheObj is not included.
  int64_t         refreshTime;
  STrashElem *    pTrash;
H
Haojun Liao 已提交
78
  char*           name;
79 80
  SCacheStatis    statistics;
  SHashObj *      pHashTable;
81
  __cache_free_fn_t freeFp;
82 83 84
  uint32_t        numOfElemsInTrash;  // number of element in trash
  uint8_t         deleting;           // set the deleting flag to stop refreshing ASAP.
  pthread_t       refreshWorker;
H
Haojun Liao 已提交
85
  bool            extendLifespan;     // auto extend life span when one item is accessed.
86
  int64_t         checkTick;          // tick used to record the check times of the refresh threads
87 88 89
#if defined(LINUX)
  pthread_rwlock_t lock;
#else
H
Haojun Liao 已提交
90
  pthread_mutex_t  lock;
91 92
#endif
} SCacheObj;
H
hzcheng 已提交
93 94

/**
95
 * initialize the cache object
H
Haojun Liao 已提交
96 97 98 99 100
 * @param keyType              key type
 * @param refreshTimeInSeconds refresh operation interval time, the maximum survival time when one element is expired
 *                             and not referenced by other objects
 * @param extendLifespan       auto extend lifespan, if accessed
 * @param fn                   free resource callback function
H
hzcheng 已提交
101 102
 * @return
 */
103
SCacheObj *taosCacheInit(int32_t keyType, int64_t refreshTimeInSeconds, bool extendLifespan, __cache_free_fn_t fn, const char *cacheName);
H
hzcheng 已提交
104 105 106 107 108 109 110 111 112 113 114

/**
 * add data into cache
 *
 * @param handle        cache object
 * @param key           key
 * @param pData         cached data
 * @param dataSize      data size
 * @param keepTime      survival time in second
 * @return              cached element
 */
115
void *taosCachePut(SCacheObj *pCacheObj, const void *key, size_t keyLen, const void *pData, size_t dataSize, int durationMS);
H
hzcheng 已提交
116 117 118

/**
 * get data from cache
119
 * @param pCacheObj     cache object
H
hzcheng 已提交
120 121 122
 * @param key           key
 * @return              cached data or NULL
 */
H
Haojun Liao 已提交
123
void *taosCacheAcquireByKey(SCacheObj *pCacheObj, const void *key, size_t keyLen);
H
hzcheng 已提交
124 125

/**
126 127
 * Add one reference count for the exist data, and assign this data for a new owner.
 * The new owner needs to invoke the taosCacheRelease when it does not need this data anymore.
H
Haojun Liao 已提交
128 129
 * This procedure is a faster version of taosCacheAcquireByKey function, which avoids the sideeffect of the problem of
 * the data is moved to trash, and taosCacheAcquireByKey will fail to retrieve it again.
H
hzcheng 已提交
130 131
 *
 * @param handle
132 133
 * @param data
 * @return
H
hzcheng 已提交
134
 */
135
void *taosCacheAcquireByData(SCacheObj *pCacheObj, void *data);
H
hzcheng 已提交
136 137

/**
138
 * transfer the ownership of data in cache to another object without increasing reference count.
H
hzcheng 已提交
139
 * @param handle
140 141
 * @param data
 * @return
H
hzcheng 已提交
142
 */
143
void *taosCacheTransfer(SCacheObj *pCacheObj, void **data);
H
hzcheng 已提交
144

145
/**
146 147 148 149
 * remove data in cache, the data will not be removed immediately.
 * if it is referenced by other object, it will be remain in cache
 * @param handle    cache object
 * @param data      not the key, actually referenced data
H
Haojun Liao 已提交
150
 * @param _remove   force model, reduce the ref count and move the data into pTrash
151
 */
152
void taosCacheRelease(SCacheObj *pCacheObj, void **data, bool _remove);
153 154 155

/**
 *  move all data node into trash, clear node in trash can if it is not referenced by any clients
156 157
 * @param handle
 */
158
void taosCacheEmpty(SCacheObj *pCacheObj);
159 160

/**
161 162 163 164 165 166 167 168
 * release all allocated memory and destroy the cache object.
 *
 * This function only set the deleting flag, and the specific work of clean up cache is delegated to
 * taosCacheRefresh function, which will executed every SCacheObj->refreshTime sec.
 *
 * If the value of SCacheObj->refreshTime is too large, the taosCacheRefresh function may not be invoked
 * before the main thread terminated, in which case all allocated resources are simply recycled by OS.
 *
169 170
 * @param handle
 */
171
void taosCacheCleanup(SCacheObj *pCacheObj);
172

173 174 175 176 177 178 179 180
/**
 *
 * @param pCacheObj
 * @param fp
 * @return
 */
void taosCacheRefresh(SCacheObj *pCacheObj, __cache_free_fn_t fp);

181 182 183 184 185
/**
 * stop background refresh worker thread
 */
void taosStopCacheRefreshWorker();

H
hzcheng 已提交
186 187 188 189 190
#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_TCACHE_H