<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 背景 TokuDB在啟動的時候,會對datadir目錄下的文件(和文件夾)進行遍歷,根據規則找到所有的redo log文件,然后進行recover操作。 redo文件的命名規則是:log[index].toku[version],比如log000000000002.tokulog27。 ## 問題 這個bug說起來有點“謎之”,因為它還跟編譯器的版本有關。 如果使用gcc 4.8.2編譯出一個TokuDB(加-O3編譯參數),進行如下操作: ~~~ CREATE DATABASE log0002; ~~~ 然后重啟,整個TokuDB就可能凌亂了,出現如下crash信息: ~~~ storage/tokudb/ft-index/ft/logger/logfilemgr.cc:159 toku_logfilemgr_init: Assertion 'r==2' failed (errno=2) Backtrace: (Note: toku_do_assert=0x0xcd50d0) mysqld(_Z20toku_logfilemgr_initP15toku_logfilemgrPKcPm+0x26c)[0xc40cdc] mysqld(_Z30toku_logger_open_with_last_xidPKcP10tokuloggerm+0x51)[0xc10ba1] mysqld(_Z14tokuft_recover) ~~~ ## 原因 先來看下TokuDB判斷一個文件是否為redo log的代碼: ~~~ static bool is_a_logfile_any_version (const char *name, uint64_t *number_result, uint32_t *version_of_log) { bool rval = true; uint64_t result; int n; int r; uint32_t version; r = sscanf(name, "log%" SCNu64 ".tokulog%" SCNu32 "%n", &result, &version, &n); if (r!=2 || name[n]!='\0' || version <= TOKU_LOG_VERSION_1) { //Version 1 does NOT append 'version' to end of '.tokulog' version = TOKU_LOG_VERSION_1; r = sscanf(name, "log%" SCNu64 ".tokulog%n", &result, &n); if (r!=1 || name[n]!='\0') { rval = false; } } if (rval) { *number_result = result; *version_of_log = version; } return rval; } ~~~ 這段代碼的邏輯很簡單,調用sscanf函數獲取相關參數, 高能區域為: ~~~ r = sscanf(name, "log%" SCNu64 ".tokulog%" SCNu32 "%n", &result, &version, &n); ~~~ 如果name為log0002,調用完sscanf函數后,n和version的值是不確定的(因為函數內變量未被初始化),就可能導致函數?`is_a_logfile_any_version`?把log0002文件夾誤認為是一個redo log。 當`toku_logfilemgr_init`函數加載名稱“log0002”時做二次校驗,獲取version值失敗從而觸發assert。 ## 修復 大體思路是: 1. 由于redo log不可能是文件夾,所以增加只對文件進行判斷的邏輯,遇到文件夾直接跳過; 2. 對`is_a_logfile_any_version`函數內變量進行初始化。 阿里云RDS TokuDB最新版本已經修復此問題,使用TokuDB的用戶可以進行下小版本升級,以避免此問題影響業務。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看