Eneboo - Documentación para desarrolladores
|
00001 /* Copyright (C) 2003 MySQL AB 00002 00003 This program is free software; you can redistribute it and/or modify 00004 it under the terms of the GNU General Public License as published by 00005 the Free Software Foundation; version 2 of the License. 00006 00007 This program is distributed in the hope that it will be useful, 00008 but WITHOUT ANY WARRANTY; without even the implied warranty of 00009 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00010 GNU General Public License for more details. 00011 00012 You should have received a copy of the GNU General Public License 00013 along with this program; if not, write to the Free Software 00014 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ 00015 00016 /* Key cache variable structures */ 00017 00018 #ifndef _keycache_h 00019 #define _keycache_h 00020 C_MODE_START 00021 00022 /* declare structures that is used by st_key_cache */ 00023 00024 struct st_block_link; 00025 typedef struct st_block_link BLOCK_LINK; 00026 struct st_keycache_page; 00027 typedef struct st_keycache_page KEYCACHE_PAGE; 00028 struct st_hash_link; 00029 typedef struct st_hash_link HASH_LINK; 00030 00031 /* info about requests in a waiting queue */ 00032 typedef struct st_keycache_wqueue 00033 { 00034 struct st_my_thread_var *last_thread; /* circular list of waiting threads */ 00035 } KEYCACHE_WQUEUE; 00036 00037 #define CHANGED_BLOCKS_HASH 128 /* must be power of 2 */ 00038 00039 /* 00040 The key cache structure 00041 It also contains read-only statistics parameters. 00042 */ 00043 00044 typedef struct st_key_cache 00045 { 00046 my_bool key_cache_inited; 00047 my_bool resize_in_flush; /* true during flush of resize operation */ 00048 my_bool can_be_used; /* usage of cache for read/write is allowed */ 00049 ulong key_cache_mem_size; /* specified size of the cache memory */ 00050 uint key_cache_block_size; /* size of the page buffer of a cache block */ 00051 ulong min_warm_blocks; /* min number of warm blocks; */ 00052 ulong age_threshold; /* age threshold for hot blocks */ 00053 ulonglong keycache_time; /* total number of block link operations */ 00054 uint hash_entries; /* max number of entries in the hash table */ 00055 int hash_links; /* max number of hash links */ 00056 int hash_links_used; /* number of hash links currently used */ 00057 int disk_blocks; /* max number of blocks in the cache */ 00058 ulong blocks_used; /* maximum number of concurrently used blocks */ 00059 ulong blocks_unused; /* number of currently unused blocks */ 00060 ulong blocks_changed; /* number of currently dirty blocks */ 00061 ulong warm_blocks; /* number of blocks in warm sub-chain */ 00062 ulong cnt_for_resize_op; /* counter to block resize operation */ 00063 long blocks_available; /* number of blocks available in the LRU chain */ 00064 HASH_LINK **hash_root; /* arr. of entries into hash table buckets */ 00065 HASH_LINK *hash_link_root; /* memory for hash table links */ 00066 HASH_LINK *free_hash_list; /* list of free hash links */ 00067 BLOCK_LINK *free_block_list; /* list of free blocks */ 00068 BLOCK_LINK *block_root; /* memory for block links */ 00069 byte HUGE_PTR *block_mem; /* memory for block buffers */ 00070 BLOCK_LINK *used_last; /* ptr to the last block of the LRU chain */ 00071 BLOCK_LINK *used_ins; /* ptr to the insertion block in LRU chain */ 00072 pthread_mutex_t cache_lock; /* to lock access to the cache structure */ 00073 KEYCACHE_WQUEUE resize_queue; /* threads waiting during resize operation */ 00074 KEYCACHE_WQUEUE waiting_for_hash_link; /* waiting for a free hash link */ 00075 KEYCACHE_WQUEUE waiting_for_block; /* requests waiting for a free block */ 00076 BLOCK_LINK *changed_blocks[CHANGED_BLOCKS_HASH]; /* hash for dirty file bl.*/ 00077 BLOCK_LINK *file_blocks[CHANGED_BLOCKS_HASH]; /* hash for other file bl.*/ 00078 00079 /* 00080 The following variables are and variables used to hold parameters for 00081 initializing the key cache. 00082 */ 00083 00084 ulonglong param_buff_size; /* size the memory allocated for the cache */ 00085 ulong param_block_size; /* size of the blocks in the key cache */ 00086 ulong param_division_limit; /* min. percentage of warm blocks */ 00087 ulong param_age_threshold; /* determines when hot block is downgraded */ 00088 00089 /* Statistics variables. These are reset in reset_key_cache_counters(). */ 00090 ulong global_blocks_changed; /* number of currently dirty blocks */ 00091 ulonglong global_cache_w_requests;/* number of write requests (write hits) */ 00092 ulonglong global_cache_write; /* number of writes from cache to files */ 00093 ulonglong global_cache_r_requests;/* number of read requests (read hits) */ 00094 ulonglong global_cache_read; /* number of reads from files to cache */ 00095 00096 int blocks; /* max number of blocks in the cache */ 00097 my_bool in_init; /* Set to 1 in MySQL during init/resize */ 00098 } KEY_CACHE; 00099 00100 /* The default key cache */ 00101 extern KEY_CACHE dflt_key_cache_var, *dflt_key_cache; 00102 00103 extern int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, 00104 ulong use_mem, uint division_limit, 00105 uint age_threshold); 00106 extern int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size, 00107 ulong use_mem, uint division_limit, 00108 uint age_threshold); 00109 extern void change_key_cache_param(KEY_CACHE *keycache, uint division_limit, 00110 uint age_threshold); 00111 extern byte *key_cache_read(KEY_CACHE *keycache, 00112 File file, my_off_t filepos, int level, 00113 byte *buff, uint length, 00114 uint block_length,int return_buffer); 00115 extern int key_cache_insert(KEY_CACHE *keycache, 00116 File file, my_off_t filepos, int level, 00117 byte *buff, uint length); 00118 extern int key_cache_write(KEY_CACHE *keycache, 00119 File file, my_off_t filepos, int level, 00120 byte *buff, uint length, 00121 uint block_length,int force_write); 00122 extern int flush_key_blocks(KEY_CACHE *keycache, 00123 int file, enum flush_type type); 00124 extern void end_key_cache(KEY_CACHE *keycache, my_bool cleanup); 00125 00126 /* Functions to handle multiple key caches */ 00127 extern my_bool multi_keycache_init(void); 00128 extern void multi_keycache_free(void); 00129 extern KEY_CACHE *multi_key_cache_search(byte *key, uint length); 00130 extern my_bool multi_key_cache_set(const byte *key, uint length, 00131 KEY_CACHE *key_cache); 00132 extern void multi_key_cache_change(KEY_CACHE *old_data, 00133 KEY_CACHE *new_data); 00134 extern int reset_key_cache_counters(const char *name, 00135 KEY_CACHE *key_cache); 00136 C_MODE_END 00137 #endif /* _keycache_h */