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