Lines Matching refs:block

188   struct st_block_link *block;       /* reference to the block for the page: */  member
245 static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block);
342 static int fail_block(BLOCK_LINK *block);
968 static inline void unlink_changed(BLOCK_LINK *block) in unlink_changed() argument
970 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in unlink_changed()
971 if (block->next_changed) in unlink_changed()
972 block->next_changed->prev_changed= block->prev_changed; in unlink_changed()
973 *block->prev_changed= block->next_changed; in unlink_changed()
980 block->next_changed= NULL; in unlink_changed()
981 block->prev_changed= NULL; in unlink_changed()
990 static inline void link_changed(BLOCK_LINK *block, BLOCK_LINK **phead) in link_changed() argument
992 DBUG_ASSERT(!block->next_changed); in link_changed()
993 DBUG_ASSERT(!block->prev_changed); in link_changed()
994 block->prev_changed= phead; in link_changed()
995 if ((block->next_changed= *phead)) in link_changed()
996 (*phead)->prev_changed= &block->next_changed; in link_changed()
997 *phead= block; in link_changed()
1027 BLOCK_LINK *block, int file, in link_to_file_list() argument
1030 DBUG_ASSERT(block->status & BLOCK_IN_USE); in link_to_file_list()
1031 DBUG_ASSERT(block->hash_link && block->hash_link->block == block); in link_to_file_list()
1032 DBUG_ASSERT(block->hash_link->file == file); in link_to_file_list()
1034 unlink_changed(block); in link_to_file_list()
1035 link_changed(block, &keycache->file_blocks[FILE_HASH(file)]); in link_to_file_list()
1036 if (block->status & BLOCK_CHANGED) in link_to_file_list()
1038 block->status&= ~BLOCK_CHANGED; in link_to_file_list()
1068 BLOCK_LINK *block) in link_to_changed_list() argument
1070 DBUG_ASSERT(block->status & BLOCK_IN_USE); in link_to_changed_list()
1071 DBUG_ASSERT(!(block->status & BLOCK_CHANGED)); in link_to_changed_list()
1072 DBUG_ASSERT(block->hash_link && block->hash_link->block == block); in link_to_changed_list()
1074 unlink_changed(block); in link_to_changed_list()
1075 link_changed(block, in link_to_changed_list()
1076 &keycache->changed_blocks[FILE_HASH(block->hash_link->file)]); in link_to_changed_list()
1077 block->status|=BLOCK_CHANGED; in link_to_changed_list()
1122 static void link_block(KEY_CACHE *keycache, BLOCK_LINK *block, my_bool hot, in link_block() argument
1128 DBUG_ASSERT((block->status & ~BLOCK_CHANGED) == (BLOCK_READ | BLOCK_IN_USE)); in link_block()
1129 DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/ in link_block()
1130 DBUG_ASSERT(!block->requests); in link_block()
1131 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in link_block()
1132 DBUG_ASSERT(!block->next_used); in link_block()
1133 DBUG_ASSERT(!block->prev_used); in link_block()
1157 block->requests++; in link_block()
1161 hash_link->block= block; in link_block()
1184 block->status|= BLOCK_IN_EVICTION; in link_block()
1189 BLOCK_NUMBER(block), block->status, in link_block()
1190 block->requests, keycache->blocks_available)); in link_block()
1199 ins->next_used->prev_used= &block->next_used; in link_block()
1200 block->next_used= ins->next_used; in link_block()
1201 block->prev_used= &ins->next_used; in link_block()
1202 ins->next_used= block; in link_block()
1204 *pins= block; in link_block()
1209 keycache->used_last= keycache->used_ins= block->next_used= block; in link_block()
1210 block->prev_used= &block->next_used; in link_block()
1217 BLOCK_NUMBER(block), at_end, block->status, in link_block()
1218 block->requests, keycache->blocks_available)); in link_block()
1240 static void unlink_block(KEY_CACHE *keycache, BLOCK_LINK *block) in unlink_block() argument
1242 DBUG_ASSERT((block->status & ~BLOCK_CHANGED) == (BLOCK_READ | BLOCK_IN_USE)); in unlink_block()
1243 DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/ in unlink_block()
1244 DBUG_ASSERT(!block->requests); in unlink_block()
1245 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in unlink_block()
1246 DBUG_ASSERT(block->next_used && block->prev_used && in unlink_block()
1247 (block->next_used->prev_used == &block->next_used) && in unlink_block()
1248 (*block->prev_used == block)); in unlink_block()
1249 if (block->next_used == block) in unlink_block()
1254 block->next_used->prev_used= block->prev_used; in unlink_block()
1255 *block->prev_used= block->next_used; in unlink_block()
1256 if (keycache->used_last == block) in unlink_block()
1257 keycache->used_last= STRUCT_PTR(BLOCK_LINK, next_used, block->prev_used); in unlink_block()
1258 if (keycache->used_ins == block) in unlink_block()
1259 keycache->used_ins=STRUCT_PTR(BLOCK_LINK, next_used, block->prev_used); in unlink_block()
1261 block->next_used= NULL; in unlink_block()
1267 block->prev_used= NULL; in unlink_block()
1276 BLOCK_NUMBER(block), block->status, in unlink_block()
1277 block->requests, keycache->blocks_available)); in unlink_block()
1298 static void reg_requests(KEY_CACHE *keycache, BLOCK_LINK *block, int count) in reg_requests() argument
1300 DBUG_ASSERT(block->status & BLOCK_IN_USE); in reg_requests()
1301 DBUG_ASSERT(block->hash_link); in reg_requests()
1303 if (!block->requests) in reg_requests()
1304 unlink_block(keycache, block); in reg_requests()
1305 block->requests+=count; in reg_requests()
1342 BLOCK_LINK *block, int at_end) in unreg_request() argument
1344 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in unreg_request()
1345 DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/ in unreg_request()
1346 DBUG_ASSERT(block->requests); in unreg_request()
1347 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in unreg_request()
1348 DBUG_ASSERT(!block->next_used); in unreg_request()
1349 DBUG_ASSERT(!block->prev_used); in unreg_request()
1354 if (!--block->requests && !(block->status & BLOCK_ERROR)) in unreg_request()
1357 if (block->hits_left) in unreg_request()
1358 block->hits_left--; in unreg_request()
1359 hot= !block->hits_left && at_end && in unreg_request()
1363 if (block->temperature == BLOCK_WARM) in unreg_request()
1365 block->temperature= BLOCK_HOT; in unreg_request()
1369 link_block(keycache, block, hot, (my_bool)at_end); in unreg_request()
1370 block->last_hit_time= keycache->keycache_time; in unreg_request()
1387 block= keycache->used_ins; in unreg_request()
1388 if (block && keycache->keycache_time - block->last_hit_time > in unreg_request()
1391 unlink_block(keycache, block); in unreg_request()
1392 link_block(keycache, block, 0, 0); in unreg_request()
1393 if (block->temperature != BLOCK_WARM) in unreg_request()
1396 block->temperature= BLOCK_WARM; in unreg_request()
1408 static void remove_reader(BLOCK_LINK *block) in remove_reader() argument
1410 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in remove_reader()
1411 DBUG_ASSERT(block->hash_link && block->hash_link->block == block); in remove_reader()
1412 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in remove_reader()
1413 DBUG_ASSERT(!block->next_used); in remove_reader()
1414 DBUG_ASSERT(!block->prev_used); in remove_reader()
1415 DBUG_ASSERT(block->hash_link->requests); in remove_reader()
1417 if (! --block->hash_link->requests && block->condvar) in remove_reader()
1418 keycache_pthread_cond_signal(block->condvar); in remove_reader()
1428 BLOCK_LINK *block) in wait_for_readers() argument
1431 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in wait_for_readers()
1432 DBUG_ASSERT(!(block->status & (BLOCK_IN_FLUSH | BLOCK_CHANGED))); in wait_for_readers()
1433 DBUG_ASSERT(block->hash_link); in wait_for_readers()
1434 DBUG_ASSERT(block->hash_link->block == block); in wait_for_readers()
1436 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in wait_for_readers()
1438 DBUG_ASSERT(!block->next_used); in wait_for_readers()
1439 DBUG_ASSERT(!block->prev_used); in wait_for_readers()
1440 while (block->hash_link->requests) in wait_for_readers()
1444 thread->id, BLOCK_NUMBER(block))); in wait_for_readers()
1446 DBUG_ASSERT(!block->condvar); in wait_for_readers()
1447 block->condvar= &thread->suspend; in wait_for_readers()
1449 block->condvar= NULL; in wait_for_readers()
1479 hash_link->block= NULL; in unlink_hash()
1648 BLOCK_LINK *block; in find_key_block() local
1699 if ((block= hash_link->block) && in find_key_block()
1700 block->hash_link == hash_link && (block->status & BLOCK_READ)) in find_key_block()
1716 if (!block) in find_key_block()
1779 reg_requests(keycache, block, 1); in find_key_block()
1802 DBUG_ASSERT(((block->hash_link != hash_link) && in find_key_block()
1803 (block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))) || in find_key_block()
1804 ((block->hash_link == hash_link) && in find_key_block()
1805 !(block->status & BLOCK_READ))); in find_key_block()
1806 wait_on_queue(&block->wqueue[COND_FOR_REQUESTED], &keycache->cache_lock); in find_key_block()
1817 DBUG_ASSERT(block->hash_link == hash_link); in find_key_block()
1818 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in find_key_block()
1819 DBUG_ASSERT(!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))); in find_key_block()
1833 (block->hash_link == hash_link)); in find_key_block()
1834 DBUG_RETURN(block); in find_key_block()
1841 DBUG_ASSERT(!(block->status & BLOCK_FOR_UPDATE) || fail_block(block)); in find_key_block()
1843 while (block->status & BLOCK_IN_FLUSH) in find_key_block()
1854 wait_on_queue(&block->wqueue[COND_FOR_SAVED], &keycache->cache_lock); in find_key_block()
1861 remove_reader(block); in find_key_block()
1862 unreg_request(keycache, block, 1); in find_key_block()
1865 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in find_key_block()
1866 DBUG_ASSERT(!(block->status & BLOCK_FOR_UPDATE) || fail_block(block)); in find_key_block()
1867 DBUG_ASSERT(block->hash_link == hash_link); in find_key_block()
1870 if (block->status & BLOCK_CHANGED) in find_key_block()
1882 (block->hash_link == hash_link)); in find_key_block()
1883 DBUG_RETURN(block); in find_key_block()
1897 remove_reader(block); in find_key_block()
1900 if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | in find_key_block()
1913 free_block(keycache, block); in find_key_block()
1921 unreg_request(keycache, block, 1); in find_key_block()
1939 wait_on_queue(&block->wqueue[COND_FOR_SAVED], in find_key_block()
1947 } while (block->hash_link && in find_key_block()
1948 (block->hash_link->file == file) && in find_key_block()
1949 (block->hash_link->diskpos == filepos)); in find_key_block()
1955 (block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | in find_key_block()
1971 BLOCK_NUMBER(block), wrmode, block->status)); in find_key_block()
1976 if (!wrmode && !(block->status & BLOCK_REASSIGNED)) in find_key_block()
1983 reg_requests(keycache, block, 1); in find_key_block()
2004 wait_on_queue(&block->wqueue[COND_FOR_SAVED], &keycache->cache_lock); in find_key_block()
2026 if (! block) in find_key_block()
2034 block= keycache->free_block_list; in find_key_block()
2035 keycache->free_block_list= block->next_used; in find_key_block()
2036 block->next_used= NULL; in find_key_block()
2044 block= &keycache->block_root[keycache->blocks_used]; in find_key_block()
2047 block->buffer= ADD_TO_PTR(keycache->block_mem, in find_key_block()
2051 DBUG_ASSERT(!block->next_used); in find_key_block()
2053 DBUG_ASSERT(!block->prev_used); in find_key_block()
2054 DBUG_ASSERT(!block->next_changed); in find_key_block()
2055 DBUG_ASSERT(!block->prev_changed); in find_key_block()
2056 DBUG_ASSERT(!block->hash_link); in find_key_block()
2057 DBUG_ASSERT(!block->status); in find_key_block()
2058 DBUG_ASSERT(!block->requests); in find_key_block()
2060 block->status= BLOCK_IN_USE; in find_key_block()
2061 block->length= 0; in find_key_block()
2062 block->offset= keycache->key_cache_block_size; in find_key_block()
2063 block->requests= 1; in find_key_block()
2064 block->temperature= BLOCK_COLD; in find_key_block()
2065 block->hits_left= init_hits_left; in find_key_block()
2066 block->last_hit_time= 0; in find_key_block()
2067 block->hash_link= hash_link; in find_key_block()
2068 hash_link->block= block; in find_key_block()
2069 link_to_file_list(keycache, block, file, 0); in find_key_block()
2073 BLOCK_NUMBER(block))); in find_key_block()
2109 DBUG_ASSERT(hash_link->block->requests); in find_key_block()
2111 DBUG_ASSERT(!hash_link->block->next_used); in find_key_block()
2112 DBUG_ASSERT(!hash_link->block->prev_used); in find_key_block()
2120 block= hash_link->block; in find_key_block()
2121 if (! block) in find_key_block()
2124 block= keycache->used_last->next_used; in find_key_block()
2125 block->hits_left= init_hits_left; in find_key_block()
2126 block->last_hit_time= 0; in find_key_block()
2127 hash_link->block= block; in find_key_block()
2132 DBUG_ASSERT(!block->requests); in find_key_block()
2133 reg_requests(keycache, block,1); in find_key_block()
2150 if (block->hash_link != hash_link && in find_key_block()
2151 ! (block->status & BLOCK_IN_SWITCH) ) in find_key_block()
2154 block->status|= BLOCK_IN_SWITCH; in find_key_block()
2157 ("got block %u for new page", BLOCK_NUMBER(block))); in find_key_block()
2159 if (block->status & BLOCK_CHANGED) in find_key_block()
2164 if (block->status & BLOCK_IN_FLUSH) in find_key_block()
2173 wait_on_queue(&block->wqueue[COND_FOR_SAVED], in find_key_block()
2179 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in find_key_block()
2180 DBUG_ASSERT(!(block->status & (BLOCK_REASSIGNED | in find_key_block()
2186 block->status|= BLOCK_IN_FLUSH | BLOCK_IN_FLUSHWRITE; in find_key_block()
2191 DBUG_ASSERT((block->status & ~BLOCK_IN_EVICTION) == in find_key_block()
2195 DBUG_ASSERT(block->hash_link); in find_key_block()
2202 error= my_pwrite(block->hash_link->file, in find_key_block()
2203 block->buffer + block->offset, in find_key_block()
2204 block->length - block->offset, in find_key_block()
2205 block->hash_link->diskpos + block->offset, in find_key_block()
2210 DBUG_ASSERT((block->status & ~BLOCK_IN_EVICTION) == in find_key_block()
2213 BLOCK_CHANGED | BLOCK_IN_USE) || fail_block(block)); in find_key_block()
2218 block->status|= BLOCK_REASSIGNED; in find_key_block()
2223 DBUG_ASSERT(block->hash_link); in find_key_block()
2224 if (block->hash_link) in find_key_block()
2239 block->status&= ~(BLOCK_IN_FLUSH | BLOCK_IN_FLUSHWRITE); in find_key_block()
2240 link_to_file_list(keycache, block, block->hash_link->file, 1); in find_key_block()
2241 release_whole_queue(&block->wqueue[COND_FOR_SAVED]); in find_key_block()
2249 wait_for_readers(keycache, block); in find_key_block()
2250 DBUG_ASSERT(block->hash_link && block->hash_link->block == block && in find_key_block()
2251 block->prev_changed); in find_key_block()
2253 DBUG_ASSERT(!(block->status & BLOCK_CHANGED)); in find_key_block()
2256 release_whole_queue(&block->wqueue[COND_FOR_SAVED]); in find_key_block()
2259 unlink_hash(keycache, block->hash_link); in find_key_block()
2268 unlink_changed(block); in find_key_block()
2270 block->status= error ? BLOCK_ERROR : BLOCK_IN_USE ; in find_key_block()
2271 block->length= 0; in find_key_block()
2272 block->offset= keycache->key_cache_block_size; in find_key_block()
2273 block->hash_link= hash_link; in find_key_block()
2274 link_to_file_list(keycache, block, file, 0); in find_key_block()
2277 KEYCACHE_DBUG_ASSERT(block->hash_link->block == block); in find_key_block()
2278 KEYCACHE_DBUG_ASSERT(hash_link->block->hash_link == hash_link); in find_key_block()
2298 "block->status: %u", block->hash_link, in find_key_block()
2299 hash_link, block->status )); in find_key_block()
2300 page_status= (((block->hash_link == hash_link) && in find_key_block()
2301 (block->status & BLOCK_READ)) ? in find_key_block()
2328 DBUG_ASSERT(((block->hash_link != hash_link) && in find_key_block()
2329 (block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))) || in find_key_block()
2330 ((block->hash_link == hash_link) && in find_key_block()
2331 !(block->status & BLOCK_READ)) || in find_key_block()
2332 ((block->status & BLOCK_READ) && in find_key_block()
2333 !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH)))); in find_key_block()
2334 reg_requests(keycache, block, 1); in find_key_block()
2337 "block->status: %u", block->hash_link, in find_key_block()
2338 hash_link, block->status )); in find_key_block()
2339 page_status= (((block->hash_link == hash_link) && in find_key_block()
2340 (block->status & BLOCK_READ)) ? in find_key_block()
2347 KEYCACHE_DBUG_ASSERT(block); in find_key_block()
2349 DBUG_ASSERT(block->requests); in find_key_block()
2350 DBUG_ASSERT(!block->next_used); in find_key_block()
2351 DBUG_ASSERT(!block->prev_used); in find_key_block()
2354 ((block->hash_link->file == file) && in find_key_block()
2355 (block->hash_link->diskpos == filepos))); in find_key_block()
2359 file, (ulong) filepos, block->status, in find_key_block()
2367 DBUG_RETURN(block); in find_key_block()
2396 BLOCK_LINK *block, uint read_length, in read_block() argument
2412 DBUG_ASSERT(((block->status & ~BLOCK_FOR_UPDATE) == BLOCK_IN_USE) || in read_block()
2413 fail_block(block)); in read_block()
2414 DBUG_ASSERT((block->length == 0) || fail_block(block)); in read_block()
2415 DBUG_ASSERT((block->offset == keycache->key_cache_block_size) || in read_block()
2416 fail_block(block)); in read_block()
2417 DBUG_ASSERT((block->requests > 0) || fail_block(block)); in read_block()
2429 got_length= my_pread(block->hash_link->file, block->buffer, in read_block()
2430 read_length, block->hash_link->diskpos, MYF(0)); in read_block()
2436 DBUG_ASSERT(((block->status & ~(BLOCK_REASSIGNED | in read_block()
2438 fail_block(block)); in read_block()
2439 DBUG_ASSERT((block->length == 0) || fail_block(block)); in read_block()
2440 DBUG_ASSERT((block->offset == keycache->key_cache_block_size) || in read_block()
2441 fail_block(block)); in read_block()
2442 DBUG_ASSERT((block->requests > 0) || fail_block(block)); in read_block()
2445 block->status|= BLOCK_ERROR; in read_block()
2448 block->status|= BLOCK_READ; in read_block()
2449 block->length= got_length; in read_block()
2460 release_whole_queue(&block->wqueue[COND_FOR_REQUESTED]); in read_block()
2475 wait_on_queue(&block->wqueue[COND_FOR_REQUESTED], &keycache->cache_lock); in read_block()
2526 BLOCK_LINK *block; in key_cache_read() local
2592 block=find_key_block(keycache, file, filepos, level, 0, &page_st); in key_cache_read()
2593 if (!block) in key_cache_read()
2607 if (!(block->status & BLOCK_ERROR)) in key_cache_read()
2613 read_block(keycache, block, in key_cache_read()
2622 DBUG_ASSERT(block->hash_link->file == file); in key_cache_read()
2623 DBUG_ASSERT(block->hash_link->diskpos == filepos); in key_cache_read()
2624 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_read()
2626 else if (block->length < read_length + offset) in key_cache_read()
2634 block->status|= BLOCK_ERROR; in key_cache_read()
2643 if (!(block->status & BLOCK_ERROR)) in key_cache_read()
2646 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_read()
2652 memcpy(buff, block->buffer+offset, (size_t) read_length); in key_cache_read()
2656 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_read()
2661 remove_reader(block); in key_cache_read()
2665 block->status|= BLOCK_ERROR;); in key_cache_read()
2668 if (!(block->status & BLOCK_ERROR)) in key_cache_read()
2674 unreg_request(keycache, block, 1); in key_cache_read()
2678 free_block(keycache, block); in key_cache_read()
2756 BLOCK_LINK *block; in key_cache_insert() local
2797 block= find_key_block(keycache, file, filepos, level, 0, &page_st); in key_cache_insert()
2798 if (!block) in key_cache_insert()
2807 if (!(block->status & BLOCK_ERROR)) in key_cache_insert()
2840 read_block(keycache, block, keycache->key_cache_block_size, in key_cache_insert()
2848 DBUG_ASSERT(block->hash_link->file == file); in key_cache_insert()
2849 DBUG_ASSERT(block->hash_link->diskpos == filepos); in key_cache_insert()
2850 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_insert()
2858 DBUG_ASSERT(block->hash_link->requests); in key_cache_insert()
2859 DBUG_ASSERT(block->status & BLOCK_IN_USE); in key_cache_insert()
2861 (block->status & BLOCK_READ)); in key_cache_insert()
2872 memcpy(block->buffer+offset, buff, (size_t) read_length); in key_cache_insert()
2876 DBUG_ASSERT(block->status & BLOCK_IN_USE); in key_cache_insert()
2878 (block->status & BLOCK_READ)); in key_cache_insert()
2886 block->status|= BLOCK_READ; in key_cache_insert()
2887 block->length= read_length+offset; in key_cache_insert()
2897 release_whole_queue(&block->wqueue[COND_FOR_REQUESTED]); in key_cache_insert()
2912 (read_length + offset <= block->length)); in key_cache_insert()
2920 DBUG_ASSERT(block->hash_link->file == file); in key_cache_insert()
2921 DBUG_ASSERT(block->hash_link->diskpos == filepos); in key_cache_insert()
2922 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_insert()
2925 remove_reader(block); in key_cache_insert()
2929 block->status|= BLOCK_ERROR; errno=EIO;); in key_cache_insert()
2932 if (!(block->status & BLOCK_ERROR)) in key_cache_insert()
2938 unreg_request(keycache, block, 1); in key_cache_insert()
2942 free_block(keycache, block); in key_cache_insert()
3026 BLOCK_LINK *block; in key_cache_write() local
3086 block= find_key_block(keycache, file, filepos, level, 1, &page_st); in key_cache_write()
3087 if (!block) in key_cache_write()
3113 block->status|= BLOCK_FOR_UPDATE; in key_cache_write()
3126 if (!(block->status & BLOCK_ERROR) && in key_cache_write()
3131 read_block(keycache, block, in key_cache_write()
3136 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_write()
3142 block->status|= BLOCK_FOR_UPDATE; in key_cache_write()
3148 DBUG_ASSERT(block->hash_link->file == file); in key_cache_write()
3149 DBUG_ASSERT(block->hash_link->diskpos == filepos); in key_cache_write()
3150 DBUG_ASSERT(block->status & BLOCK_IN_USE); in key_cache_write()
3151 DBUG_ASSERT((page_st == PAGE_TO_BE_READ) || (block->status & BLOCK_READ)); in key_cache_write()
3160 DBUG_ASSERT(!(block->status & BLOCK_REASSIGNED)); in key_cache_write()
3162 while (block->status & BLOCK_IN_FLUSHWRITE) in key_cache_write()
3173 wait_on_queue(&block->wqueue[COND_FOR_SAVED], &keycache->cache_lock); in key_cache_write()
3175 DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE)); in key_cache_write()
3177 DBUG_ASSERT(!(block->status & BLOCK_REASSIGNED)); in key_cache_write()
3178 DBUG_ASSERT(block->hash_link && (block->hash_link->block == block)); in key_cache_write()
3190 if (!(block->status & BLOCK_ERROR)) in key_cache_write()
3195 memcpy(block->buffer+offset, buff, (size_t) read_length); in key_cache_write()
3205 if ((block->status & BLOCK_CHANGED) && in key_cache_write()
3207 link_to_file_list(keycache, block, block->hash_link->file, 1); in key_cache_write()
3209 else if (! (block->status & BLOCK_CHANGED)) in key_cache_write()
3210 link_to_changed_list(keycache, block); in key_cache_write()
3211 block->status|=BLOCK_READ; in key_cache_write()
3217 block->status&= ~BLOCK_FOR_UPDATE; in key_cache_write()
3218 set_if_smaller(block->offset, offset); in key_cache_write()
3219 set_if_bigger(block->length, read_length+offset); in key_cache_write()
3222 release_whole_queue(&block->wqueue[COND_FOR_REQUESTED]); in key_cache_write()
3232 remove_reader(block); in key_cache_write()
3236 block->status|= BLOCK_ERROR;); in key_cache_write()
3239 if (!(block->status & BLOCK_ERROR)) in key_cache_write()
3245 unreg_request(keycache, block, 1); in key_cache_write()
3250 block->status&= ~(BLOCK_CHANGED); in key_cache_write()
3251 free_block(keycache, block); in key_cache_write()
3331 static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block) in free_block() argument
3336 BLOCK_NUMBER(block), block->hash_link, in free_block()
3337 block->status)); in free_block()
3345 DBUG_ASSERT((block->status & BLOCK_IN_USE) && in free_block()
3346 !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | in free_block()
3350 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in free_block()
3352 DBUG_ASSERT(!block->next_used && !block->prev_used); in free_block()
3362 DBUG_ASSERT(block->hash_link && block->hash_link->block == block); in free_block()
3363 if (block->hash_link) in free_block()
3371 block->status|= BLOCK_REASSIGNED; in free_block()
3372 wait_for_readers(keycache, block); in free_block()
3378 DBUG_ASSERT(block->hash_link && block->hash_link->block == block); in free_block()
3379 DBUG_ASSERT((block->status & (BLOCK_READ | BLOCK_IN_USE | in free_block()
3381 !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | in free_block()
3384 DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); in free_block()
3385 DBUG_ASSERT(!block->prev_used); in free_block()
3391 block->status&= ~BLOCK_REASSIGNED; in free_block()
3408 DBUG_ASSERT(block->requests == 1); in free_block()
3409 unreg_request(keycache, block, 0); in free_block()
3416 if (block->status & BLOCK_IN_EVICTION) in free_block()
3420 if (!(block->status & BLOCK_ERROR)) in free_block()
3423 DBUG_ASSERT(block->next_used && block->prev_used && in free_block()
3424 *block->prev_used == block); in free_block()
3425 unlink_block(keycache, block); in free_block()
3427 if (block->temperature == BLOCK_WARM) in free_block()
3429 block->temperature= BLOCK_COLD; in free_block()
3432 unlink_changed(block); in free_block()
3435 unlink_hash(keycache, block->hash_link); in free_block()
3436 block->hash_link= NULL; in free_block()
3438 block->status= 0; in free_block()
3439 block->length= 0; in free_block()
3440 block->offset= keycache->key_cache_block_size; in free_block()
3445 DBUG_ASSERT(!block->next_changed && !block->prev_changed); in free_block()
3447 DBUG_ASSERT(!block->next_used && !block->prev_used); in free_block()
3449 block->next_used= keycache->free_block_list; in free_block()
3450 keycache->free_block_list= block; in free_block()
3455 release_whole_queue(&block->wqueue[COND_FOR_SAVED]); in free_block()
3496 BLOCK_LINK *block= *cache; in flush_cached_blocks() local
3499 ("block %u to be flushed", BLOCK_NUMBER(block))); in flush_cached_blocks()
3505 if (!(block->status & BLOCK_FOR_UPDATE)) in flush_cached_blocks()
3508 DBUG_ASSERT(block->hash_link); in flush_cached_blocks()
3509 DBUG_ASSERT(block->hash_link->block == block); in flush_cached_blocks()
3510 DBUG_ASSERT(block->hash_link->file == file); in flush_cached_blocks()
3511 DBUG_ASSERT((block->status & ~BLOCK_IN_EVICTION) == in flush_cached_blocks()
3513 block->status|= BLOCK_IN_FLUSHWRITE; in flush_cached_blocks()
3515 error= my_pwrite(file, block->buffer+block->offset, in flush_cached_blocks()
3516 block->length - block->offset, in flush_cached_blocks()
3517 block->hash_link->diskpos+ block->offset, in flush_cached_blocks()
3523 block->status|= BLOCK_ERROR; in flush_cached_blocks()
3527 block->status&= ~BLOCK_IN_FLUSHWRITE; in flush_cached_blocks()
3529 DBUG_ASSERT(block->hash_link); in flush_cached_blocks()
3530 DBUG_ASSERT(block->hash_link->block == block); in flush_cached_blocks()
3531 DBUG_ASSERT(block->hash_link->file == file); in flush_cached_blocks()
3532 DBUG_ASSERT((block->status & ~(BLOCK_FOR_UPDATE | BLOCK_IN_EVICTION)) == in flush_cached_blocks()
3541 link_to_file_list(keycache, block, file, 1); in flush_cached_blocks()
3543 block->status&= ~BLOCK_IN_FLUSH; in flush_cached_blocks()
3548 release_whole_queue(&block->wqueue[COND_FOR_SAVED]); in flush_cached_blocks()
3551 !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | in flush_cached_blocks()
3558 free_block(keycache, block); in flush_cached_blocks()
3568 unreg_request(keycache, block, 1); in flush_cached_blocks()
3625 BLOCK_LINK *block, *next; in flush_key_blocks_int() local
3637 for (block= keycache->changed_blocks[FILE_HASH(file)] ; in flush_key_blocks_int()
3638 block ; in flush_key_blocks_int()
3639 block= block->next_changed) in flush_key_blocks_int()
3641 if ((block->hash_link->file == file) && in flush_key_blocks_int()
3642 !(block->status & BLOCK_IN_FLUSH)) in flush_key_blocks_int()
3670 for (block= keycache->changed_blocks[FILE_HASH(file)] ; in flush_key_blocks_int()
3671 block ; in flush_key_blocks_int()
3672 block= next) in flush_key_blocks_int()
3678 next= block->next_changed; in flush_key_blocks_int()
3679 if (block->hash_link->file == file) in flush_key_blocks_int()
3681 if (!(block->status & (BLOCK_IN_FLUSH | BLOCK_FOR_UPDATE))) in flush_key_blocks_int()
3688 if (!(block->status & BLOCK_IN_SWITCH)) in flush_key_blocks_int()
3696 reg_requests(keycache, block, 1); in flush_key_blocks_int()
3707 unreg_request(keycache, block, 0); in flush_key_blocks_int()
3734 block->status|= BLOCK_IN_FLUSH; in flush_key_blocks_int()
3736 *pos++= block; in flush_key_blocks_int()
3741 DBUG_ASSERT(!(block->status & BLOCK_REASSIGNED)); in flush_key_blocks_int()
3748 link_to_file_list(keycache, block, file, 1); in flush_key_blocks_int()
3749 if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))) in flush_key_blocks_int()
3752 free_block(keycache, block); in flush_key_blocks_int()
3762 unreg_request(keycache, block, 1); in flush_key_blocks_int()
3777 unlink_changed(block); in flush_key_blocks_int()
3778 link_changed(block, &first_in_switch); in flush_key_blocks_int()
3791 if (block->status & BLOCK_IN_FLUSH) in flush_key_blocks_int()
3794 last_in_flush= block; in flush_key_blocks_int()
3799 last_for_update= block; in flush_key_blocks_int()
3892 for (block= keycache->file_blocks[FILE_HASH(file)] ; in flush_key_blocks_int()
3893 block ; in flush_key_blocks_int()
3894 block= next) in flush_key_blocks_int()
3897 next= block->next_changed; in flush_key_blocks_int()
3900 DBUG_ASSERT(!(block->status & BLOCK_CHANGED)); in flush_key_blocks_int()
3901 if (block->hash_link->file == file) in flush_key_blocks_int()
3904 if (block->status & BLOCK_FOR_UPDATE) in flush_key_blocks_int()
3906 last_for_update= block; in flush_key_blocks_int()
3915 if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH | in flush_key_blocks_int()
3933 reg_requests(keycache, block, 1); in flush_key_blocks_int()
3941 if (next && (hash_requests= block->hash_link->requests)) in flush_key_blocks_int()
3948 DBUG_ASSERT(next == next_hash_link->block); in flush_key_blocks_int()
3951 free_block(keycache, block); in flush_key_blocks_int()
3968 (next != next_hash_link->block))) in flush_key_blocks_int()
3973 last_in_switch= block; in flush_key_blocks_int()
4105 BLOCK_LINK *block; in flush_all_key_blocks() local
4135 if ((block= keycache->changed_blocks[idx])) in flush_all_key_blocks()
4142 if (flush_key_blocks_int(keycache, block->hash_link->file, in flush_all_key_blocks()
4172 if ((block= keycache->file_blocks[idx])) in flush_all_key_blocks()
4176 if (flush_key_blocks_int(keycache, block->hash_link->file, in flush_all_key_blocks()
4264 BLOCK_LINK *block; in keycache_dump() local
4307 block= &keycache->block_root[i]; in keycache_dump()
4308 hash_link= block->hash_link; in keycache_dump()
4312 block->status, block->requests, block->condvar ? 1 : 0); in keycache_dump()
4315 KEYCACHE_WQUEUE *wqueue=&block->wqueue[j]; in keycache_dump()
4333 block= keycache= used_last; in keycache_dump()
4334 if (block) in keycache_dump()
4338 block= block->next_used; in keycache_dump()
4340 "block:%u, ", BLOCK_NUMBER(block)); in keycache_dump()
4342 while (block != keycache->used_last); in keycache_dump()
4474 static int fail_block(BLOCK_LINK *block) in fail_block() argument
4476 F_B_PRT("block->next_used: %lx\n", (ulong) block->next_used); in fail_block()
4477 F_B_PRT("block->prev_used: %lx\n", (ulong) block->prev_used); in fail_block()
4478 F_B_PRT("block->next_changed: %lx\n", (ulong) block->next_changed); in fail_block()
4479 F_B_PRT("block->prev_changed: %lx\n", (ulong) block->prev_changed); in fail_block()
4480 F_B_PRT("block->hash_link: %lx\n", (ulong) block->hash_link); in fail_block()
4481 F_B_PRT("block->status: %u\n", block->status); in fail_block()
4482 F_B_PRT("block->length: %u\n", block->length); in fail_block()
4483 F_B_PRT("block->offset: %u\n", block->offset); in fail_block()
4484 F_B_PRT("block->requests: %u\n", block->requests); in fail_block()
4485 F_B_PRT("block->temperature: %u\n", block->temperature); in fail_block()
4493 F_B_PRT("hlink->block: %lx\n", (ulong) hlink->block); in fail_hlink()
4507 BLOCK_LINK *block= keycache->block_root + idx; in cache_empty() local
4508 if (block->status || block->requests || block->hash_link) in cache_empty()
4511 fail_block(block); in cache_empty()
4518 if (hash_link->requests || hash_link->block) in cache_empty()