innodb 存储引擎,创建一个表

本文分析创建一个段。待叙,主要说明是如何创建一文件,并在文件中分配一个索引。

 

上面是创建一个表的调用图。创建文件和创建一个btr

 

/**********************************************************************//**
Allocates a new file segment inode.
@return    segment inode, or NULL if not enough space */
static
fseg_inode_t*
fsp_alloc_seg_inode(
/*================*/
    fsp_header_t*    space_header,    /*!< in: space header */
    mtr_t*        mtr)        /*!< in/out: mini-transaction */
{
    ulint        page_no;
    buf_block_t*    block;
    page_t*        page;
    fseg_inode_t*    inode;
    ibool        success;
    ulint        zip_size;
    ulint        n;

    ut_ad(page_offset(space_header) == FSP_HEADER_OFFSET);

    if (flst_get_len(space_header + FSP_SEG_INODES_FREE, mtr) == 0) {
        /* Allocate a new segment inode page */

        success = fsp_alloc_seg_inode_page(space_header, mtr);

        if (!success) {

            return(NULL);
        }
    }

    page_no = flst_get_first(space_header + FSP_SEG_INODES_FREE, mtr).page;

    zip_size = fsp_flags_get_zip_size(
        mach_read_from_4(FSP_SPACE_FLAGS + space_header));
    block = buf_page_get(page_get_space_id(page_align(space_header)),
                 zip_size, page_no, RW_X_LATCH, mtr);
    buf_block_dbg_add_level(block, SYNC_FSP_PAGE);

    page = buf_block_get_frame(block);

    n = fsp_seg_inode_page_find_free(page, 0, zip_size, mtr);

    ut_a(n != ULINT_UNDEFINED);

    inode = fsp_seg_inode_page_get_nth_inode(page, n, zip_size, mtr);

    if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(page, n + 1,
                                zip_size, mtr)) {
        /* There are no other unused headers left on the page: move it
        to another list */

        flst_remove(space_header + FSP_SEG_INODES_FREE,
                page + FSEG_INODE_PAGE_NODE, mtr);

        flst_add_last(space_header + FSP_SEG_INODES_FULL,
                  page + FSEG_INODE_PAGE_NODE, mtr);
    }

    ut_ad(!mach_read_from_8(inode + FSEG_ID)
          || mach_read_from_4(inode + FSEG_MAGIC_N) == FSEG_MAGIC_N_VALUE);
    return(inode);
}

 

 

posted on 2019-01-12 00:45  kisstherain8231  阅读(1034)  评论(0编辑  收藏  举报