/**********************************************************************//**
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. 设置NODE_ENV=production

    NodeJS - Express 4.0下设置环境变量NODE_ENV=production,并不是修改文件的配置信息,而是通过命令行来实现. 首先在命令行下进入项目的目录,然后先后执行如下命令: s ...

  2. hihocoder #1300 : 展胜地的鲤鱼旗 dp

    题目链接: http://hihocoder.com/problemset/problem/1300 题解: 先用栈预处理出每个‘)’匹配的‘(’的位子,放在pos数组中. dp[i]表示以i结尾的合 ...

  3. Wmware桥接网络虚拟机无法上网的问题

    之前装好的一个虚拟机,安装到本地的Wmware workstation的时候,发现无法上网. 虚拟机使用的是桥接模式:一开始怀疑IP被占用,修改后发现不起作用.    排查所有的网络配置,发现都没有问 ...

  4. 20160730noip模拟赛zld

    codeforces394E 如果没有在凸多边形内一点的限制,答案肯定是 如果不在凸多边形内,那么目标点肯定在凸多边形边上,我们枚举每条边,在每条边上求出距离平方和最小的点,在这些点中求出最小的 我们 ...

  5. dll 入口函数

    http://support.microsoft.com/kb/815065/zh-cn // SampleDLL.cpp // #include "stdafx.h" #defi ...

  6. hibernate 多对多

    HibernateHibernate多对多关联映射通常别拆分成两个多对一关联映射1. 下面的HostBean.UserBean.UserHostBean,UserHostBean是两个表之间的关联表, ...

  7. Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理

    项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...

  8. POJ 1663

    #include<iostream>//cheng da cai zi using namespace std; int main() { int time; cin>>tim ...

  9. DataRow.RowState 属性

    RowState 的值取决于两个因素:已对该行执行的操作的类型,以及是否已对 DataRow 调用了 AcceptChanges. private void DemonstrateRowState() ...

  10. Java中Integer的源码学习

      一.开始 public final class Integer extends Number implements Comparable<Integer> 1).由于类修饰符中有关键字 ...