Commit 157002b1 authored by unknown's avatar unknown

WL#3270 "Maria - cleanups of inherited MyISAM functionality"

Removing the "external lock" functionality from Maria (as two separate processes wanting to share a table
should not only my_lock() the data and index files but also the log files, and share memory
(as the latest data is in the page cache), it sounds useless to feature this).
Removing the MyISAM logging from Maria (as REDO logging will be done differently).


BitKeeper/deleted/.del-maria_log.c~1fb295a18c3f5d4c:
  Delete: storage/maria/maria_log.c
BitKeeper/deleted/.del-ma_log.c~4a44ec11d547772f:
  Delete: storage/maria/ma_log.c
include/maria.h:
  unneeded
storage/maria/Makefile.am:
  log removed
storage/maria/ma_check.c:
  external locking removed
storage/maria/ma_close.c:
  log removed
storage/maria/ma_delete.c:
  log removed
storage/maria/ma_delete_all.c:
  log removed. Unused var.
storage/maria/ma_dynrec.c:
  external locking removed
storage/maria/ma_extra.c:
  log removed
storage/maria/ma_init.c:
  log removed
storage/maria/ma_locking.c:
  external locking removed, log removed
storage/maria/ma_open.c:
  external locking removed, log removed
storage/maria/ma_static.c:
  log removed
storage/maria/ma_statrec.c:
  external locking removed
storage/maria/ma_test2.c:
  log removed
storage/maria/ma_test3.c:
  log removed
storage/maria/ma_update.c:
  log removed
storage/maria/ma_write.c:
  external locking removed, log removed
storage/maria/maria_chk.c:
  external locking removed
storage/maria/maria_def.h:
  log removed, maria_pid unused.
storage/maria/maria_pack.c:
  fixes for warnings (where pointers are like ulong and so %u is not enough).
parent 34dba480
......@@ -372,8 +372,6 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info,
const char *name, int rep_quick);
int maria_change_to_newfile(const char *filename, const char *old_ext,
const char *new_ext, uint raid_chunks, myf myflags);
int maria_lock_file(HA_CHECK *param, File file, my_off_t start, int lock_type,
const char *filetype, const char *filename);
void maria_lock_memory(HA_CHECK *param);
int maria_update_state_info(HA_CHECK *param, MARIA_HA *info, uint update);
void maria_update_key_parts(MARIA_KEYDEF *keyinfo, ulong *rec_per_key_part,
......
......@@ -24,9 +24,8 @@ LDADD = @CLIENT_EXTRA_LDFLAGS@ libmaria.a \
$(top_builddir)/dbug/libdbug.a \
$(top_builddir)/strings/libmystrings.a @ZLIB_LIBS@
pkglib_LIBRARIES = libmaria.a
bin_PROGRAMS = maria_chk maria_log maria_pack maria_ftdump
bin_PROGRAMS = maria_chk maria_pack maria_ftdump
maria_chk_DEPENDENCIES= $(LIBRARIES)
maria_log_DEPENDENCIES= $(LIBRARIES)
maria_pack_DEPENDENCIES=$(LIBRARIES)
noinst_PROGRAMS = ma_test1 ma_test2 ma_test3 ma_rt_test ma_sp_test
noinst_HEADERS = maria_def.h ma_rt_index.h ma_rt_key.h ma_rt_mbr.h ma_sp_defs.h ma_fulltext.h ma_ftdefs.h ma_ft_test1.h ma_ft_eval.h
......@@ -47,7 +46,7 @@ libmaria_a_SOURCES = ma_init.c ma_open.c ma_extra.c ma_info.c ma_rkey.c \
ma_delete.c \
ma_rprev.c ma_rfirst.c ma_rlast.c ma_rsame.c \
ma_rsamepos.c ma_panic.c ma_close.c ma_create.c\
ma_range.c ma_dbug.c ma_checksum.c ma_log.c \
ma_range.c ma_dbug.c ma_checksum.c \
ma_changed.c ma_static.c ma_delete_all.c \
ma_delete_table.c ma_rename.c ma_check.c \
ma_keycache.c ma_preload.c ma_ft_parser.c \
......
......@@ -1928,25 +1928,7 @@ int maria_change_to_newfile(const char * filename, const char * old_ext,
} /* maria_change_to_newfile */
/* Locks a whole file */
/* Gives an error-message if file can't be locked */
int maria_lock_file(HA_CHECK *param, File file, my_off_t start, int lock_type,
const char *filetype, const char *filename)
{
if (my_lock(file,lock_type,start,F_TO_EOF,
param->testflag & T_WAIT_FOREVER ? MYF(MY_SEEK_NOT_DONE) :
MYF(MY_SEEK_NOT_DONE | MY_DONT_WAIT)))
{
_ma_check_print_error(param," %d when locking %s '%s'",my_errno,filetype,filename);
param->error_printed=2; /* Don't give that data is crashed */
return 1;
}
return 0;
} /* maria_lock_file */
/* Copy a block between two files */
/* Copy a block between two files */
int maria_filecopy(HA_CHECK *param, File to,File from,my_off_t start,
my_off_t length, const char *type)
......
......@@ -113,7 +113,6 @@ int maria_close(register MARIA_HA *info)
if (info->dfile >= 0 && my_close(info->dfile,MYF(0)))
error = my_errno;
maria_log_command(MARIA_LOG_CLOSE,info,NULL,0,error);
my_free((gptr) info,MYF(0));
if (error)
......
......@@ -101,7 +101,6 @@ int maria_delete(MARIA_HA *info,const byte *record)
info->state->records--;
mi_sizestore(lastpos,info->lastpos);
maria_log_command(MARIA_LOG_DELETE,info,(byte*) lastpos,sizeof(lastpos),0);
VOID(_ma_writeinfo(info,WRITEINFO_UPDATE_KEYFILE));
allow_break(); /* Allow SIGHUP & SIGINT */
if (info->invalidator != 0)
......@@ -115,7 +114,6 @@ int maria_delete(MARIA_HA *info,const byte *record)
err:
save_errno=my_errno;
mi_sizestore(lastpos,info->lastpos);
maria_log_command(MARIA_LOG_DELETE,info,(byte*) lastpos, sizeof(lastpos),0);
if (save_errno != HA_ERR_RECORD_CHANGED)
{
maria_print_error(info->s, HA_ERR_CRASHED);
......
......@@ -22,7 +22,6 @@
int maria_delete_all_rows(MARIA_HA *info)
{
uint i;
char buf[22];
MARIA_SHARE *share=info->s;
MARIA_STATE_INFO *state=&share->state;
DBUG_ENTER("maria_delete_all_rows");
......@@ -49,7 +48,6 @@ int maria_delete_all_rows(MARIA_HA *info)
for (i=0 ; i < share->base.keys ; i++)
state->key_root[i]= HA_OFFSET_ERROR;
maria_log_command(MARIA_LOG_DELETE_ALL,info,(byte*) 0,0,0);
/*
If we are using delayed keys or if the user has done changes to the tables
since it was locked then there may be key blocks in the key cache
......
......@@ -1529,12 +1529,6 @@ int _ma_read_rnd_dynamic_record(MARIA_HA *info, byte *buf,
if (info->lock_type == F_UNLCK)
{
#ifndef UNSAFE_LOCKING
if (share->tot_locks == 0)
{
if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF,
MYF(MY_SEEK_NOT_DONE) | info->lock_wait))
DBUG_RETURN(my_errno);
}
#else
info->tmp_lock_type=F_RDLCK;
#endif
......
......@@ -397,7 +397,6 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, void *extra_arg
{
char tmp[1];
tmp[0]=function;
maria_log_command(MARIA_LOG_EXTRA,info,(byte*) tmp,1,error);
}
DBUG_RETURN(error);
} /* maria_extra */
......
......@@ -52,7 +52,6 @@ void maria_end(void)
if (maria_inited)
{
maria_inited= 0;
VOID(maria_logging(0)); /* Close log if neaded */
ft_free_stopwords();
pthread_mutex_destroy(&THR_LOCK_maria);
}
......
......@@ -30,7 +30,6 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
int error;
uint count;
MARIA_SHARE *share=info->s;
uint flag;
DBUG_ENTER("maria_lock_database");
DBUG_PRINT("enter",("lock_type: %d old lock %d r_locks: %u w_locks: %u "
"global_changed: %d open_count: %u name: '%s'",
......@@ -49,7 +48,7 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
DBUG_RETURN(0);
}
flag=error=0;
error=0;
pthread_mutex_lock(&share->intern_lock);
if (share->kfile >= 0) /* May only be false on windows */
{
......@@ -117,23 +116,6 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
maria_mark_crashed(info);
}
}
if (info->lock_type != F_EXTRA_LCK)
{
if (share->r_locks)
{ /* Only read locks left */
flag=1;
if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF,
MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error)
error=my_errno;
}
else if (!share->w_locks)
{ /* No more locks */
flag=1;
if (my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF,
MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error)
error=my_errno;
}
}
}
info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
info->lock_type= F_UNLCK;
......@@ -147,16 +129,6 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
mysqld does not turn write locks to read locks,
so we're never here in mysqld.
*/
if (share->w_locks == 1)
{
flag=1;
if (my_lock(share->kfile,lock_type,0L,F_TO_EOF,
MYF(MY_SEEK_NOT_DONE)))
{
error=my_errno;
break;
}
}
share->w_locks--;
share->r_locks++;
info->lock_type=lock_type;
......@@ -164,18 +136,9 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
}
if (!share->r_locks && !share->w_locks)
{
flag=1;
if (my_lock(share->kfile,lock_type,0L,F_TO_EOF,
info->lock_wait | MY_SEEK_NOT_DONE))
{
error=my_errno;
break;
}
if (_ma_state_info_read_dsk(share->kfile, &share->state, 1))
{
error=my_errno;
VOID(my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE)));
my_errno=error;
break;
}
}
......@@ -189,13 +152,6 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
{ /* Change READONLY to RW */
if (share->r_locks == 1)
{
flag=1;
if (my_lock(share->kfile,lock_type,0L,F_TO_EOF,
MYF(info->lock_wait | MY_SEEK_NOT_DONE)))
{
error=my_errno;
break;
}
share->r_locks--;
share->w_locks++;
info->lock_type=lock_type;
......@@ -206,21 +162,11 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
{
if (!share->w_locks)
{
flag=1;
if (my_lock(share->kfile,lock_type,0L,F_TO_EOF,
info->lock_wait | MY_SEEK_NOT_DONE))
{
error=my_errno;
break;
}
if (!share->r_locks)
{
if (_ma_state_info_read_dsk(share->kfile, &share->state, 1))
{
error=my_errno;
VOID(my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF,
info->lock_wait | MY_SEEK_NOT_DONE));
my_errno=error;
break;
}
}
......@@ -238,11 +184,6 @@ int maria_lock_database(MARIA_HA *info, int lock_type)
}
}
pthread_mutex_unlock(&share->intern_lock);
#if defined(FULL_LOG) || defined(_lint)
lock_type|=(int) (flag << 8); /* Set bit to set if real lock */
maria_log_command(MARIA_LOG_LOCK,info,(byte*) &lock_type,sizeof(lock_type),
error);
#endif
DBUG_RETURN(error);
} /* maria_lock_database */
......@@ -381,14 +322,9 @@ int _ma_readinfo(register MARIA_HA *info, int lock_type, int check_keybuffer)
MARIA_SHARE *share=info->s;
if (!share->tot_locks)
{
if (my_lock(share->kfile,lock_type,0L,F_TO_EOF,
info->lock_wait | MY_SEEK_NOT_DONE))
DBUG_RETURN(1);
if (_ma_state_info_read_dsk(share->kfile, &share->state, 1))
{
int error=my_errno ? my_errno : -1;
VOID(my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF,
MYF(MY_SEEK_NOT_DONE)));
my_errno=error;
DBUG_RETURN(1);
}
......@@ -438,10 +374,6 @@ int _ma_writeinfo(register MARIA_HA *info, uint operation)
}
#endif
}
if (!(operation & WRITEINFO_NO_UNLOCK) &&
my_lock(share->kfile,F_UNLCK,0L,F_TO_EOF,
MYF(MY_WME | MY_SEEK_NOT_DONE)) && !error)
DBUG_RETURN(1);
my_errno=olderror;
}
else if (operation)
......
/* Copyright (C) 2006 MySQL AB & MySQL Finland AB & TCX DataKonsult 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 */
/*
Logging of MARIA commands and records on logfile for debugging
The log can be examined with help of the marialog command.
*/
#include "maria_def.h"
#if defined(MSDOS) || defined(__WIN__)
#include <fcntl.h>
#ifndef __WIN__
#include <process.h>
#endif
#endif
#ifdef VMS
#include <processes.h>
#endif
#undef GETPID /* For HPUX */
#ifdef THREAD
#define GETPID() (log_type == 1 ? (long) maria_pid : (long) my_thread_id());
#else
#define GETPID() maria_pid
#endif
/* Activate logging if flag is 1 and reset logging if flag is 0 */
static int log_type=0;
ulong maria_pid=0;
int maria_logging(int activate_log)
{
int error=0;
char buff[FN_REFLEN];
DBUG_ENTER("maria_logging");
log_type=activate_log;
if (activate_log)
{
if (!maria_pid)
maria_pid=(ulong) getpid();
if (maria_log_file < 0)
{
if ((maria_log_file = my_create(fn_format(buff,maria_log_filename,
"",".log",4),
0,(O_RDWR | O_BINARY | O_APPEND),MYF(0)))
< 0)
DBUG_RETURN(my_errno);
}
}
else if (maria_log_file >= 0)
{
error=my_close(maria_log_file,MYF(0)) ? my_errno : 0 ;
maria_log_file= -1;
}
DBUG_RETURN(error);
}
/* Logging of records and commands on logfile */
/* All logs starts with command(1) dfile(2) process(4) result(2) */
void _ma_log(enum maria_log_commands command, MARIA_HA *info,
const byte *buffert, uint length)
{
char buff[11];
int error,old_errno;
ulong pid=(ulong) GETPID();
old_errno=my_errno;
bzero(buff,sizeof(buff));
buff[0]=(char) command;
mi_int2store(buff+1,info->dfile);
mi_int4store(buff+3,pid);
mi_int2store(buff+9,length);
pthread_mutex_lock(&THR_LOCK_maria);
error=my_lock(maria_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
VOID(my_write(maria_log_file,buff,sizeof(buff),MYF(0)));
VOID(my_write(maria_log_file,buffert,length,MYF(0)));
if (!error)
error=my_lock(maria_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
pthread_mutex_unlock(&THR_LOCK_maria);
my_errno=old_errno;
}
void _ma_log_command(enum maria_log_commands command, MARIA_HA *info,
const byte *buffert, uint length, int result)
{
char buff[9];
int error,old_errno;
ulong pid=(ulong) GETPID();
old_errno=my_errno;
buff[0]=(char) command;
mi_int2store(buff+1,info->dfile);
mi_int4store(buff+3,pid);
mi_int2store(buff+7,result);
pthread_mutex_lock(&THR_LOCK_maria);
error=my_lock(maria_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
VOID(my_write(maria_log_file,buff,sizeof(buff),MYF(0)));
if (buffert)
VOID(my_write(maria_log_file,buffert,length,MYF(0)));
if (!error)
error=my_lock(maria_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
pthread_mutex_unlock(&THR_LOCK_maria);
my_errno=old_errno;
}
void _ma_log_record(enum maria_log_commands command, MARIA_HA *info,
const byte *record, my_off_t filepos, int result)
{
char buff[21],*pos;
int error,old_errno;
uint length;
ulong pid=(ulong) GETPID();
old_errno=my_errno;
if (!info->s->base.blobs)
length=info->s->base.reclength;
else
length=info->s->base.reclength+ _ma_calc_total_blob_length(info,record);
buff[0]=(char) command;
mi_int2store(buff+1,info->dfile);
mi_int4store(buff+3,pid);
mi_int2store(buff+7,result);
mi_sizestore(buff+9,filepos);
mi_int4store(buff+17,length);
pthread_mutex_lock(&THR_LOCK_maria);
error=my_lock(maria_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
VOID(my_write(maria_log_file,buff,sizeof(buff),MYF(0)));
VOID(my_write(maria_log_file,(byte*) record,info->s->base.reclength,MYF(0)));
if (info->s->base.blobs)
{
MARIA_BLOB *blob,*end;
for (end=info->blobs+info->s->base.blobs, blob= info->blobs;
blob != end ;
blob++)
{
memcpy_fixed(&pos,record+blob->offset+blob->pack_length,sizeof(char*));
VOID(my_write(maria_log_file,pos,blob->length,MYF(0)));
}
}
if (!error)
error=my_lock(maria_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
pthread_mutex_unlock(&THR_LOCK_maria);
my_errno=old_errno;
}
......@@ -75,7 +75,7 @@ MARIA_HA *_ma_test_if_reopen(char *filename)
MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
{
int lock_error,kfile,open_mode,save_errno,have_rtree=0;
int kfile,open_mode,save_errno,have_rtree=0;
uint i,j,len,errpos,head_length,base_pos,offset,info_length,keys,
key_parts,unique_key_parts,fulltext_keys,uniques;
char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN],
......@@ -90,7 +90,6 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
LINT_INIT(m_info);
kfile= -1;
lock_error=1;
errpos=0;
head_length=sizeof(share_buff.state.header);
bzero((byte*) &info,sizeof(info));
......@@ -176,14 +175,6 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
errpos=2;
VOID(my_seek(kfile,0L,MY_SEEK_SET,MYF(0)));
if (!(open_flags & HA_OPEN_TMP_TABLE))
{
if ((lock_error=my_lock(kfile,F_RDLCK,0L,F_TO_EOF,
MYF(open_flags & HA_OPEN_WAIT_IF_LOCKED ?
0 : MY_DONT_WAIT))) &&
!(open_flags & HA_OPEN_IGNORE_IF_LOCKED))
goto err;
}
errpos=3;
if (my_read(kfile,disk_cache,info_length,MYF(MY_NABP)))
{
......@@ -451,12 +442,6 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
}
share->rec[i].type=(int) FIELD_LAST; /* End marker */
if (! lock_error)
{
VOID(my_lock(kfile,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE)));
lock_error=1; /* Database unlocked */
}
if (_ma_open_datafile(&info, share, -1))
goto err;
errpos=5;
......@@ -613,11 +598,6 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
maria_open_list=list_add(maria_open_list,&m_info->open_list);
pthread_mutex_unlock(&THR_LOCK_maria);
if (maria_log_file >= 0)
{
intern_filename(name_buff,share->index_file_name);
_ma_log(MARIA_LOG_OPEN,m_info,name_buff,(uint) strlen(name_buff));
}
DBUG_RETURN(m_info);
err:
......@@ -639,8 +619,6 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
my_free((gptr) share,MYF(0));
/* fall through */
case 3:
if (! lock_error)
VOID(my_lock(kfile, F_UNLCK, 0L, F_TO_EOF, MYF(MY_SEEK_NOT_DONE)));
/* fall through */
case 2:
my_afree((gptr) disk_cache);
......
......@@ -28,8 +28,6 @@ uchar NEAR maria_file_magic[]=
{ (uchar) 254, (uchar) 254,'\007', '\001', };
uchar NEAR maria_pack_file_magic[]=
{ (uchar) 254, (uchar) 254,'\010', '\002', };
my_string maria_log_filename=(char*) "maria.log";
File maria_log_file= -1;
uint maria_quick_table_bits=9;
ulong maria_block_size= MARIA_KEY_BLOCK_LENGTH;
my_bool maria_flush=0, maria_delay_key_write=0, maria_single_user=0;
......
......@@ -241,9 +241,6 @@ int _ma_read_rnd_static_record(MARIA_HA *info, byte *buf,
if ((! cache_read || share->base.reclength > cache_length) &&
share->tot_locks == 0)
{ /* record not in cache */
if (my_lock(share->kfile,F_RDLCK,0L,F_TO_EOF,
MYF(MY_SEEK_NOT_DONE) | info->lock_wait))
DBUG_RETURN(my_errno);
locked=1;
}
#else
......
......@@ -44,7 +44,7 @@ static void copy_key(struct st_maria_info *info,uint inx,
static int verbose=0,testflag=0,
first_key=0,async_io=0,key_cacheing=0,write_cacheing=0,locking=0,
rec_pointer_size=0,pack_fields=1,use_log=0,silent=0,
rec_pointer_size=0,pack_fields=1,silent=0,
opt_quick_mode=0;
static int pack_seg=HA_SPACE_PACK,pack_type=HA_PACK_KEY,remove_count=-1,
create_flag=0;
......@@ -209,8 +209,6 @@ int main(int argc, char *argv[])
0,(MARIA_UNIQUEDEF*) 0,
&create_info,create_flag))
goto err;
if (use_log)
maria_logging(1);
if (!(file=maria_open(filename,2,HA_OPEN_ABORT_IF_LOCKED)))
goto err;
if (!silent)
......@@ -894,9 +892,6 @@ static void get_options(int argc, char **argv)
if (*++pos)
srand(atoi(pos));
break;
case 'l':
use_log=1;
break;
case 'L':
locking=1;
break;
......
......@@ -41,7 +41,7 @@
const char *filename= "test3";
uint tests=10,forks=10,key_cacheing=0,use_log=0;
uint tests=10,forks=10,key_cacheing=0;
static void get_options(int argc, char *argv[]);
void start_test(int id);
......@@ -127,9 +127,6 @@ static void get_options(int argc, char **argv)
while (--argc >0 && *(pos = *(++argv)) == '-' ) {
switch(*++pos) {
case 'l':
use_log=1;
break;
case 'f':
forks=atoi(++pos);
break;
......@@ -140,7 +137,7 @@ static void get_options(int argc, char **argv)
key_cacheing=1;
break;
case 'A': /* All flags */
use_log=key_cacheing=1;
key_cacheing=1;
break;
case '?':
case 'I':
......@@ -169,8 +166,6 @@ void start_test(int id)
MARIA_INFO isam_info;
MARIA_HA *file,*file1,*file2=0,*lock;
if (use_log)
maria_logging(1);
if (!(file1=maria_open(filename,O_RDWR,HA_OPEN_WAIT_IF_LOCKED)) ||
!(file2=maria_open(filename,O_RDWR,HA_OPEN_WAIT_IF_LOCKED)))
{
......@@ -214,8 +209,6 @@ void start_test(int id)
maria_close(file1);
maria_close(file2);
if (use_log)
maria_logging(0);
if (error)
{
printf("%2d: Aborted\n",id); fflush(stdout);
......
......@@ -170,7 +170,6 @@ int maria_update(register MARIA_HA *info, const byte *oldrec, byte *newrec)
info->update= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED | HA_STATE_AKTIV |
key_changed);
maria_log_record(MARIA_LOG_UPDATE,info,newrec,info->lastpos,0);
VOID(_ma_writeinfo(info,key_changed ? WRITEINFO_UPDATE_KEYFILE : 0));
allow_break(); /* Allow SIGHUP & SIGINT */
if (info->invalidator != 0)
......@@ -220,7 +219,6 @@ int maria_update(register MARIA_HA *info, const byte *oldrec, byte *newrec)
key_changed);
err_end:
maria_log_record(MARIA_LOG_UPDATE,info,newrec,info->lastpos,my_errno);
VOID(_ma_writeinfo(info,WRITEINFO_UPDATE_KEYFILE));
allow_break(); /* Allow SIGHUP & SIGINT */
if (save_errno == HA_ERR_KEY_NOT_FOUND)
......
......@@ -62,11 +62,6 @@ int maria_write(MARIA_HA *info, byte *record)
if (_ma_readinfo(info,F_WRLCK,1))
DBUG_RETURN(my_errno);
dont_break(); /* Dont allow SIGHUP or SIGINT */
#if !defined(NO_LOCKING) && defined(USE_RECORD_LOCK)
if (!info->locked && my_lock(info->dfile,F_WRLCK,0L,F_TO_EOF,
MYF(MY_SEEK_NOT_DONE) | info->lock_wait))
goto err;
#endif
filepos= ((share->state.dellink != HA_OFFSET_ERROR &&
!info->append_insert_at_end) ?
share->state.dellink :
......@@ -155,7 +150,6 @@ int maria_write(MARIA_HA *info, byte *record)
HA_STATE_ROW_CHANGED);
info->state->records++;
info->lastpos=filepos;
maria_log_record(MARIA_LOG_WRITE,info,record,filepos,0);
VOID(_ma_writeinfo(info, WRITEINFO_UPDATE_KEYFILE));
if (info->invalidator != 0)
{
......@@ -220,7 +214,6 @@ int maria_write(MARIA_HA *info, byte *record)
my_errno=save_errno;
err2:
save_errno=my_errno;
maria_log_record(MARIA_LOG_WRITE,info,record,filepos,my_errno);
VOID(_ma_writeinfo(info,WRITEINFO_UPDATE_KEYFILE));
allow_break(); /* Allow SIGHUP & SIGINT */
DBUG_RETURN(my_errno=save_errno);
......
......@@ -1158,7 +1158,6 @@ static int mariachk(HA_CHECK *param, my_string filename)
(state_updated ? UPDATE_STAT : 0) |
((param->testflag & T_SORT_RECORDS) ?
UPDATE_SORT : 0)));
VOID(maria_lock_file(param, share->kfile,0L,F_UNLCK,"indexfile",filename));
info->update&= ~HA_STATE_CHANGED;
}
maria_lock_database(info, F_UNLCK);
......
......@@ -427,8 +427,6 @@ extern LIST *maria_open_list;
extern uchar NEAR maria_file_magic[], NEAR maria_pack_file_magic[];
extern uint NEAR maria_read_vec[], NEAR maria_readnext_vec[];
extern uint maria_quick_table_bits;
extern File maria_log_file;
extern ulong maria_pid;
/* This is used by _ma_calc_xxx_key_length och _ma_store_key */
......@@ -648,16 +646,6 @@ typedef struct st_maria_block_info
#define SORT_BUFFER_INIT (2048L*1024L-MALLOC_OVERHEAD)
#define MIN_SORT_BUFFER (4096-MALLOC_OVERHEAD)
enum maria_log_commands
{
MARIA_LOG_OPEN, MARIA_LOG_WRITE, MARIA_LOG_UPDATE, MARIA_LOG_DELETE,
MARIA_LOG_CLOSE, MARIA_LOG_EXTRA, MARIA_LOG_LOCK, MARIA_LOG_DELETE_ALL
};
#define maria_log(a,b,c,d) if (maria_log_file >= 0) _ma_log(a,b,c,d)
#define maria_log_command(a,b,c,d,e) if (maria_log_file >= 0) _ma_log_command(a,b,c,d,e)
#define maria_log_record(a,b,c,d,e) if (maria_log_file >= 0) _ma_log_record(a,b,c,d,e)
#define fast_ma_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _ma_writeinfo((INFO),0)
#define fast_ma_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _ma_readinfo((INFO),F_RDLCK,1)
......@@ -666,14 +654,6 @@ extern uint _ma_rec_pack(MARIA_HA *info, byte *to, const byte *from);
extern uint _ma_pack_get_block_info(MARIA_HA *, MARIA_BLOCK_INFO *, File,
my_off_t);
extern void _ma_store_blob_length(byte *pos, uint pack_length, uint length);
extern void _ma_log(enum maria_log_commands command, MARIA_HA *info,
const byte *buffert, uint length);
extern void _ma_log_command(enum maria_log_commands command,
MARIA_HA *info, const byte *buffert,
uint length, int result);
extern void _ma_log_record(enum maria_log_commands command, MARIA_HA *info,
const byte *record, my_off_t filepos,
int result);
extern void _ma_report_error(int errcode, const char *file_name);
extern my_bool _ma_memmap_file(MARIA_HA *info);
extern void _ma_unmap_file(MARIA_HA *info);
......
/* Copyright (C) 2006 MySQL AB & MySQL Finland AB & TCX DataKonsult 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 */
/* write whats in isam.log */
#ifndef USE_MY_FUNC
#define USE_MY_FUNC
#endif
#include "maria_def.h"
#include <my_tree.h>
#include <stdarg.h>
#ifdef HAVE_GETRUSAGE
#include <sys/resource.h>
#endif
#define FILENAME(A) (A ? A->show_name : "Unknown")
struct file_info {
long process;
int filenr,id;
uint rnd;
my_string name,show_name,record;
MARIA_HA *isam;
bool closed,used;
ulong accessed;
};
struct test_if_open_param {
my_string name;
int max_id;
};
struct st_access_param
{
ulong min_accessed;
struct file_info *found;
};
#define NO_FILEPOS (ulong) ~0L
extern int main(int argc,char * *argv);
static void get_options(int *argc,char ***argv);
static int examine_log(my_string file_name,char **table_names);
static int read_string(IO_CACHE *file,gptr *to,uint length);
static int file_info_compare(void *cmp_arg, void *a,void *b);
static int test_if_open(struct file_info *key,element_count count,
struct test_if_open_param *param);
static void fix_blob_pointers(MARIA_HA *isam,byte *record);
static int test_when_accessed(struct file_info *key,element_count count,
struct st_access_param *access_param);
static void file_info_free(struct file_info *info);
static int close_some_file(TREE *tree);
static int reopen_closed_file(TREE *tree,struct file_info *file_info);
static int find_record_with_key(struct file_info *file_info,byte *record);
static void printf_log(const char *str,...);
static bool cmp_filename(struct file_info *file_info,my_string name);
static uint verbose=0,update=0,test_info=0,max_files=0,re_open_count=0,
recover=0,prefix_remove=0,opt_processes=0;
static my_string log_filename=0,filepath=0,write_filename=0,record_pos_file=0;
static ulong com_count[10][3],number_of_commands=(ulong) ~0L,
isamlog_process;
static my_off_t isamlog_filepos,start_offset=0,record_pos= HA_OFFSET_ERROR;
static const char *command_name[]=
{"open","write","update","delete","close","extra","lock","re-open",
"delete-all", NullS};
int main(int argc, char **argv)
{
int error,i,first;
ulong total_count,total_error,total_recover;
MY_INIT(argv[0]);
log_filename=maria_log_filename;
get_options(&argc,&argv);
maria_init();
/* Number of MARIA files we can have open at one time */
max_files= (my_set_max_open_files(min(max_files,8))-6)/2;
if (update)
printf("Trying to %s MARIA files according to log '%s'\n",
(recover ? "recover" : "update"),log_filename);
error= examine_log(log_filename,argv);
if (update && ! error)
puts("Tables updated successfully");
total_count=total_error=total_recover=0;
for (i=first=0 ; command_name[i] ; i++)
{
if (com_count[i][0])
{
if (!first++)
{
if (verbose || update)
puts("");
puts("Commands Used count Errors Recover errors");
}
printf("%-12s%9ld%10ld%17ld\n",command_name[i],com_count[i][0],
com_count[i][1],com_count[i][2]);
total_count+=com_count[i][0];
total_error+=com_count[i][1];
total_recover+=com_count[i][2];
}
}
if (total_count)
printf("%-12s%9ld%10ld%17ld\n","Total",total_count,total_error,
total_recover);
if (re_open_count)
printf("Had to do %d re-open because of too few possibly open files\n",
re_open_count);
VOID(maria_panic(HA_PANIC_CLOSE));
my_free_open_file_info();
maria_end();
my_end(test_info ? MY_CHECK_ERROR | MY_GIVE_INFO : MY_CHECK_ERROR);
exit(error);
return 0; /* No compiler warning */
} /* main */
static void get_options(register int *argc, register char ***argv)
{
int help,version;
const char *pos,*usage;
char option;
help=0;
usage="Usage: %s [-?iruvDIV] [-c #] [-f #] [-F filepath/] [-o #] [-R file recordpos] [-w write_file] [log-filename [table ...]] \n";
pos="";
while (--*argc > 0 && *(pos = *(++*argv)) == '-' ) {
while (*++pos)
{
version=0;
switch((option=*pos)) {
case '#':
DBUG_PUSH (++pos);
pos=" "; /* Skip rest of arg */
break;
case 'c':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
number_of_commands=(ulong) atol(pos);
pos=" ";
break;
case 'u':
update=1;
break;
case 'f':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
max_files=(uint) atoi(pos);
pos=" ";
break;
case 'i':
test_info=1;
break;
case 'o':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
start_offset=(my_off_t) strtoll(pos,NULL,10);
pos=" ";
break;
case 'p':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
prefix_remove=atoi(pos);
break;
case 'r':
update=1;
recover++;
break;
case 'P':
opt_processes=1;
break;
case 'R':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
record_pos_file=(char*) pos;
if (!--*argc)
goto err;
record_pos=(my_off_t) strtoll(*(++*argv),NULL,10);
pos=" ";
break;
case 'v':
verbose++;
break;
case 'w':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
write_filename=(char*) pos;
pos=" ";
break;
case 'F':
if (! *++pos)
{
if (!--*argc)
goto err;
else
pos= *(++*argv);
}
filepath= (char*) pos;
pos=" ";
break;
case 'V':
version=1;
/* Fall through */
case 'I':
case '?':
#include <help_start.h>
printf("%s Ver 1.4 for %s at %s\n",my_progname,SYSTEM_TYPE,
MACHINE_TYPE);
puts("By Monty, for your professional use\n");
if (version)
break;
puts("Write info about whats in a MARIA log file.");
printf("If no file name is given %s is used\n",log_filename);
puts("");
printf(usage,my_progname);
puts("");
puts("Options: -? or -I \"Info\" -V \"version\" -c \"do only # commands\"");
puts(" -f \"max open files\" -F \"filepath\" -i \"extra info\"");
puts(" -o \"offset\" -p # \"remove # components from path\"");
puts(" -r \"recover\" -R \"file recordposition\"");
puts(" -u \"update\" -v \"verbose\" -w \"write file\"");
puts(" -D \"maria compiled with DBUG\" -P \"processes\"");
puts("\nOne can give a second and a third '-v' for more verbose.");
puts("Normaly one does a update (-u).");
puts("If a recover is done all writes and all possibly updates and deletes is done\nand errors are only counted.");
puts("If one gives table names as arguments only these tables will be updated\n");
help=1;
#include <help_end.h>
break;
default:
printf("illegal option: \"-%c\"\n",*pos);
break;
}
}
}
if (! *argc)
{
if (help)
exit(0);
(*argv)++;
}
if (*argc >= 1)
{
log_filename=(char*) pos;
(*argc)--;
(*argv)++;
}
return;
err:
VOID(fprintf(stderr,"option \"%c\" used without or with wrong argument\n",
option));
exit(1);
}
static int examine_log(my_string file_name, char **table_names)
{
uint command,result,files_open;
ulong access_time,length;
my_off_t filepos;
int lock_command,maria_result;
char isam_file_name[FN_REFLEN],llbuff[21],llbuff2[21];
uchar head[20];
gptr buff;
struct test_if_open_param open_param;
IO_CACHE cache;
File file;
FILE *write_file;
enum ha_extra_function extra_command;
TREE tree;
struct file_info file_info,*curr_file_info;
DBUG_ENTER("examine_log");
if ((file=my_open(file_name,O_RDONLY,MYF(MY_WME))) < 0)
DBUG_RETURN(1);
write_file=0;
if (write_filename)
{
if (!(write_file=my_fopen(write_filename,O_WRONLY,MYF(MY_WME))))
{
my_close(file,MYF(0));
DBUG_RETURN(1);
}
}
init_io_cache(&cache,file,0,READ_CACHE,start_offset,0,MYF(0));
bzero((gptr) com_count,sizeof(com_count));
init_tree(&tree,0,0,sizeof(file_info),(qsort_cmp2) file_info_compare,1,
(tree_element_free) file_info_free, NULL);
VOID(init_key_cache(maria_key_cache,KEY_CACHE_BLOCK_SIZE,KEY_CACHE_SIZE,
0, 0));
files_open=0; access_time=0;
while (access_time++ != number_of_commands &&
!my_b_read(&cache,(byte*) head,9))
{
isamlog_filepos=my_b_tell(&cache)-9L;
file_info.filenr= mi_uint2korr(head+1);
isamlog_process=file_info.process=(long) mi_uint4korr(head+3);
if (!opt_processes)
file_info.process=0;
result= mi_uint2korr(head+7);
if ((curr_file_info=(struct file_info*) tree_search(&tree, &file_info,
tree.custom_arg)))
{
curr_file_info->accessed=access_time;
if (update && curr_file_info->used && curr_file_info->closed)
{
if (reopen_closed_file(&tree,curr_file_info))
{
command=sizeof(com_count)/sizeof(com_count[0][0])/3;
result=0;
goto com_err;
}
}
}
command=(uint) head[0];
if (command < sizeof(com_count)/sizeof(com_count[0][0])/3 &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
{
com_count[command][0]++;
if (result)
com_count[command][1]++;
}
switch ((enum maria_log_commands) command) {
case MARIA_LOG_OPEN:
if (!table_names[0])
{
com_count[command][0]--; /* Must be counted explicite */
if (result)
com_count[command][1]--;
}
if (curr_file_info)
printf("\nWarning: %s is opened with same process and filenumber\nMaybe you should use the -P option ?\n",
curr_file_info->show_name);
if (my_b_read(&cache,(byte*) head,2))
goto err;
file_info.name=0;
file_info.show_name=0;
file_info.record=0;
if (read_string(&cache,(gptr*) &file_info.name,
(uint) mi_uint2korr(head)))
goto err;
{
uint i;
char *pos,*to;
/* Fix if old DOS files to new format */
for (pos=file_info.name; (pos=strchr(pos,'\\')) ; pos++)
*pos= '/';
pos=file_info.name;
for (i=0 ; i < prefix_remove ; i++)
{
char *next;
if (!(next=strchr(pos,'/')))
break;
pos=next+1;
}
to=isam_file_name;
if (filepath)
to=convert_dirname(isam_file_name,filepath,NullS);
strmov(to,pos);
fn_ext(isam_file_name)[0]=0; /* Remove extension */
}
open_param.name=file_info.name;
open_param.max_id=0;
VOID(tree_walk(&tree,(tree_walk_action) test_if_open,(void*) &open_param,
left_root_right));
file_info.id=open_param.max_id+1;
/*
* In the line below +10 is added to accomodate '<' and '>' chars
* plus '\0' at the end, so that there is place for 7 digits.
* It is improbable that same table can have that many entries in
* the table cache.
* The additional space is needed for the sprintf commands two lines
* below.
*/
file_info.show_name=my_memdup(isam_file_name,
(uint) strlen(isam_file_name)+10,
MYF(MY_WME));
if (file_info.id > 1)
sprintf(strend(file_info.show_name),"<%d>",file_info.id);
file_info.closed=1;
file_info.accessed=access_time;
file_info.used=1;
if (table_names[0])
{
char **name;
file_info.used=0;
for (name=table_names ; *name ; name++)
{
if (!strcmp(*name,isam_file_name))
file_info.used=1; /* Update/log only this */
}
}
if (update && file_info.used)
{
if (files_open >= max_files)
{
if (close_some_file(&tree))
goto com_err;
files_open--;
}
if (!(file_info.isam= maria_open(isam_file_name,O_RDWR,
HA_OPEN_WAIT_IF_LOCKED)))
goto com_err;
if (!(file_info.record=my_malloc(file_info.isam->s->base.reclength,
MYF(MY_WME))))
goto end;
files_open++;
file_info.closed=0;
}
VOID(tree_insert(&tree, (gptr) &file_info, 0, tree.custom_arg));
if (file_info.used)
{
if (verbose && !record_pos_file)
printf_log("%s: open -> %d",file_info.show_name, file_info.filenr);
com_count[command][0]++;
if (result)
com_count[command][1]++;
}
break;
case MARIA_LOG_CLOSE:
if (verbose && !record_pos_file &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
printf_log("%s: %s -> %d",FILENAME(curr_file_info),
command_name[command],result);
if (curr_file_info)
{
if (!curr_file_info->closed)
files_open--;
VOID(tree_delete(&tree, (gptr) curr_file_info, tree.custom_arg));
}
break;
case MARIA_LOG_EXTRA:
if (my_b_read(&cache,(byte*) head,1))
goto err;
extra_command=(enum ha_extra_function) head[0];
if (verbose && !record_pos_file &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
printf_log("%s: %s(%d) -> %d",FILENAME(curr_file_info),
command_name[command], (int) extra_command,result);
if (update && curr_file_info && !curr_file_info->closed)
{
if (maria_extra(curr_file_info->isam, extra_command, 0) != (int) result)
{
fflush(stdout);
VOID(fprintf(stderr,
"Warning: error %d, expected %d on command %s at %s\n",
my_errno,result,command_name[command],
llstr(isamlog_filepos,llbuff)));
fflush(stderr);
}
}
break;
case MARIA_LOG_DELETE:
if (my_b_read(&cache,(byte*) head,8))
goto err;
filepos=mi_sizekorr(head);
if (verbose && (!record_pos_file ||
((record_pos == filepos || record_pos == NO_FILEPOS) &&
!cmp_filename(curr_file_info,record_pos_file))) &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
printf_log("%s: %s at %ld -> %d",FILENAME(curr_file_info),
command_name[command],(long) filepos,result);
if (update && curr_file_info && !curr_file_info->closed)
{
if (maria_rrnd(curr_file_info->isam,curr_file_info->record,filepos))
{
if (!recover)
goto com_err;
if (verbose)
printf_log("error: Didn't find row to delete with maria_rrnd");
com_count[command][2]++; /* Mark error */
}
maria_result=maria_delete(curr_file_info->isam,curr_file_info->record);
if ((maria_result == 0 && result) ||
(maria_result && (uint) my_errno != result))
{
if (!recover)
goto com_err;
if (maria_result)
com_count[command][2]++; /* Mark error */
if (verbose)
printf_log("error: Got result %d from maria_delete instead of %d",
maria_result, result);
}
}
break;
case MARIA_LOG_WRITE:
case MARIA_LOG_UPDATE:
if (my_b_read(&cache,(byte*) head,12))
goto err;
filepos=mi_sizekorr(head);
length=mi_uint4korr(head+8);
buff=0;
if (read_string(&cache,&buff,(uint) length))
goto err;
if ((!record_pos_file ||
((record_pos == filepos || record_pos == NO_FILEPOS) &&
!cmp_filename(curr_file_info,record_pos_file))) &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
{
if (write_file &&
(my_fwrite(write_file,buff,length,MYF(MY_WAIT_IF_FULL | MY_NABP))))
goto end;
if (verbose)
printf_log("%s: %s at %ld, length=%ld -> %d",
FILENAME(curr_file_info),
command_name[command], filepos,length,result);
}
if (update && curr_file_info && !curr_file_info->closed)
{
if (curr_file_info->isam->s->base.blobs)
fix_blob_pointers(curr_file_info->isam,buff);
if ((enum maria_log_commands) command == MARIA_LOG_UPDATE)
{
if (maria_rrnd(curr_file_info->isam,curr_file_info->record,filepos))
{
if (!recover)
{
result=0;
goto com_err;
}
if (verbose)
printf_log("error: Didn't find row to update with maria_rrnd");
if (recover == 1 || result ||
find_record_with_key(curr_file_info,buff))
{
com_count[command][2]++; /* Mark error */
break;
}
}
maria_result=maria_update(curr_file_info->isam,curr_file_info->record,
buff);
if ((maria_result == 0 && result) ||
(maria_result && (uint) my_errno != result))
{
if (!recover)
goto com_err;
if (verbose)
printf_log("error: Got result %d from maria_update instead of %d",
maria_result, result);
if (maria_result)
com_count[command][2]++; /* Mark error */
}
}
else
{
maria_result=maria_write(curr_file_info->isam,buff);
if ((maria_result == 0 && result) ||
(maria_result && (uint) my_errno != result))
{
if (!recover)
goto com_err;
if (verbose)
printf_log("error: Got result %d from maria_write instead of %d",
maria_result, result);
if (maria_result)
com_count[command][2]++; /* Mark error */
}
if (!recover && filepos != curr_file_info->isam->lastpos)
{
printf("error: Wrote at position: %s, should have been %s",
llstr(curr_file_info->isam->lastpos,llbuff),
llstr(filepos,llbuff2));
goto end;
}
}
}
my_free(buff,MYF(0));
break;
case MARIA_LOG_LOCK:
if (my_b_read(&cache,(byte*) head,sizeof(lock_command)))
goto err;
memcpy_fixed(&lock_command,head,sizeof(lock_command));
if (verbose && !record_pos_file &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
printf_log("%s: %s(%d) -> %d\n",FILENAME(curr_file_info),
command_name[command],lock_command,result);
if (update && curr_file_info && !curr_file_info->closed)
{
if (maria_lock_database(curr_file_info->isam,lock_command) !=
(int) result)
goto com_err;
}
break;
case MARIA_LOG_DELETE_ALL:
if (verbose && !record_pos_file &&
(!table_names[0] || (curr_file_info && curr_file_info->used)))
printf_log("%s: %s -> %d\n",FILENAME(curr_file_info),
command_name[command],result);
break;
default:
fflush(stdout);
VOID(fprintf(stderr,
"Error: found unknown command %d in logfile, aborted\n",
command));
fflush(stderr);
goto end;
}
}
end_key_cache(maria_key_cache,1);
delete_tree(&tree);
VOID(end_io_cache(&cache));
VOID(my_close(file,MYF(0)));
if (write_file && my_fclose(write_file,MYF(MY_WME)))
DBUG_RETURN(1);
DBUG_RETURN(0);
err:
fflush(stdout);
VOID(fprintf(stderr,"Got error %d when reading from logfile\n",my_errno));
fflush(stderr);
goto end;
com_err:
fflush(stdout);
VOID(fprintf(stderr,"Got error %d, expected %d on command %s at %s\n",
my_errno,result,command_name[command],
llstr(isamlog_filepos,llbuff)));
fflush(stderr);
end:
end_key_cache(maria_key_cache, 1);
delete_tree(&tree);
VOID(end_io_cache(&cache));
VOID(my_close(file,MYF(0)));
if (write_file)
VOID(my_fclose(write_file,MYF(MY_WME)));
DBUG_RETURN(1);
}
static int read_string(IO_CACHE *file, register gptr *to, register uint length)
{
DBUG_ENTER("read_string");
if (*to)
my_free((gptr) *to,MYF(0));
if (!(*to= (gptr) my_malloc(length+1,MYF(MY_WME))) ||
my_b_read(file,(byte*) *to,length))
{
if (*to)
my_free(*to,MYF(0));
*to= 0;
DBUG_RETURN(1);
}
*((char*) *to+length)= '\0';
DBUG_RETURN (0);
} /* read_string */
static int file_info_compare(void* cmp_arg __attribute__((unused)),
void *a, void *b)
{
long lint;
if ((lint=((struct file_info*) a)->process -
((struct file_info*) b)->process))
return lint < 0L ? -1 : 1;
return ((struct file_info*) a)->filenr - ((struct file_info*) b)->filenr;
}
/* ARGSUSED */
static int test_if_open (struct file_info *key,
element_count count __attribute__((unused)),
struct test_if_open_param *param)
{
if (!strcmp(key->name,param->name) && key->id > param->max_id)
param->max_id=key->id;
return 0;
}
static void fix_blob_pointers(MARIA_HA *info, byte *record)
{
byte *pos;
MARIA_BLOB *blob,*end;
pos=record+info->s->base.reclength;
for (end=info->blobs+info->s->base.blobs, blob= info->blobs;
blob != end ;
blob++)
{
memcpy_fixed(record+blob->offset+blob->pack_length,&pos,sizeof(char*));
pos+= _ma_calc_blob_length(blob->pack_length,record+blob->offset);
}
}
/* close the file with hasn't been accessed for the longest time */
/* ARGSUSED */
static int test_when_accessed (struct file_info *key,
element_count count __attribute__((unused)),
struct st_access_param *access_param)
{
if (key->accessed < access_param->min_accessed && ! key->closed)
{
access_param->min_accessed=key->accessed;
access_param->found=key;
}
return 0;
}
static void file_info_free(struct file_info *fileinfo)
{
DBUG_ENTER("file_info_free");
if (update)
{
if (!fileinfo->closed)
VOID(maria_close(fileinfo->isam));
if (fileinfo->record)
my_free(fileinfo->record,MYF(0));
}
my_free(fileinfo->name,MYF(0));
my_free(fileinfo->show_name,MYF(0));
DBUG_VOID_RETURN;
}
static int close_some_file(TREE *tree)
{
struct st_access_param access_param;
access_param.min_accessed=LONG_MAX;
access_param.found=0;
VOID(tree_walk(tree,(tree_walk_action) test_when_accessed,
(void*) &access_param,left_root_right));
if (!access_param.found)
return 1; /* No open file that is possibly to close */
if (maria_close(access_param.found->isam))
return 1;
access_param.found->closed=1;
return 0;
}
static int reopen_closed_file(TREE *tree, struct file_info *fileinfo)
{
char name[FN_REFLEN];
if (close_some_file(tree))
return 1; /* No file to close */
strmov(name,fileinfo->show_name);
if (fileinfo->id > 1)
*strrchr(name,'<')='\0'; /* Remove "<id>" */
if (!(fileinfo->isam= maria_open(name,O_RDWR,HA_OPEN_WAIT_IF_LOCKED)))
return 1;
fileinfo->closed=0;
re_open_count++;
return 0;
}
/* Try to find record with uniq key */
static int find_record_with_key(struct file_info *file_info, byte *record)
{
uint key;
MARIA_HA *info=file_info->isam;
uchar tmp_key[HA_MAX_KEY_BUFF];
for (key=0 ; key < info->s->base.keys ; key++)
{
if (maria_is_key_active(info->s->state.key_map, key) &&
info->s->keyinfo[key].flag & HA_NOSAME)
{
VOID(_ma_make_key(info,key,tmp_key,record,0L));
return maria_rkey(info,file_info->record,(int) key,(char*) tmp_key,0,
HA_READ_KEY_EXACT);
}
}
return 1;
}
static void printf_log(const char *format,...)
{
char llbuff[21];
va_list args;
va_start(args,format);
if (verbose > 2)
printf("%9s:",llstr(isamlog_filepos,llbuff));
if (verbose > 1)
printf("%5ld ",isamlog_process); /* Write process number */
(void) vprintf((char*) format,args);
putchar('\n');
va_end(args);
}
static bool cmp_filename(struct file_info *file_info, my_string name)
{
if (!file_info)
return 1;
return strcmp(file_info->name,name) ? 1 : 0;
}
......@@ -1107,16 +1107,16 @@ static int get_statistic(PACK_MRG_INFO *mrg,HUFF_COUNTS *huff_counts)
my_off_t total_count;
char llbuf[32];
DBUG_PRINT("info", ("column: %3u", count - huff_counts + 1));
DBUG_PRINT("info", ("column: %3lu", count - huff_counts + 1));
if (verbose >= 2)
VOID(printf("column: %3u\n", count - huff_counts + 1));
VOID(printf("column: %3lu\n", count - huff_counts + 1));
if (count->tree_buff)
{
DBUG_PRINT("info", ("number of distinct values: %u",
DBUG_PRINT("info", ("number of distinct values: %lu",
(count->tree_pos - count->tree_buff) /
count->field_length));
if (verbose >= 2)
VOID(printf("number of distinct values: %u\n",
VOID(printf("number of distinct values: %lu\n",
(count->tree_pos - count->tree_buff) /
count->field_length));
}
......@@ -2281,7 +2281,7 @@ static my_off_t write_huff_tree(HUFF_TREE *huff_tree, uint trees)
if (bits > 8 * sizeof(code))
{
VOID(fflush(stdout));
VOID(fprintf(stderr, "error: Huffman code too long: %u/%u\n",
VOID(fprintf(stderr, "error: Huffman code too long: %u/%lu\n",
bits, 8 * sizeof(code)));
errors++;
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment