/**********************************************************************//**
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. JAVASCRIPT、ANDROID、C#分别实现普通日期转换多少小时前、多少分钟前、多少秒

    貌似最近很流行这个,就写了个js函数实现之 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ...

  2. 【转】android 选取图片

    转自:http://www.cnblogs.com/top5/archive/2012/03/06/2381986.html 这几天 在学习并开发android系统的图片浏览 音频 视频 的浏览 由于 ...

  3. android中实现Parcelable序列化步骤

    import java.io.Serializable; import java.text.DecimalFormat; import android.os.Parcel; import androi ...

  4. CSS:在input、pre中左边加上一个图标(一行和多行)

    前言 接触过EasyUI的朋友都知道其警告框就是左边有个三角警告图标,此文所做的效果正是这样.此外,还将示例多行的做法. 一.在input左边加上一个图标(一行) 注:left center定义了图标 ...

  5. 集合上的动态规划---最优配对问题(推荐:*****) // uva 10911

    /* 提醒推荐:五星 刘汝佳<算法竞赛入门经典>,集合上的动态规划---最优配对问题 题意:空间里有n个点P0,P1,...,Pn-1,你的任务是把它们配成n/2对(n是偶数),使得每个点 ...

  6. jsp java 数据库 乱码总结

    Java中文问题的由来: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因主要有两方面,Java和JSP文件本身编译时产 ...

  7. winform 开发之Control.InvokeRequired

    Control.InvokeRequired 获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中. InvokeRequir ...

  8. **tomcat简介之web.xml详解

    一.Tomcat背景 自从JSP发布之后,推出了各式各样的JSP引擎.Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JS ...

  9. DIV+CSS列表式布局(同意图片的应用)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. cojs 奈特 题解报告

    才知道knight念奈特,而不念科耐特 这个题显然是一个数据结构题目,我搬运的CF上的题 CF的题解好长超长哒,而且可以在线,但是并不能看懂 于是自己想了一个一种做法A掉了,唯一的缺陷就是做法有些繁琐 ...