Commit a560f0fa authored by unknown's avatar unknown
Browse files

Many files:

  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup


innobase/buf/buf0buf.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/buf/buf0lru.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/include/buf0lru.h:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/include/db0err.h:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/include/row0sel.h:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/include/ut0mem.h:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/mem/mem0pool.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/row/row0mysql.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/row/row0sel.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/srv/srv0start.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
innobase/ut/ut0mem.c:
  Fix bug #6817 and bug #6827 : do not crash the server if the buffer pool becomes filled by the locks of ONE huge transaction, return error 1206 instead; do not crash the server, but return error if we cannot allocate memory for the buffer pool at a mysqld startup
parent bf39ae6a
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -547,8 +547,9 @@ buf_pool_init(
		}
		/*----------------------------------------*/
	} else {
		buf_pool->frame_mem = ut_malloc(
					UNIV_PAGE_SIZE * (n_frames + 1));
		buf_pool->frame_mem = ut_malloc_low(
					UNIV_PAGE_SIZE * (n_frames + 1),
					TRUE, FALSE);
	}

	if (buf_pool->frame_mem == NULL) {
+37 −4
Original line number Diff line number Diff line
@@ -42,6 +42,10 @@ initial segment in buf_LRU_get_recent_limit */

#define BUF_LRU_INITIAL_RATIO	8

/* If we switch on the InnoDB monitor because there are too few available
frames in the buffer pool, we set this to TRUE */
ibool	buf_lru_switched_on_innodb_mon	= FALSE;

/**********************************************************************
Takes a block out of the LRU list and page hash table and sets the block
state to BUF_BLOCK_REMOVE_HASH. */
@@ -287,6 +291,32 @@ buf_LRU_try_free_flushed_blocks(void)
	mutex_exit(&(buf_pool->mutex));
}	

/**********************************************************************
Returns TRUE if less than 15 % of the buffer pool is available. This can be
used in heuristics to prevent huge transactions eating up the whole buffer
pool for their locks. */

ibool
buf_LRU_buf_pool_running_out(void)
/*==============================*/
				/* out: TRUE if less than 15 % of buffer pool
				left */
{
	ibool	ret	= FALSE;

	mutex_enter(&(buf_pool->mutex));

	if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 7) {
		
		ret = TRUE;
	}

	mutex_exit(&(buf_pool->mutex));

	return(ret);
}

/**********************************************************************
Returns a free block from buf_pool. The block is taken off the free list.
If it is empty, blocks are moved from the end of the LRU list to the free
@@ -325,7 +355,8 @@ buf_LRU_get_free_block(void)
	   
	} else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 5) {
		if (!srv_print_innodb_monitor) {

		if (!buf_lru_switched_on_innodb_mon) {

	   		/* Over 80 % of the buffer pool is occupied by lock
			heaps or the adaptive hash index. This may be a memory
@@ -342,16 +373,18 @@ buf_LRU_get_free_block(void)
"InnoDB: lock heap and hash index sizes.\n",
			(ulong) (buf_pool->curr_size / (1024 * 1024 / UNIV_PAGE_SIZE)));

			buf_lru_switched_on_innodb_mon = TRUE;
			srv_print_innodb_monitor = TRUE;
			os_event_set(srv_lock_timeout_thread_event);
		}
	} else if (!recv_recovery_on && UT_LIST_GET_LEN(buf_pool->free)
	   + UT_LIST_GET_LEN(buf_pool->LRU) < buf_pool->max_size / 4) {
	} else if (buf_lru_switched_on_innodb_mon) {

		/* Switch off the InnoDB Monitor; this is a simple way
		to stop the monitor if the situation becomes less urgent,
		but may also surprise users! */
		but may also surprise users if the user also switched on the
		monitor! */

		buf_lru_switched_on_innodb_mon = FALSE;
		srv_print_innodb_monitor = FALSE;
	}
	
+10 −0
Original line number Diff line number Diff line
@@ -25,6 +25,16 @@ wasted. */
void
buf_LRU_try_free_flushed_blocks(void);
/*==================================*/
/**********************************************************************
Returns TRUE if less than 15 % of the buffer pool is available. This can be
used in heuristics to prevent huge transactions eating up the whole buffer
pool for their locks. */

ibool
buf_LRU_buf_pool_running_out(void);
/*==============================*/
				/* out: TRUE if less than 15 % of buffer pool
				left */

/*#######################################################################
These are low-level functions
+5 −1
Original line number Diff line number Diff line
@@ -53,6 +53,10 @@ Created 5/24/1996 Heikki Tuuri
					name already exists */
#define DB_TABLESPACE_DELETED	44	/* tablespace does not exist or is
					being dropped right now */
#define	DB_LOCK_TABLE_FULL	45	/* lock structs have exhausted the
					buffer pool (for big transactions,
					InnoDB stores the lock structs in the
					buffer pool) */

/* The following are partial failure codes */
#define DB_FAIL 		1000
+1 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ row_search_for_mysql(
					/* out: DB_SUCCESS,
					DB_RECORD_NOT_FOUND, 
					DB_END_OF_INDEX, DB_DEADLOCK,
					DB_LOCK_TABLE_FULL,
					or DB_TOO_BIG_RECORD */
	byte*		buf,		/* in/out: buffer for the fetched
					row in the MySQL format */
Loading