• unknown's avatar
    Added storage/maria (based on MyISAM). WL#3245 · d2b8d744
    unknown authored
    Moved things into ft_global.h, my_handler.h and myisamchk.h to allow MyISAM and Maria to share code and defines
    Rename of not properly renamed functions in MyISAM and my_handler.c
    Renamed some MI_ defines to HA_ to allow MyISAM and Maria to share
    Added maria variables to mysqld.cc and set_var.cc
    Fixed compiler warnings
    
    
    
    BitKeeper/etc/ignore:
      added storage/maria/*.MAI
    BUILD/SETUP.sh:
      Compile maria by default
    BitKeeper/triggers/post-commit:
      No public maria emails.
      Mark changesets emails with 'maria'
    configure.in:
      Add maria
    include/ft_global.h:
      Move defines needed by maria and MyISAM here
    include/keycache.h:
      Add support for default key_cache if cache not found
    include/my_base.h:
      Add invalidator_by_filename
    include/my_handler.h:
      Remove duplicate header files
      Add defines that are typical for handlers (MyISAM and Maria)
    include/myisam.h:
      Move things to my_handler.h to allow Maria and MyISAM to share things
      (Some things needed to be shared to allow sharing of HA_CHECK structure)
    libmysqld/Makefile.am:
      Added ha_maria.cc
    mysys/mf_keycaches.c:
      Added default value for multi_key_cache_search
    mysys/my_handler.c:
      mi_compare_text -> ha_compare_text
      Removed compiler warnings
    sql/ha_myisam.cc:
      MI_CHECK -> HA_CHECK
      MI_MAX_KEY_LENGTH -> HA_MAX_KEY_LENGTH
    sql/ha_myisam.h:
      MI_CHECK -> HA_CHECK
      MI_MAX_KEY_LENGTH -> HA_MAX_KEY_LENGTH
    sql/ha_myisammrg.h:
      MI_CHECK -> HA_CHECK
      MI_MAX_KEY_LENGTH -> HA_MAX_KEY_LENGTH
    sql/handler.h:
      Added MARIA
      Added inclusion of my_handler.h
    sql/item_func.h:
      Remove duplicate include
    sql/mysql_priv.h:
      Added maria variables
    sql/mysqld.cc:
      Added maria
    sql/set_var.cc:
      Added maria status variables
    sql/set_var.h:
      Added maria
    sql/sql_class.h:
      Added maria status variables
    sql/sql_sort.h:
      Remove duplicate BUFFPEK struct
    storage/Makefile.am:
      Added maria
    storage/csv/ha_tina.cc:
      Removed compiler warning
    storage/myisam/Makefile.am:
      Added ft_myisam.c
    storage/myisam/ft_boolean_search.c:
      mi_compare_text -> ha_compare_text
      MI_MAX_KEY_BUFF -> HA_MAX_KEY_BUFF
      Remove compiler warnings
    storage/myisam/ft_nlq_search.c:
      mi_compare_text -> ha_compare_text
    storage/myisam/ft_parser.c:
      mi_compare_text -> ha_compare_text
    storage/myisam/ft_static.c:
      Move ft_init_search() to ft_myisam.c to make ft_static.c independent of MyISAM
    storage/myisam/ft_stopwords.c:
      mi_compare_text -> ha_compare_text
    storage/myisam/ft_update.c:
      mi_compare_text -> ha_compare_text
    storage/myisam/fulltext.h:
      Move things to ft_global.h to allow to share more things between MyISAM and Maria
    storage/myisam/mi_check.c:
      MI_CHECK -> HA_CHECK
    storage/myisam/mi_create.c:
      MI_MAX_POSSIBLE_KEY ->   HA_MAX_POSSIBLE_KEY
      MI_MAX_KEY_BLOCK_SIZE -> HA_MAX_KEY_BLOCK_SIZE
      MI_MAX_KEY_SEG ->  HA_MAX_KEY_SEG
      MI_MAX_KEY_BUFF -> HA_MAX_KEY_BUFF
    storage/myisam/mi_delete.c:
      MI_MAX_KEY_BUFF -> HA_MAX_KEY_BUFF
    storage/myisam/mi_delete_all.c:
      Remove not used variable
    storage/myisam/mi_dynrec.c:
      _my_calc_total_blob_length -> _mi_calc_total_blob_length
    storage/myisam/mi_key.c:
      _my_store_blob_length -> _mi_store_blob_length
    storage/myisam/mi_log.c:
      _my_calc_total_blob_length -> _mi_calc_total_blob_length
    storage/myisam/mi_open.c:
      MI_MAX_POSSIBLE_KEY -> HA_MAX_POSSIBLE_KEY
      MI_MAX_KEY_SEG ->      HA_MAX_KEY_SEG
      MI_MAX_KEY_BUFF ->     HA_MAX_KEY_BUFF
      my_n_base_info_read -> mi_n_base_info_read
    storage/myisam/mi_packrec.c:
      Made read_pack_length static
      _my_store_blob_length -> _mi_store_blob_length
      Remove not used variable
    storage/myisam/mi_range.c:
      MI_MAX_KEY_BUFF -> HA_MAX_KEY_BUFF
    storage/myisam/mi_search.c:
      MI_MAX_KEY_BUFF -> HA_MAX_KEY_BUFF
    storage/myisam/mi_test1.c:
      MI_MAX_KEY_LENGTH -> HA_MAX_KEY_LENGTH
    storage/myisam/mi_test2.c:
      Fixed compiler warning
    storage/myisam/mi_unique.c:
      Fixed compiler warning
      mi_compare_text -> ha_compare_text
    storage/myisam/mi_update.c:
      MI_MAX_KEY_BUFF -> HA_MAX_KEY_BUFF
    storage/myisam/mi_write.c:
      Rename of defines and functions
    storage/myisam/myisamchk.c:
      Rename of defines and functions
    storage/myisam/myisamdef.h:
      Remove tabs
      Indentation fixes (Large changes as I did run indent-ex on the file)
      Move some things to myisamchk.h
      Added missing functions that gave compiler warnings
    storage/myisam/myisamlog.c:
      Rename of defines and functions
    storage/myisam/myisampack.c:
      Remove compiler warning
    storage/myisam/rt_index.c:
      Rename of defines and functions
    storage/myisam/sort.c:
      Rename of defines, functions and structures
    config/ac-macros/ha_maria.m4:
      New BitKeeper file ``config/ac-macros/ha_maria.m4''
    include/maria.h:
      New BitKeeper file ``include/maria.h''
    include/myisamchk.h:
      New BitKeeper file ``include/myisamchk.h''
    libmysqld/ha_maria.cc:
      New BitKeeper file ``libmysqld/ha_maria.cc''
    mysql-test/include/have_maria.inc:
      New BitKeeper file ``mysql-test/include/have_maria.inc''
    mysql-test/r/have_maria.require:
      New BitKeeper file ``mysql-test/r/have_maria.require''
    mysql-test/r/maria.result:
      New BitKeeper file ``mysql-test/r/maria.result''
    mysql-test/r/ps_maria.result:
      New BitKeeper file ``mysql-test/r/ps_maria.result''
    mysql-test/t/maria.test:
      New BitKeeper file ``mysql-test/t/maria.test''
    mysql-test/t/ps_maria.test:
      New BitKeeper file ``mysql-test/t/ps_maria.test''
    sql/ha_maria.cc:
      New BitKeeper file ``sql/ha_maria.cc''
    sql/ha_maria.h:
      New BitKeeper file ``sql/ha_maria.h''
    storage/maria/Makefile.am:
      New BitKeeper file ``storage/maria/Makefile.am''
    storage/maria/cmakelists.txt:
      New BitKeeper file ``storage/maria/cmakelists.txt''
    storage/maria/ft_maria.c:
      New BitKeeper file ``storage/maria/ft_maria.c''
    storage/maria/ma_cache.c:
      New BitKeeper file ``storage/maria/ma_cache.c''
    storage/maria/ma_changed.c:
      New BitKeeper file ``storage/maria/ma_changed.c''
    storage/maria/ma_check.c:
      New BitKeeper file ``storage/maria/ma_check.c''
    storage/maria/ma_checksum.c:
      New BitKeeper file ``storage/maria/ma_checksum.c''
    storage/maria/ma_close.c:
      New BitKeeper file ``storage/maria/ma_close.c''
    storage/maria/ma_create.c:
      New BitKeeper file ``storage/maria/ma_create.c''
    storage/maria/ma_dbug.c:
      New BitKeeper file ``storage/maria/ma_dbug.c''
    storage/maria/ma_delete.c:
      New BitKeeper file ``storage/maria/ma_delete.c''
    storage/maria/ma_delete_all.c:
      New BitKeeper file ``storage/maria/ma_delete_all.c''
    storage/maria/ma_delete_table.c:
      New BitKeeper file ``storage/maria/ma_delete_table.c''
    storage/maria/ma_dynrec.c:
      New BitKeeper file ``storage/maria/ma_dynrec.c''
    storage/maria/ma_extra.c:
      New BitKeeper file ``storage/maria/ma_extra.c''
    storage/maria/ma_ft_boolean_search.c:
      New BitKeeper file ``storage/maria/ma_ft_boolean_search.c''
    storage/maria/ma_ft_eval.c:
      New BitKeeper file ``storage/maria/ma_ft_eval.c''
    storage/maria/ma_ft_eval.h:
      New BitKeeper file ``storage/maria/ma_ft_eval.h''
    storage/maria/ma_ft_nlq_search.c:
      New BitKeeper file ``storage/maria/ma_ft_nlq_search.c''
    storage/maria/ma_ft_parser.c:
      New BitKeeper file ``storage/maria/ma_ft_parser.c''
    storage/maria/ma_ft_stem.c:
      New BitKeeper file ``storage/maria/ma_ft_stem.c''
    storage/maria/ma_ft_test1.c:
      New BitKeeper file ``storage/maria/ma_ft_test1.c''
    storage/maria/ma_ft_test1.h:
      New BitKeeper file ``storage/maria/ma_ft_test1.h''
    storage/maria/ma_ft_update.c:
      New BitKeeper file ``storage/maria/ma_ft_update.c''
    storage/maria/ma_ftdefs.h:
      New BitKeeper file ``storage/maria/ma_ftdefs.h''
    storage/maria/ma_fulltext.h:
      New BitKeeper file ``storage/maria/ma_fulltext.h''
    storage/maria/ma_info.c:
      New BitKeeper file ``storage/maria/ma_info.c''
    storage/maria/ma_init.c:
      New BitKeeper file ``storage/maria/ma_init.c''
    storage/maria/ma_key.c:
      New BitKeeper file ``storage/maria/ma_key.c''
    storage/maria/ma_keycache.c:
      New BitKeeper file ``storage/maria/ma_keycache.c''
    storage/maria/ma_locking.c:
      New BitKeeper file ``storage/maria/ma_locking.c''
    storage/maria/ma_log.c:
      New BitKeeper file ``storage/maria/ma_log.c''
    storage/maria/ma_open.c:
      New BitKeeper file ``storage/maria/ma_open.c''
    storage/maria/ma_packrec.c:
      New BitKeeper file ``storage/maria/ma_packrec.c''
    storage/maria/ma_page.c:
      New BitKeeper file ``storage/maria/ma_page.c''
    storage/maria/ma_panic.c:
      New BitKeeper file ``storage/maria/ma_panic.c''
    storage/maria/ma_preload.c:
      New BitKeeper file ``storage/maria/ma_preload.c''
    storage/maria/ma_range.c:
      New BitKeeper file ``storage/maria/ma_range.c''
    storage/maria/ma_rename.c:
      New BitKeeper file ``storage/maria/ma_rename.c''
    storage/maria/ma_rfirst.c:
      New BitKeeper file ``storage/maria/ma_rfirst.c''
    storage/maria/ma_rkey.c:
      New BitKeeper file ``storage/maria/ma_rkey.c''
    storage/maria/ma_rlast.c:
      New BitKeeper file ``storage/maria/ma_rlast.c''
    storage/maria/ma_rnext.c:
      New BitKeeper file ``storage/maria/ma_rnext.c''
    storage/maria/ma_rnext_same.c:
      New BitKeeper file ``storage/maria/ma_rnext_same.c''
    storage/maria/ma_rprev.c:
      New BitKeeper file ``storage/maria/ma_rprev.c''
    storage/maria/ma_rrnd.c:
      New BitKeeper file ``storage/maria/ma_rrnd.c''
    storage/maria/ma_rsame.c:
      New BitKeeper file ``storage/maria/ma_rsame.c''
    storage/maria/ma_rsamepos.c:
      New BitKeeper file ``storage/maria/ma_rsamepos.c''
    storage/maria/ma_rt_index.c:
      New BitKeeper file ``storage/maria/ma_rt_index.c''
    storage/maria/ma_rt_index.h:
      New BitKeeper file ``storage/maria/ma_rt_index.h''
    storage/maria/ma_rt_key.c:
      New BitKeeper file ``storage/maria/ma_rt_key.c''
    storage/maria/ma_rt_key.h:
      New BitKeeper file ``storage/maria/ma_rt_key.h''
    storage/maria/ma_rt_mbr.c:
      New BitKeeper file ``storage/maria/ma_rt_mbr.c''
    storage/maria/ma_rt_mbr.h:
      New BitKeeper file ``storage/maria/ma_rt_mbr.h''
    storage/maria/ma_rt_split.c:
      New BitKeeper file ``storage/maria/ma_rt_split.c''
    storage/maria/ma_rt_test.c:
      New BitKeeper file ``storage/maria/ma_rt_test.c''
    storage/maria/ma_scan.c:
      New BitKeeper file ``storage/maria/ma_scan.c''
    storage/maria/ma_search.c:
      New BitKeeper file ``storage/maria/ma_search.c''
    storage/maria/ma_sort.c:
      New BitKeeper file ``storage/maria/ma_sort.c''
    storage/maria/ma_sp_defs.h:
      New BitKeeper file ``storage/maria/ma_sp_defs.h''
    storage/maria/ma_sp_key.c:
      New BitKeeper file ``storage/maria/ma_sp_key.c''
    storage/maria/ma_sp_test.c:
      New BitKeeper file ``storage/maria/ma_sp_test.c''
    storage/maria/ma_static.c:
      New BitKeeper file ``storage/maria/ma_static.c''
    storage/maria/ma_statrec.c:
      New BitKeeper file ``storage/maria/ma_statrec.c''
    storage/maria/ma_test1.c:
      New BitKeeper file ``storage/maria/ma_test1.c''
    storage/maria/ma_test2.c:
      New BitKeeper file ``storage/maria/ma_test2.c''
    storage/maria/ma_test3.c:
      New BitKeeper file ``storage/maria/ma_test3.c''
    storage/maria/ma_test_all.sh:
      New BitKeeper file ``storage/maria/ma_test_all.sh''
    storage/maria/ma_unique.c:
      New BitKeeper file ``storage/maria/ma_unique.c''
    storage/maria/ma_update.c:
      New BitKeeper file ``storage/maria/ma_update.c''
    storage/maria/ma_write.c:
      New BitKeeper file ``storage/maria/ma_write.c''
    storage/maria/maria_chk.c:
      New BitKeeper file ``storage/maria/maria_chk.c''
    storage/maria/maria_def.h:
      New BitKeeper file ``storage/maria/maria_def.h''
    storage/maria/maria_ftdump.c:
      New BitKeeper file ``storage/maria/maria_ftdump.c''
    storage/maria/maria_log.c:
      New BitKeeper file ``storage/maria/maria_log.c''
    storage/maria/maria_pack.c:
      New BitKeeper file ``storage/maria/maria_pack.c''
    storage/maria/maria_rename.sh:
      New BitKeeper file ``storage/maria/maria_rename.sh''
    storage/maria/test_pack:
      New BitKeeper file ``storage/maria/test_pack''
    storage/myisam/ft_myisam.c:
      New BitKeeper file ``storage/myisam/ft_myisam.c''
    d2b8d744
ma_keycache.c 5.22 KB
/* Copyright (C) 2006 MySQL AB

   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; either version 2 of the License, or
   (at your option) any later version.

   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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

/*
  Key cache assignments
*/

#include "maria_def.h"

/*
  Assign pages of the index file for a table to a key cache

  SYNOPSIS
    maria_assign_to_key_cache()
      info          open table
      key_map       map of indexes to assign to the key cache
      key_cache_ptr pointer to the key cache handle
      assign_lock   Mutex to lock during assignment

  PREREQUESTS
    One must have a READ lock or a WRITE lock on the table when calling
    the function to ensure that there is no other writers to it.

    The caller must also ensure that one doesn't call this function from
    two different threads with the same table.

  NOTES
    At present pages for all indexes must be assigned to the same key cache.
    In future only pages for indexes specified in the key_map parameter
    of the table will be assigned to the specified key cache.

  RETURN VALUE
    0  If a success
    #  Error code
*/

int maria_assign_to_key_cache(MARIA_HA *info,
			   ulonglong key_map __attribute__((unused)),
			   KEY_CACHE *key_cache)
{
  int error= 0;
  MARIA_SHARE* share= info->s;
  DBUG_ENTER("maria_assign_to_key_cache");
  DBUG_PRINT("enter",("old_key_cache_handle: %lx  new_key_cache_handle: %lx",
		      share->key_cache, key_cache));

  /*
    Skip operation if we didn't change key cache. This can happen if we
    call this for all open instances of the same table
  */
  if (share->key_cache == key_cache)
    DBUG_RETURN(0);

  /*
    First flush all blocks for the table in the old key cache.
    This is to ensure that the disk is consistent with the data pages
    in memory (which may not be the case if the table uses delayed_key_write)

    Note that some other read thread may still fill in the key cache with
    new blocks during this call and after, but this doesn't matter as
    all threads will start using the new key cache for their next call to
    maria library and we know that there will not be any changed blocks
    in the old key cache.
  */

  if (flush_key_blocks(share->key_cache, share->kfile, FLUSH_RELEASE))
  {
    error= my_errno;
    maria_print_error(info->s, HA_ERR_CRASHED);
    maria_mark_crashed(info);		/* Mark that table must be checked */
  }

  /*
    Flush the new key cache for this file.  This is needed to ensure
    that there is no old blocks (with outdated data) left in the new key
    cache from an earlier assign_to_keycache operation

    (This can never fail as there is never any not written data in the
    new key cache)
  */
  (void) flush_key_blocks(key_cache, share->kfile, FLUSH_RELEASE);

  /*
    ensure that setting the key cache and changing the multi_key_cache
    is done atomicly
  */
  pthread_mutex_lock(&share->intern_lock);
  /*
    Tell all threads to use the new key cache
    This should be seen at the lastes for the next call to an maria function.
  */
  share->key_cache= key_cache;

  /* store the key cache in the global hash structure for future opens */
  if (multi_key_cache_set(share->unique_file_name, share->unique_name_length,
			  share->key_cache))
    error= my_errno;
  pthread_mutex_unlock(&share->intern_lock);
  DBUG_RETURN(error);
}


/*
  Change all MARIA entries that uses one key cache to another key cache

  SYNOPSIS
    maria_change_key_cache()
    old_key_cache	Old key cache
    new_key_cache	New key cache

  NOTES
    This is used when we delete one key cache.

    To handle the case where some other threads tries to open an MARIA
    table associated with the to-be-deleted key cache while this operation
    is running, we have to call 'multi_key_cache_change()' from this
    function while we have a lock on the MARIA table list structure.

    This is safe as long as it's only MARIA that is using this specific
    key cache.
*/


void maria_change_key_cache(KEY_CACHE *old_key_cache,
			 KEY_CACHE *new_key_cache)
{
  LIST *pos;
  DBUG_ENTER("maria_change_key_cache");

  /*
    Lock list to ensure that no one can close the table while we manipulate it
  */
  pthread_mutex_lock(&THR_LOCK_maria);
  for (pos=maria_open_list ; pos ; pos=pos->next)
  {
    MARIA_HA *info= (MARIA_HA*) pos->data;
    MARIA_SHARE *share= info->s;
    if (share->key_cache == old_key_cache)
      maria_assign_to_key_cache(info, (ulonglong) ~0, new_key_cache);
  }

  /*
    We have to do the following call while we have the lock on the
    MARIA list structure to ensure that another thread is not trying to
    open a new table that will be associted with the old key cache
  */
  multi_key_cache_change(old_key_cache, new_key_cache);
  pthread_mutex_unlock(&THR_LOCK_maria);
  DBUG_VOID_RETURN;
}