起動プロセス(6) log_init関数

innobase_start_or_create_for_mysql関数の中で呼び出される。



log0log.cにて。ログバッファを初期化する。

742行目。最初にログのための制御構造体を初期化。log_tのサイズは732バイト。

log_sys = mem_alloc(sizeof(log_t));

757行目。innodb_log_buffer_sizeで指定したバイトサイズ+512バイトのメモリを割り当てて、buf_poolのときと同様にここでもアドレスを切り上げしている。切り上げに使用している単位は512。

buf = ut_malloc(LOG_BUFFER_SIZE + OS_FILE_LOG_BLOCK_SIZE);
log_sys->buf = ut_align(buf, OS_FILE_LOG_BLOCK_SIZE);

OS_FILE_LOG_BLOCK_SIZEのコメントを読むと以下のようになっている。

/* The next value should be smaller or equal to the smallest sector size used
on any disk. A log block is required to be a portion of disk which is written
so that if the start and the end of a block get written to disk, then the
whole block gets written. This should be true even in most cases of a crash:
if this fails for a log block, then it is equivalent to a media failure in the
log. */

#define OS_FILE_LOG_BLOCK_SIZE      512

sectorサイズについて触れている。これが関係しているらしい。

804行目。checkpoint_bufの割り当て。これもalignするので、必要量+αの割り当てを行っている。

log_sys->checkpoint_buf = ut_align(
            mem_alloc(2 * OS_FILE_LOG_BLOCK_SIZE),
                    OS_FILE_LOG_BLOCK_SIZE);