From 1692707cdc6e39a9ec2541ed7454d179c5ac71f2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 22 Feb 2006 08:32:58 +0100 Subject: [PATCH] myisamdef.h, mi_locking.c, mi_dynrec.c: Fix insert performance with mmap storage/myisam/mi_dynrec.c: Fix insert performance with mmap storage/myisam/mi_locking.c: Fix insert performance with mmap storage/myisam/myisamdef.h: Fix insert performance with mmap --- storage/myisam/mi_dynrec.c | 1 + storage/myisam/mi_locking.c | 4 +++- storage/myisam/myisamdef.h | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/storage/myisam/mi_dynrec.c b/storage/myisam/mi_dynrec.c index cdcd7b95ce1..36d88bd362a 100644 --- a/storage/myisam/mi_dynrec.c +++ b/storage/myisam/mi_dynrec.c @@ -201,6 +201,7 @@ uint mi_mmap_pwrite(MI_INFO *info, byte *Buffer, } else { + info->s->nonmmaped_inserts++; if (info->s->concurrent_insert) rw_unlock(&info->s->mmap_lock); return my_pwrite(info->dfile, Buffer, Count, offset, MyFlags); diff --git a/storage/myisam/mi_locking.c b/storage/myisam/mi_locking.c index 7c418cb9531..ecb737867f5 100644 --- a/storage/myisam/mi_locking.c +++ b/storage/myisam/mi_locking.c @@ -85,11 +85,13 @@ int mi_lock_database(MI_INFO *info, int lock_type) if (share->changed && !share->w_locks) { #ifdef HAVE_MMAP - if (info->s->mmaped_length != info->s->state.state.data_file_length) + if ((info->s->mmaped_length != info->s->state.state.data_file_length) && + (info->s->nonmmaped_inserts > MAX_NONMAPPED_INSERTS)) { if (info->s->concurrent_insert) rw_wrlock(&info->s->mmap_lock); mi_remap_file(info, info->s->state.state.data_file_length); + info->s->nonmmaped_inserts= 0; if (info->s->concurrent_insert) rw_unlock(&info->s->mmap_lock); } diff --git a/storage/myisam/myisamdef.h b/storage/myisam/myisamdef.h index 4e5c6be68fd..caf6254c321 100644 --- a/storage/myisam/myisamdef.h +++ b/storage/myisam/myisamdef.h @@ -152,6 +152,7 @@ typedef struct st_mi_isam_pack { uchar version; } MI_PACK; +#define MAX_NONMAPPED_INSERTS 1000 typedef struct st_mi_isam_share { /* Shared between opens */ MI_STATE_INFO state; @@ -211,6 +212,8 @@ typedef struct st_mi_isam_share { /* Shared between opens */ rw_lock_t *key_root_lock; #endif my_off_t mmaped_length; + uint nonmmaped_inserts; /* counter of writing in non-mmaped + area */ rw_lock_t mmap_lock; } MYISAM_SHARE;