/********************************************************************//**
Low-level function which reads a page asynchronously from a file to the
buffer buf_pool if it is not already there, in which case does nothing.
Sets the io_fix flag and sets an exclusive lock on the buffer frame. The
flag is cleared and the x-lock released by an i/o-handler thread.
@return 1 if a read request was queued, 0 if the page already resided
in buf_pool, or if the page is in the doublewrite buffer blocks in
which case it is never read into the pool, or if the tablespace does
not exist or is being dropped
@return 1 if read request is issued. 0 if it is not */
static
ulint
buf_read_page_low(
/*==============*/
    ulint*    err,    /*!< out: DB_SUCCESS or DB_TABLESPACE_DELETED if we are
            trying to read from a non-existent tablespace, or a
            tablespace which is just now being dropped */
    ibool    sync,    /*!< in: TRUE if synchronous aio is desired */
    ulint    mode,    /*!< in: BUF_READ_IBUF_PAGES_ONLY, ...,
            ORed to OS_AIO_SIMULATED_WAKE_LATER (see below
            at read-ahead functions) */
    ulint    space,    /*!< in: space id */
    ulint    zip_size,/*!< in: compressed page size, or 0 */
    ibool    unzip,    /*!< in: TRUE=request uncompressed page */
    ib_int64_t tablespace_version, /*!< in: if the space memory object has
            this timestamp different from what we are giving here,
            treat the tablespace as dropped; this is a timestamp we
            use to stop dangling page reads from a tablespace
            which we have DISCARDed + IMPORTed back */
    ulint    offset)    /*!< in: page number */
{
    buf_page_t*    bpage;
    ulint        wake_later;

    *err = DB_SUCCESS;

    wake_later = mode & OS_AIO_SIMULATED_WAKE_LATER;
    mode = mode & ~OS_AIO_SIMULATED_WAKE_LATER;

    if (trx_doublewrite && space == TRX_SYS_SPACE
        && (   (offset >= trx_doublewrite->block1
            && offset < trx_doublewrite->block1
            + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE)
           || (offset >= trx_doublewrite->block2
               && offset < trx_doublewrite->block2
               + TRX_SYS_DOUBLEWRITE_BLOCK_SIZE))) {
        ut_print_timestamp(stderr);
        fprintf(stderr,
            "  InnoDB: Warning: trying to read"
            " doublewrite buffer page %lu\n",
            (ulong) offset);

        );
    }

    if (ibuf_bitmap_page(zip_size, offset)
        || trx_sys_hdr_page(space, offset)) {

        /* Trx sys header is so low in the latching order that we play
        safe and do not leave the i/o-completion to an asynchronous
        i/o-thread. Ibuf bitmap pages must always be read with
        syncronous i/o, to make sure they do not get involved in
        thread deadlocks. */

        sync = TRUE;
    }

    /* The following call will also check if the tablespace does not exist
    or is being dropped; if we succeed in initing the page in the buffer
    pool for read, then DISCARD cannot proceed until the read has
    completed */
    bpage = buf_page_init_for_read(err, mode, space, zip_size, unzip,tablespace_version, offset);
    if (bpage == NULL) {

        );
    }

    ut_ad(buf_page_in_file(bpage));

    if (sync) {
        thd_wait_begin(NULL, THD_WAIT_DISKIO);
    }

    if (zip_size) {
        *err = fil_io(OS_FILE_READ | wake_later,
                  sync, space, zip_size, offset, , zip_size,
                  bpage->zip.data, bpage);
    } else {
        ut_a(buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE);
        //从硬盘中取数据 详见*err = fil_io(OS_FILE_READ | wake_later,
                  sync, space, , offset, , UNIV_PAGE_SIZE,
                  ((buf_block_t*) bpage)->frame, bpage);
    }

    if (sync) {
        thd_wait_end(NULL);
    }

    if (*err == DB_TABLESPACE_DELETED) {
        buf_read_page_handle_error(bpage);
        );
    }

    ut_a(*err == DB_SUCCESS);

    if (sync) {
        /* The i/o is already completed when we arrive from
        fil_read */
        if (!buf_page_io_complete(bpage)) {
            );
        }
    }

    );
}

函数buf_read_page_low的更多相关文章

  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. HTML弹出窗口

    1.最简单的 <script type="text/javascript"> <!-- window.open("http://cn.bing.com& ...

  2. C++对MS SQL Server的操作

    今天因为在做一份C++的期末作业,突然想用C++来链接数据库,实现数据的重复利用,所以就作死去百度搜了一下. 更巧的事情是,一搜居然还有很多搜索结果,然后就照着做了. 做的过程很艰辛,就不一一诉说了, ...

  3. dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表

    今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...

  4. Codeforces Round #352 (Div. 2) D. Robin Hood

    题目链接: http://codeforces.com/contest/672/problem/D 题意: 给你一个数组,每次操作,最大数减一,最小数加一,如果最大数减一之后比最小数加一之后要小,则取 ...

  5. MyEclipse 安装JRebel进行热部署

    安装环境 版本:myeclipse2015stable2 说明:下面是我已经安装了界面 安装过程 进入市场 出现下面提示,不用管它,点Continue 用关键词搜索 配置 进入JRebel配置中心,配 ...

  6. ts 使用Visual Studio2012和TFS网站管理源代码

        所需工具 Visual Studio 2012 http://tfs.visualstudio.com/ 微软网站 微软账号  hotmail 或live都行 达到目的 适合于个人项目,多用户 ...

  7. C# memcache

    概述 memcache是一套开放源的分布式高速缓存系统.由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作.memcache主要把数据对象缓存到内存中, ...

  8. 剑指offer--面试题13

    题目:以O(1)的时间复杂度删除单链表中的某个节点 自己所写代码如下: //以O(1)时间删除链表节点 //要求:单向链表,头指针,待删节点指针 //链表节点 struct ListNode { in ...

  9. [转载]C#如何在webBrowser1控件通过TagName,Name查找元素(没有ID时)遍历窗体元素

    //防止页面多次刷新页面执行 ) { string GetUserName = System.Configuration.ConfigurationSettings.AppSettings[" ...

  10. trie树--详解

    文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作.关键词:trie trie树 数据结 ...