/**********************************************************************//**
Tries to extend a data file so that it would accommodate the number of pages
given. The tablespace must be cached in the memory cache. If the space is big
enough already, does nothing.
@return    TRUE if success */
UNIV_INTERN
ibool
fil_extend_space_to_desired_size(
/*=============================*/
    ulint*    actual_size,    /*!< out: size of the space after extension;
                if we ran out of disk space this may be lower
                than the desired size */
    ulint    space_id,    /*!< in: space id */
    ulint    size_after_extend)/*!< in: desired size in pages after the
                extension; if the current space size is bigger
                than this already, the function does nothing */
{
    fil_node_t*    node;
    fil_space_t*    space;
    byte*        buf2;
    byte*        buf;
    ulint        buf_size;
    ulint        start_page_no;
    ulint        file_start_page_no;
    ulint        offset_high;
    ulint        offset_low;
    ulint        page_size;
    ibool        success        = TRUE;

    fil_mutex_enter_and_prepare_for_io(space_id);

    space = fil_space_get_by_id(space_id);
    ut_a(space);

    if (space->size >= size_after_extend) {
        /* Space already big enough */

        *actual_size = space->size;

        mutex_exit(&fil_system->mutex);

        return(TRUE);
    }

    page_size = dict_table_flags_to_zip_size(space->flags);
    if (!page_size) {
        page_size = UNIV_PAGE_SIZE;
    }

    node = UT_LIST_GET_LAST(space->chain);

    fil_node_prepare_for_io(node, fil_system, space);

    start_page_no = space->size;
    file_start_page_no = space->size - node->size;

    /* Extend at most 64 pages at a time */
    buf_size = ut_min(, size_after_extend - start_page_no) * page_size;
    buf2 = mem_alloc(buf_size + page_size);
    buf = ut_align(buf2, page_size);

    memset(buf, , buf_size);

    while (start_page_no < size_after_extend) {
        ulint    n_pages = ut_min(buf_size / page_size,
                     size_after_extend - start_page_no);

        offset_high = (start_page_no - file_start_page_no)
            / ( * (( * ) / page_size));
        offset_low  = ((start_page_no - file_start_page_no)
                   % ( * (( * ) / page_size)))
            * page_size;
#ifdef UNIV_HOTBACKUP
        success = os_file_write(node->name, node->handle, buf,
                    offset_low, offset_high,
                    page_size * n_pages);
#else
        success = os_aio(OS_FILE_WRITE, OS_AIO_SYNC,
                 node->name, node->handle, buf,
                 offset_low, offset_high,
                 page_size * n_pages,
                 NULL, NULL);
#endif
        if (success) {
            node->size += n_pages;
            space->size += n_pages;

            os_has_said_disk_full = FALSE;
        } else {
            /* Let us measure the size of the file to determine
            how much we were able to extend it */

            n_pages = ((ulint)
                   (os_file_get_size_as_iblonglong(
                       node->handle)
                    / page_size)) - node->size;

            node->size += n_pages;
            space->size += n_pages;

            break;
        }

        start_page_no += n_pages;
    }

    mem_free(buf2);

    fil_node_complete_io(node, fil_system, OS_FILE_WRITE);

    *actual_size = space->size;

#ifndef UNIV_HOTBACKUP
    ) {
        ulint pages_per_mb = ( * ) / page_size;

        /* Keep the last data file size info up to date, rounded to
        full megabytes */

        srv_data_file_sizes[srv_n_data_files - ]
            = (node->size / pages_per_mb) * pages_per_mb;
    }
#endif /* !UNIV_HOTBACKUP */

    /*
    printf("Extended %s to %lu, actual size %lu pages\n", space->name,
    size_after_extend, *actual_size); */
    mutex_exit(&fil_system->mutex);

    fil_flush(space_id);

    return(success);
}

函数fil_extend_space_to_desired_size的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

随机推荐

  1. 设计模式Builder(建造者)模式

    1.出现原因 在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法 ...

  2. android 开启或者隐藏软键盘

    一. 隐藏软键盘方法一(注:此方法本人使用时发现isActivie()失效,建议还是用其他方法..): InputMethodManager imm = (InputMethodManager)get ...

  3. Flv 视频格式(转)

    最近要用到flv,整理了一些flv格式的资料,供参考. flv文件主要由两部分组成:header和body. 1.header header部分记录了flv的类型.版本等信息,是flv的开头,一般都差 ...

  4. SpringJUnit4加载类目录下(src)和WEF-INF目录下的配置文件二--获取注入的bean的二种方式

    前言: spring容器以xml的形式注入bean,然后可以在类中获取,获取的形式主要有二种:第一种最简单--采用@Resource 或@Autowired关键字在加载spring文件时将bean注入 ...

  5. vim分屏快捷键使用/增大/减小字体使用

    问题描述: vim分屏快捷键使用 问题解决:         (1)vim 分屏快捷键           (2)vim高度改变          (3)vim中增加和减少字体大小  使用快捷键Ctr ...

  6. C#根据日期DateTime和持续时间int找到日期

    protected DateTime GetFinish(DateTime start, int duration) { return start.AddDays(duration); } prote ...

  7. [设计模式] 4 原型模式 prototype

    设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  8. POJ 1691 Painting A Board(DFS)

    链接 题意 : 看了好长时间终于看懂题目了,将一个大矩形划分成若干小矩形,告诉你每个小矩形的左上角那个点和右下角那个点的坐标,告诉你这个小矩形要涂的颜色,每个颜色对应一个刷子,问你最少要使用几次刷子. ...

  9. hdu 4701 Game 博弈论

    思路: ▶ 设 win(i,x,y) 表示当前可以买的物品是 i,先手有 x 元,后 手有 y 元时,先手是否必胜 ▶ win(i,x,y) ⇐⇒∃j((j > i)∧(x ≥ si−sj)∧¬ ...

  10. Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)

    [版权所有: whoistester.com & jmeter.cf] 上一节课,我们创建了一个测试场景,并进行了少量vuser的负载测试. 有时候我们执行了测试,但是发现并不是所有事务都执行 ...