Commit 7244e84e authored by Venkata Sidagam's avatar Venkata Sidagam

Merging the fix from mysql-5.1 to mysql-5.5

parents 453fcc0c 0e9c1e9f
...@@ -354,7 +354,7 @@ static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)), ...@@ -354,7 +354,7 @@ static int _ftb_no_dupes_cmp(void* not_used __attribute__((unused)),
returns 1 if the search was finished (must-word wasn't found) returns 1 if the search was finished (must-word wasn't found)
*/ */
static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) static int _ft2_search_no_lock(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
{ {
int r; int r;
int subkeys=1; int subkeys=1;
...@@ -454,7 +454,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -454,7 +454,7 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
ftbw->key_root=info->s->state.key_root[ftb->keynr]; ftbw->key_root=info->s->state.key_root[ftb->keynr];
ftbw->keyinfo=info->s->keyinfo+ftb->keynr; ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
ftbw->off=0; ftbw->off=0;
return _ft2_search(ftb, ftbw, 0); return _ft2_search_no_lock(ftb, ftbw, 0);
} }
/* matching key found */ /* matching key found */
...@@ -482,6 +482,18 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search) ...@@ -482,6 +482,18 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
return 0; return 0;
} }
static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
{
int r;
MYISAM_SHARE *share= ftb->info->s;
if (share->concurrent_insert)
mysql_rwlock_rdlock(&share->key_root_lock[ftb->keynr]);
r= _ft2_search_no_lock(ftb, ftbw, init_search);
if (share->concurrent_insert)
mysql_rwlock_unlock(&share->key_root_lock[ftb->keynr]);
return r;
}
static void _ftb_init_index_search(FT_INFO *ftb) static void _ftb_init_index_search(FT_INFO *ftb)
{ {
int i; int i;
......
...@@ -69,9 +69,10 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -69,9 +69,10 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
TREE_ELEMENT *selem; TREE_ELEMENT *selem;
double gweight=1; double gweight=1;
MI_INFO *info=aio->info; MI_INFO *info=aio->info;
MYISAM_SHARE *share= info->s;
uchar *keybuff=aio->keybuff; uchar *keybuff=aio->keybuff;
MI_KEYDEF *keyinfo=info->s->keyinfo+aio->keynr; MI_KEYDEF *keyinfo=info->s->keyinfo+aio->keynr;
my_off_t key_root=info->s->state.key_root[aio->keynr]; my_off_t key_root;
uint extra= HA_FT_WLEN + info->s->rec_reflength; uint extra= HA_FT_WLEN + info->s->rec_reflength;
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
float tmp_weight; float tmp_weight;
...@@ -87,6 +88,11 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -87,6 +88,11 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
keylen-=HA_FT_WLEN; keylen-=HA_FT_WLEN;
doc_cnt=0; doc_cnt=0;
if (share->concurrent_insert)
mysql_rwlock_rdlock(&share->key_root_lock[aio->keynr]);
key_root= share->state.key_root[aio->keynr];
/* Skip rows inserted by current inserted */ /* Skip rows inserted by current inserted */
for (r=_mi_search(info, keyinfo, keybuff, keylen, SEARCH_FIND, key_root) ; for (r=_mi_search(info, keyinfo, keybuff, keylen, SEARCH_FIND, key_root) ;
!r && !r &&
...@@ -96,6 +102,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -96,6 +102,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
info->lastkey_length, SEARCH_BIGGER, key_root)) info->lastkey_length, SEARCH_BIGGER, key_root))
; ;
if (share->concurrent_insert)
mysql_rwlock_unlock(&share->key_root_lock[aio->keynr]);
info->update|= HA_STATE_AKTIV; /* for _mi_test_if_changed() */ info->update|= HA_STATE_AKTIV; /* for _mi_test_if_changed() */
/* The following should be safe, even if we compare doubles */ /* The following should be safe, even if we compare doubles */
...@@ -119,6 +128,8 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -119,6 +128,8 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
keyinfo=& info->s->ft2_keyinfo; keyinfo=& info->s->ft2_keyinfo;
key_root=info->lastpos; key_root=info->lastpos;
keylen=0; keylen=0;
if (share->concurrent_insert)
mysql_rwlock_rdlock(&share->key_root_lock[aio->keynr]);
r=_mi_search_first(info, keyinfo, key_root); r=_mi_search_first(info, keyinfo, key_root);
goto do_skip; goto do_skip;
} }
...@@ -153,6 +164,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) ...@@ -153,6 +164,9 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
if (gweight < 0 || doc_cnt > 2000000) if (gweight < 0 || doc_cnt > 2000000)
gweight=0; gweight=0;
if (share->concurrent_insert)
mysql_rwlock_rdlock(&share->key_root_lock[aio->keynr]);
if (_mi_test_if_changed(info) == 0) if (_mi_test_if_changed(info) == 0)
r=_mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length, r=_mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length,
SEARCH_BIGGER, key_root); SEARCH_BIGGER, key_root);
...@@ -165,6 +179,8 @@ do_skip: ...@@ -165,6 +179,8 @@ do_skip:
r= _mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length, r= _mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length,
SEARCH_BIGGER, key_root); SEARCH_BIGGER, key_root);
if (share->concurrent_insert)
mysql_rwlock_unlock(&share->key_root_lock[aio->keynr]);
} }
word->weight=gweight; word->weight=gweight;
......
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