tcache.h 5.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 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
#include "os.h"
#include "tref.h"
#include "hash.h"

typedef struct SCacheStatis {
  int64_t missCount;
  int64_t hitCount;
  int64_t totalAccess;
  int64_t refreshCount;
  int32_t numOfCollision;
} SCacheStatis;

typedef struct SCacheDataNode {
  uint64_t addedTime;    // the added time when this element is added or updated into cache
  uint64_t expiredTime;  // expiredTime expiredTime when this element should be remove from cache
  uint64_t signature;
  uint32_t size;         // allocated size for current SCacheDataNode
  uint16_t keySize : 15;
  bool     inTrash : 1;  // denote if it is in trash or not
  T_REF_DECLARE()
  char *key;
  char  data[];
} SCacheDataNode;

typedef struct STrashElem {
  struct STrashElem *prev;
  struct STrashElem *next;
  SCacheDataNode *        pData;
} STrashElem;

typedef struct {
  int64_t totalSize;  // total allocated buffer in this hash table, SCacheObj is not included.
  int64_t refreshTime;
  
  /*
   * to accommodate the old datanode 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
   */
  STrashElem * pTrash;
  void *       tmrCtrl;
  void *       pTimer;
  SCacheStatis statistics;
  SHashObj *   pHashTable;
  int          numOfElemsInTrash;  // number of element in trash
  int16_t      deleting;           // set the deleting flag to stop refreshing ASAP.

#if defined(LINUX)
  pthread_rwlock_t lock;
#else
  pthread_mutex_t lock;
#endif

} SCacheObj;
H
hzcheng 已提交
80 81 82 83 84 85 86 87 88

/**
 *
 * @param maxSessions       maximum slots available for hash elements
 * @param tmrCtrl           timer ctrl
 * @param refreshTime       refresh operation interval time, the maximum survival time when one element is expired and
 *                          not referenced by other objects
 * @return
 */
89
SCacheObj *taosCacheInit(void *tmrCtrl, int64_t refreshTimeInSeconds);
H
hzcheng 已提交
90 91 92 93 94 95 96 97 98 99 100

/**
 * 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
 */
H
hjxilinx 已提交
101
void *taosCachePut(SCacheObj *pCacheObj, const char *key, const void *pData, size_t dataSize, int keepTimeInSeconds);
H
hzcheng 已提交
102 103 104

/**
 * get data from cache
105
 * @param pCacheObj     cache object
H
hzcheng 已提交
106 107 108
 * @param key           key
 * @return              cached data or NULL
 */
109
void *taosCacheAcquireByName(SCacheObj *pCacheObj, const char *key);
H
hzcheng 已提交
110 111

/**
112 113 114 115
 * 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.
 * This procedure is a faster version of taosCacheAcquireByName function, which avoids the sideeffect of the problem of
 * the data is moved to trash, and taosCacheAcquireByName will fail to retrieve it again.
H
hzcheng 已提交
116 117
 *
 * @param handle
118 119
 * @param data
 * @return
H
hzcheng 已提交
120
 */
121
void *taosCacheAcquireByData(SCacheObj *pCacheObj, void *data);
H
hzcheng 已提交
122 123

/**
124
 * transfer the ownership of data in cache to another object without increasing reference count.
H
hzcheng 已提交
125
 * @param handle
126 127
 * @param data
 * @return
H
hzcheng 已提交
128
 */
129
void *taosCacheTransfer(SCacheObj *pCacheObj, void **data);
H
hzcheng 已提交
130

131
/**
132 133 134 135 136 137 138
 * 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
 * @param _remove   force model, reduce the ref count and move the data into
 * pTrash
 */
139
void taosCacheRelease(SCacheObj *pCacheObj, void **data, bool _remove);
140 141 142

/**
 *  move all data node into trash, clear node in trash can if it is not referenced by any clients
143 144
 * @param handle
 */
145
void taosCacheEmpty(SCacheObj *pCacheObj);
146 147

/**
148 149 150 151 152 153 154 155
 * 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.
 *
156 157
 * @param handle
 */
158
void taosCacheCleanup(SCacheObj *pCacheObj);
159

H
hzcheng 已提交
160 161 162 163 164
#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_TCACHE_H