new

innobase_start_or_create_for_mysql

/**
*详见

*buf_pool初始化
*srv_buf_pool_size 缓冲池大小
*srv_buf_pool_instantces 缓冲池实例
*/
err = buf_pool_init(srv_buf_pool_size, srv_buf_pool_instances);

/**
*open打开数据文件
*srv_parse_data_file_paths_and_sizes读取my.cn配置文件
*sum_of_new_sizes为要
innodb_data_file_path=ibdata1:10G;ibdata2:10G:autoextend文件大小的总和
*
*/
    err = open_or_create_data_files(&create_new_db,&min_flushed_lsn, &max_flushed_lsn,&sum_of_new_sizes);
     *create_new_db = TRUE;
*sum_of_new_sizes = *sum_of_new_sizes+ srv_data_file_sizes[i];
fil_space_create(name, 0, 0, FIL_TABLESPACE);
fil_node_create(name, srv_data_file_sizes[i], 0,srv_data_file_is_raw_partition[i] != 0);
    fsp_header_init(0, sum_of_new_sizes, &mtr);
      fsp_init_file_page(block, mtr); //初始化block以及header一些属性
  /**
  *初始化header属性
  *header + FSP_SPACE_ID, space
  *header + FSP_NOT_USED, 0
  *header + FSP_SIZE, size //sum_of_new_size大小
  *header + FSP_FREE_LIMIT, 0
  *header + FSP_FRAG_N_USED, 0
  *header + FSP_SEG_ID, 1
  *以及初始化FSP_FREE,FSP_FREE_FRAG,FSP_FULL_FRAG,FSP_SEG_INODES_FULL,FSP_SEG_INODES_FREE
  */

  /**
*详见
  *space不为空
  *srv_auto_extend_last_data_file不为空,此变量由my.cn配置,详见函数srv_parse_data_file_paths_and_sizes
  *当前space最大可容纳的page数 < 当前space已经分配初始化的page数,包括空闲的和已经使用的 + 256时
  *
  *进行扩容,增加8M,共512个16K的page
  */
  fsp_fill_free_list(FALSE, space, header, mtr);//
btr_create call:fseg_create(space,
0, PAGE_HEADER + PAGE_BTR_SEG_TOP, mtr); params: ulint space ulint page ulint byte_offset mtr_t* mtr call: fseg_create_general(space, page, byte_offset, FALSE, mtr) A) space_header = fsp_get_space_header(space, zip_size, mtr); A1) block = buf_page_get(id, zip_size, 0, RW_X_LATCH, mtr); //在free_list或者unzip lru或者lru中找一个空闲块 B) inode = fsp_alloc_seg_inode(space_header, mtr);

 

你可能感兴趣的:(new)