diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c index 735f1aeb504d60d03cc4a24508f607b2a8c9fa46..ac341890296d389fbacd1b33bd48bee31eb2dadd 100755 --- a/storage/maria/ma_pagecache.c +++ b/storage/maria/ma_pagecache.c @@ -96,7 +96,7 @@ #define PCBLOCK_INFO(B) \ DBUG_PRINT("info", \ ("block: 0x%lx file: %lu page: %lu s: %0x hshL: 0x%lx req: %u/%u " \ - "wrlock: %c", \ + "wrlocks: %u", \ (ulong)(B), \ (ulong)((B)->hash_link ? \ (B)->hash_link->file.file : \ @@ -110,7 +110,7 @@ (uint)((B)->hash_link ? \ (B)->hash_link->requests : \ 0), \ - ((block->status & PCBLOCK_WRLOCK)?'Y':'N'))) + block->wlocks)) /* TODO: put it to my_static.c */ my_bool my_disable_flush_pagecache_blocks= 0; @@ -160,7 +160,6 @@ struct st_pagecache_hash_link #define PCBLOCK_REASSIGNED 8 /* block does not accept requests for old page */ #define PCBLOCK_IN_FLUSH 16 /* block is in flush operation */ #define PCBLOCK_CHANGED 32 /* block buffer contains a dirty page */ -#define PCBLOCK_WRLOCK 64 /* write locked block */ /* page status, returned by find_block */ #define PAGE_READ 0 @@ -313,6 +312,7 @@ struct st_pagecache_block_link uint requests; /* number of requests for the block */ uint status; /* state of the block */ uint pins; /* pin counter */ + uint wlocks; /* write locks counter */ enum PCBLOCK_TEMPERATURE temperature; /* block temperature: cold, warm, hot */ enum pagecache_page_type type; /* type of the block */ uint hits_left; /* number of hits left until promotion */ @@ -1884,7 +1884,7 @@ static PAGECACHE_BLOCK_LINK *find_block(PAGECACHE *pagecache, pagecache->blocks_used++; } pagecache->blocks_unused--; - DBUG_ASSERT((block->status & PCBLOCK_WRLOCK) == 0); + DBUG_ASSERT(block->wlocks == 0); DBUG_ASSERT(block->pins == 0); block->status= 0; #ifndef DBUG_OFF @@ -1949,16 +1949,16 @@ static PAGECACHE_BLOCK_LINK *find_block(PAGECACHE *pagecache, hash_link->block= block; } PCBLOCK_INFO(block); - DBUG_ASSERT((block->status & PCBLOCK_WRLOCK) == 0); + DBUG_ASSERT(block->wlocks == 0); DBUG_ASSERT(block->pins == 0); if (block->hash_link != hash_link && ! (block->status & PCBLOCK_IN_SWITCH) ) { /* this is a primary request for a new page */ - DBUG_ASSERT((block->status & PCBLOCK_WRLOCK) == 0); + DBUG_ASSERT(block->wlocks == 0); DBUG_ASSERT(block->pins == 0); - block->status|= (PCBLOCK_IN_SWITCH | PCBLOCK_WRLOCK); + block->status|= PCBLOCK_IN_SWITCH; KEYCACHE_DBUG_PRINT("find_block", ("got block %u for new page", @@ -2170,7 +2170,7 @@ static my_bool get_wrlock(PAGECACHE *pagecache, file.file, block->hash_link->file.file, pageno, block->hash_link->pageno)); PCBLOCK_INFO(block); - while ((block->status & PCBLOCK_WRLOCK) && block->write_locker != user_file) + while (block->wlocks && block->write_locker != user_file) { /* Lock failed we will wait */ #ifdef THREAD @@ -2203,7 +2203,7 @@ static my_bool get_wrlock(PAGECACHE *pagecache, } } /* we are doing it by global cache mutex protection, so it is OK */ - block->status|= PCBLOCK_WRLOCK; + block->wlocks++; block->write_locker= user_file; DBUG_PRINT("info", ("WR lock set, block 0x%lx", (ulong)block)); DBUG_RETURN(0); @@ -2226,11 +2226,11 @@ static void release_wrlock(PAGECACHE_BLOCK_LINK *block) { DBUG_ENTER("release_wrlock"); PCBLOCK_INFO(block); - DBUG_ASSERT(block->status & PCBLOCK_WRLOCK); + DBUG_ASSERT(block->wlocks > 0); DBUG_ASSERT(block->pins > 0); - if (block->pins > 1) + block->wlocks--; + if (block->wlocks > 0) DBUG_VOID_RETURN; /* Multiple write locked */ - block->status&= ~PCBLOCK_WRLOCK; DBUG_PRINT("info", ("WR lock reset, block 0x%lx", (ulong)block)); #ifdef THREAD /* release all threads waiting for write lock */ @@ -2270,9 +2270,9 @@ static my_bool make_lock_and_pin(PAGECACHE *pagecache, #ifndef DBUG_OFF if (block) { - DBUG_PRINT("enter", ("block: 0x%lx (%u) wrlock: %c pins: %u lock: %s pin: %s", + DBUG_PRINT("enter", ("block: 0x%lx (%u) wrlocks: %u pins: %u lock: %s pin: %s", (ulong)block, PCBLOCK_NUMBER(pagecache, block), - ((block->status & PCBLOCK_WRLOCK)?'Y':'N'), + block->wlocks, block->pins, page_cache_page_lock_str[lock], page_cache_page_pin_str[pin])); @@ -2406,7 +2406,7 @@ static void read_block(PAGECACHE *pagecache, if (got_length < pagecache->block_size) block->status|= PCBLOCK_ERROR; else - block->status= (PCBLOCK_READ | (block->status & PCBLOCK_WRLOCK)); + block->status= PCBLOCK_READ; if (validator != NULL && (*validator)(block->buffer, validator_data)) @@ -3284,7 +3284,7 @@ my_bool pagecache_write_part(PAGECACHE *pagecache, bmove512(block->buffer + offset, buff, size); else memcpy(block->buffer + offset, buff, size); - block->status= (PCBLOCK_READ | (block->status & PCBLOCK_WRLOCK)); + block->status= PCBLOCK_READ; /* The validator can change the page content (removing page protection) so it have to be called @@ -3399,7 +3399,7 @@ static void free_block(PAGECACHE *pagecache, PAGECACHE_BLOCK_LINK *block) } unlink_changed(block); - DBUG_ASSERT((block->status & PCBLOCK_WRLOCK) == 0); + DBUG_ASSERT(block->wlocks == 0); DBUG_ASSERT(block->pins == 0); block->status= 0; #ifndef DBUG_OFF @@ -3480,7 +3480,7 @@ static int flush_cached_blocks(PAGECACHE *pagecache, continue; } /* if the block is not pinned then it is not write locked */ - DBUG_ASSERT((block->status & PCBLOCK_WRLOCK) == 0); + DBUG_ASSERT(block->wlocks == 0); DBUG_ASSERT(block->pins == 0); if (make_lock_and_pin(pagecache, block, PAGECACHE_LOCK_WRITE, PAGECACHE_PIN, 0))