mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			212 lines
		
	
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
 | 
						|
 | 
						|
   This program is free software; you can redistribute it and/or modify
 | 
						|
   it under the terms of the GNU General Public License as published by
 | 
						|
   the Free Software Foundation; version 2 of the License.
 | 
						|
 | 
						|
   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.  See the
 | 
						|
   GNU General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU General Public License
 | 
						|
   along with this program; if not, write to the Free Software
 | 
						|
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335  USA */
 | 
						|
 | 
						|
/* Key cache variable structures */
 | 
						|
 | 
						|
#ifndef _keycache_h
 | 
						|
#define _keycache_h
 | 
						|
 | 
						|
#include "my_sys.h"                             /* flush_type */
 | 
						|
 | 
						|
C_MODE_START
 | 
						|
 | 
						|
/* 
 | 
						|
  Currently the default key cache is created as non-partitioned at 
 | 
						|
  the start of the server unless the server is started with the parameter 
 | 
						|
  --key-cache-partitions that is greater than 0
 | 
						|
*/
 | 
						|
 | 
						|
#define DEFAULT_KEY_CACHE_PARTITIONS    0
 | 
						|
 | 
						|
/* 
 | 
						|
  MAX_KEY_CACHE_PARTITIONS cannot be greater than 
 | 
						|
  sizeof(MYISAM_SHARE::dirty_part_map)
 | 
						|
  Currently sizeof(MYISAM_SHARE::dirty_part_map)=sizeof(ulonglong)
 | 
						|
*/
 | 
						|
 | 
						|
#define MAX_KEY_CACHE_PARTITIONS    64
 | 
						|
 | 
						|
/* The structure to get statistical data about a key cache */
 | 
						|
 | 
						|
typedef struct st_key_cache_statistics
 | 
						|
{
 | 
						|
  ulonglong mem_size;       /* memory for cache buffers/auxiliary structures */
 | 
						|
  ulonglong block_size;     /* size of the each buffers in the key cache     */
 | 
						|
  ulonglong blocks_used;    /* maximum number of used blocks/buffers         */ 
 | 
						|
  ulonglong blocks_unused;  /* number of currently unused blocks             */
 | 
						|
  ulonglong blocks_changed; /* number of currently dirty blocks              */
 | 
						|
  ulonglong blocks_warm;    /* number of blocks in warm sub-chain            */
 | 
						|
  ulonglong read_requests;  /* number of read requests (read hits)           */
 | 
						|
  ulonglong reads;        /* number of actual reads from files into buffers  */
 | 
						|
  ulonglong write_requests; /* number of write requests (write hits)         */
 | 
						|
  ulonglong writes;       /* number of actual writes from buffers into files */
 | 
						|
} KEY_CACHE_STATISTICS;
 | 
						|
 | 
						|
#define NUM_LONG_KEY_CACHE_STAT_VARIABLES 3
 | 
						|
 | 
						|
/* The type of a key cache object */
 | 
						|
typedef enum key_cache_type
 | 
						|
{
 | 
						|
  SIMPLE_KEY_CACHE,         
 | 
						|
  PARTITIONED_KEY_CACHE
 | 
						|
} KEY_CACHE_TYPE;
 | 
						|
 | 
						|
 | 
						|
typedef
 | 
						|
  int    (*INIT_KEY_CACHE)  
 | 
						|
           (void *, uint key_cache_block_size,
 | 
						|
            size_t use_mem, uint division_limit, uint age_threshold,
 | 
						|
            uint changed_blocks_hash_size);
 | 
						|
typedef
 | 
						|
  int    (*RESIZE_KEY_CACHE)
 | 
						|
           (void *, uint key_cache_block_size,
 | 
						|
            size_t use_mem, uint division_limit, uint age_threshold,
 | 
						|
            uint changed_blocks_hash_size);
 | 
						|
typedef
 | 
						|
  void   (*CHANGE_KEY_CACHE_PARAM)
 | 
						|
           (void *keycache_cb,
 | 
						|
            uint division_limit, uint age_threshold);
 | 
						|
typedef
 | 
						|
  uchar* (*KEY_CACHE_READ)
 | 
						|
           (void *keycache_cb,
 | 
						|
            File file, my_off_t filepos, int level,
 | 
						|
            uchar *buff, uint length,
 | 
						|
            uint block_length, int return_buffer);
 | 
						|
typedef
 | 
						|
  int    (*KEY_CACHE_INSERT)
 | 
						|
           (void *keycache_cb,
 | 
						|
            File file, my_off_t filepos, int level,
 | 
						|
            uchar *buff, uint length);
 | 
						|
typedef
 | 
						|
  int    (*KEY_CACHE_WRITE)
 | 
						|
           (void *keycache_cb,
 | 
						|
            File file, void *file_extra,
 | 
						|
            my_off_t filepos, int level,
 | 
						|
            uchar *buff, uint length, 
 | 
						|
            uint block_length, int force_write);
 | 
						|
typedef
 | 
						|
  int    (*FLUSH_KEY_BLOCKS)
 | 
						|
           (void *keycache_cb,
 | 
						|
            int file, void *file_extra,
 | 
						|
            enum flush_type type); 
 | 
						|
typedef
 | 
						|
  int    (*RESET_KEY_CACHE_COUNTERS)
 | 
						|
           (const char *name, void *keycache_cb); 
 | 
						|
typedef
 | 
						|
  void   (*END_KEY_CACHE)
 | 
						|
           (void *keycache_cb, my_bool cleanup);
 | 
						|
typedef
 | 
						|
  void   (*GET_KEY_CACHE_STATISTICS)
 | 
						|
           (void *keycache_cb, uint partition_no, 
 | 
						|
            KEY_CACHE_STATISTICS *key_cache_stats); 
 | 
						|
 | 
						|
/*
 | 
						|
  An object of the type KEY_CACHE_FUNCS contains pointers to all functions
 | 
						|
  from the key cache interface.
 | 
						|
  Currently a key cache can be of two types: simple and partitioned.
 | 
						|
  For each of them its own static structure of the type KEY_CACHE_FUNCS is
 | 
						|
  defined . The structures contain the pointers to the implementations of
 | 
						|
  the interface functions used by simple key caches and partitioned key
 | 
						|
  caches respectively. Pointers to these structures are assigned to key cache
 | 
						|
  objects at the time of their creation.
 | 
						|
*/   
 | 
						|
 | 
						|
typedef struct st_key_cache_funcs 
 | 
						|
{
 | 
						|
  INIT_KEY_CACHE init;
 | 
						|
  RESIZE_KEY_CACHE         resize;
 | 
						|
  CHANGE_KEY_CACHE_PARAM   change_param;     
 | 
						|
  KEY_CACHE_READ           read;
 | 
						|
  KEY_CACHE_INSERT         insert;
 | 
						|
  KEY_CACHE_WRITE          write;
 | 
						|
  FLUSH_KEY_BLOCKS         flush;
 | 
						|
  RESET_KEY_CACHE_COUNTERS reset_counters; 
 | 
						|
  END_KEY_CACHE            end;
 | 
						|
  GET_KEY_CACHE_STATISTICS get_stats; 
 | 
						|
} KEY_CACHE_FUNCS;
 | 
						|
 | 
						|
 | 
						|
typedef struct st_key_cache
 | 
						|
{
 | 
						|
  KEY_CACHE_TYPE key_cache_type; /* type of the key cache used for debugging */
 | 
						|
  void *keycache_cb;             /* control block of the used key cache      */
 | 
						|
  KEY_CACHE_FUNCS *interface_funcs; /* interface functions of the key cache  */
 | 
						|
  ulonglong param_buff_size;     /* size the memory allocated for the cache  */
 | 
						|
  ulonglong param_block_size;    /* size of the blocks in the key cache      */
 | 
						|
  ulonglong param_division_limit;/* min. percentage of warm blocks           */
 | 
						|
  ulonglong param_age_threshold; /* determines when hot block is downgraded  */
 | 
						|
  ulonglong param_partitions;    /* number of the key cache partitions       */
 | 
						|
  ulonglong changed_blocks_hash_size; /* number of hash buckets for changed files */
 | 
						|
  my_bool key_cache_inited;      /* <=> key cache has been created           */
 | 
						|
  my_bool can_be_used;           /* usage of cache for read/write is allowed */
 | 
						|
  my_bool in_init;               /* set to 1 in MySQL during init/resize     */
 | 
						|
  uint partitions;               /* actual number of partitions              */
 | 
						|
  size_t key_cache_mem_size;     /* specified size of the cache memory       */
 | 
						|
  pthread_mutex_t op_lock;       /* to serialize operations like 'resize'    */
 | 
						|
} KEY_CACHE;
 | 
						|
 | 
						|
 | 
						|
/* The default key cache */
 | 
						|
extern KEY_CACHE dflt_key_cache_var, *dflt_key_cache;
 | 
						|
 | 
						|
extern int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
 | 
						|
			  size_t use_mem, uint division_limit,
 | 
						|
			  uint age_threshold, uint changed_blocks_hash_size,
 | 
						|
                          uint partitions);
 | 
						|
extern int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
 | 
						|
			    size_t use_mem, uint division_limit,
 | 
						|
			    uint age_threshold, uint changed_blocks_hash_size);
 | 
						|
extern void change_key_cache_param(KEY_CACHE *keycache, uint division_limit,
 | 
						|
				   uint age_threshold);
 | 
						|
extern uchar *key_cache_read(KEY_CACHE *keycache,
 | 
						|
                            File file, my_off_t filepos, int level,
 | 
						|
                            uchar *buff, uint length,
 | 
						|
			    uint block_length,int return_buffer);
 | 
						|
extern int key_cache_insert(KEY_CACHE *keycache,
 | 
						|
                            File file, my_off_t filepos, int level,
 | 
						|
                            uchar *buff, uint length);
 | 
						|
extern int key_cache_write(KEY_CACHE *keycache,
 | 
						|
                           File file, void *file_extra,
 | 
						|
                           my_off_t filepos, int level,
 | 
						|
                           uchar *buff, uint length,
 | 
						|
			   uint block_length, int force_write);
 | 
						|
extern int flush_key_blocks(KEY_CACHE *keycache,
 | 
						|
                            int file, void *file_extra,
 | 
						|
                            enum flush_type type);
 | 
						|
extern void end_key_cache(KEY_CACHE *keycache, my_bool cleanup);
 | 
						|
extern void get_key_cache_statistics(KEY_CACHE *keycache,
 | 
						|
                                     uint partition_no, 
 | 
						|
                                     KEY_CACHE_STATISTICS *key_cache_stats);
 | 
						|
 | 
						|
/* Functions to handle multiple key caches */
 | 
						|
extern my_bool multi_keycache_init(void);
 | 
						|
extern void multi_keycache_free(void);
 | 
						|
extern KEY_CACHE *multi_key_cache_search(uchar *key, uint length,
 | 
						|
                                         KEY_CACHE *def);
 | 
						|
extern my_bool multi_key_cache_set(const uchar *key, uint length,
 | 
						|
				   KEY_CACHE *key_cache);
 | 
						|
extern void multi_key_cache_change(KEY_CACHE *old_data,
 | 
						|
				   KEY_CACHE *new_data);
 | 
						|
extern int reset_key_cache_counters(const char *name,
 | 
						|
                                    KEY_CACHE *key_cache, void *);
 | 
						|
extern int repartition_key_cache(KEY_CACHE *keycache,
 | 
						|
                                 uint key_cache_block_size,
 | 
						|
			         size_t use_mem, 
 | 
						|
                                 uint division_limit,
 | 
						|
			         uint age_threshold,
 | 
						|
                                 uint changed_blocks_hash_size,
 | 
						|
                                 uint partitions);
 | 
						|
C_MODE_END
 | 
						|
#endif /* _keycache_h */
 |