/********************************************************************//**
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. SQL Server2008附加数据库之后显示为只读

    SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...

  2. ios的UIImage的两种不同的图片加载方式 tom猫

    在ios的UI交互设计时,对图片的处理是难免的:不同的处理方式会对内存有不同的影响: ********************************************************* ...

  3. Start my cnBlogs

    Compared to CSDN blog, althought it's my first time to use CNBlog,i felt it makes me more comfortabl ...

  4. 一个完整openlayer的例子,包括marker,popup等

    整理转自:http://www.blogjava.net/siriusfx/archive/2007/11/26/163104.html openlayers提供了几十个示例,虽然每个示例都很简单,但 ...

  5. js遍历集合

    首先,描述一下问题.由于需要后台取出数据,遍历展示在table中,大体如下: 后台取出的是 Map<String , List<Object>>,下面是我写得比较朴素一点的写法 ...

  6. Uyuw's Concert POJ2451

    裸半平面交,以前没写过,先写一遍再说 我越来越不注意细节了,最后才发现空间稍微开小了(没有开那个零头,他又要多4条边,就WA了) const maxn=; eps=1e-7; type point=r ...

  7. mac mysql安装

    一.安装 1.下载软件包直接安装即可: http://rj.baidu.com/soft/detail/25675.html?ald 安装完成后root默认密码为空: 二.修改密码 直接修改密码会提示 ...

  8. Linux GPT分区

    parted /dev/sdb  //parted  sdb磁盘 mklabel gpt        //设置该磁盘分区为gpt   mkpart primary 0% 100%   //划分分区大 ...

  9. linux杀掉80端口线程命令

    80端口被其他程序占用, fuser -k -n tcp 80

  10. What is XMLHTTP? How to use security zones in Internet Explorer

    Types of Security Zones Internet Zone This zone contains Web sites that are not on your computer or ...