Skip to content

Commit

Permalink
add crc checksum to disk buffer page oceanbase#356 (oceanbase#357)
Browse files Browse the repository at this point in the history
  • Loading branch information
Wenbin1002 authored Mar 26, 2024
1 parent e2165ae commit ab25a46
Show file tree
Hide file tree
Showing 6 changed files with 303 additions and 13 deletions.
282 changes: 282 additions & 0 deletions deps/common/math/crc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */

//
// Created by Wenbin on 2024/3/25.
//

#pragma once

unsigned int crc_table[] = {0x00000000,
0x77073096,
0xEE0E612C,
0x990951BA,
0x076DC419,
0x706AF48F,
0xE963A535,
0x9E6495A3,
0x0EDB8832,
0x79DCB8A4,
0xE0D5E91E,
0x97D2D988,
0x09B64C2B,
0x7EB17CBD,
0xE7B82D07,
0x90BF1D91,
0x1DB71064,
0x6AB020F2,
0xF3B97148,
0x84BE41DE,
0x1ADAD47D,
0x6DDDE4EB,
0xF4D4B551,
0x83D385C7,
0x136C9856,
0x646BA8C0,
0xFD62F97A,
0x8A65C9EC,
0x14015C4F,
0x63066CD9,
0xFA0F3D63,
0x8D080DF5,
0x3B6E20C8,
0x4C69105E,
0xD56041E4,
0xA2677172,
0x3C03E4D1,
0x4B04D447,
0xD20D85FD,
0xA50AB56B,
0x35B5A8FA,
0x42B2986C,
0xDBBBC9D6,
0xACBCF940,
0x32D86CE3,
0x45DF5C75,
0xDCD60DCF,
0xABD13D59,
0x26D930AC,
0x51DE003A,
0xC8D75180,
0xBFD06116,
0x21B4F4B5,
0x56B3C423,
0xCFBA9599,
0xB8BDA50F,
0x2802B89E,
0x5F058808,
0xC60CD9B2,
0xB10BE924,
0x2F6F7C87,
0x58684C11,
0xC1611DAB,
0xB6662D3D,
0x76DC4190,
0x01DB7106,
0x98D220BC,
0xEFD5102A,
0x71B18589,
0x06B6B51F,
0x9FBFE4A5,
0xE8B8D433,
0x7807C9A2,
0x0F00F934,
0x9609A88E,
0xE10E9818,
0x7F6A0DBB,
0x086D3D2D,
0x91646C97,
0xE6635C01,
0x6B6B51F4,
0x1C6C6162,
0x856530D8,
0xF262004E,
0x6C0695ED,
0x1B01A57B,
0x8208F4C1,
0xF50FC457,
0x65B0D9C6,
0x12B7E950,
0x8BBEB8EA,
0xFCB9887C,
0x62DD1DDF,
0x15DA2D49,
0x8CD37CF3,
0xFBD44C65,
0x4DB26158,
0x3AB551CE,
0xA3BC0074,
0xD4BB30E2,
0x4ADFA541,
0x3DD895D7,
0xA4D1C46D,
0xD3D6F4FB,
0x4369E96A,
0x346ED9FC,
0xAD678846,
0xDA60B8D0,
0x44042D73,
0x33031DE5,
0xAA0A4C5F,
0xDD0D7CC9,
0x5005713C,
0x270241AA,
0xBE0B1010,
0xC90C2086,
0x5768B525,
0x206F85B3,
0xB966D409,
0xCE61E49F,
0x5EDEF90E,
0x29D9C998,
0xB0D09822,
0xC7D7A8B4,
0x59B33D17,
0x2EB40D81,
0xB7BD5C3B,
0xC0BA6CAD,
0xEDB88320,
0x9ABFB3B6,
0x03B6E20C,
0x74B1D29A,
0xEAD54739,
0x9DD277AF,
0x04DB2615,
0x73DC1683,
0xE3630B12,
0x94643B84,
0x0D6D6A3E,
0x7A6A5AA8,
0xE40ECF0B,
0x9309FF9D,
0x0A00AE27,
0x7D079EB1,
0xF00F9344,
0x8708A3D2,
0x1E01F268,
0x6906C2FE,
0xF762575D,
0x806567CB,
0x196C3671,
0x6E6B06E7,
0xFED41B76,
0x89D32BE0,
0x10DA7A5A,
0x67DD4ACC,
0xF9B9DF6F,
0x8EBEEFF9,
0x17B7BE43,
0x60B08ED5,
0xD6D6A3E8,
0xA1D1937E,
0x38D8C2C4,
0x4FDFF252,
0xD1BB67F1,
0xA6BC5767,
0x3FB506DD,
0x48B2364B,
0xD80D2BDA,
0xAF0A1B4C,
0x36034AF6,
0x41047A60,
0xDF60EFC3,
0xA867DF55,
0x316E8EEF,
0x4669BE79,
0xCB61B38C,
0xBC66831A,
0x256FD2A0,
0x5268E236,
0xCC0C7795,
0xBB0B4703,
0x220216B9,
0x5505262F,
0xC5BA3BBE,
0xB2BD0B28,
0x2BB45A92,
0x5CB36A04,
0xC2D7FFA7,
0xB5D0CF31,
0x2CD99E8B,
0x5BDEAE1D,
0x9B64C2B0,
0xEC63F226,
0x756AA39C,
0x026D930A,
0x9C0906A9,
0xEB0E363F,
0x72076785,
0x05005713,
0x95BF4A82,
0xE2B87A14,
0x7BB12BAE,
0x0CB61B38,
0x92D28E9B,
0xE5D5BE0D,
0x7CDCEFB7,
0x0BDBDF21,
0x86D3D2D4,
0xF1D4E242,
0x68DDB3F8,
0x1FDA836E,
0x81BE16CD,
0xF6B9265B,
0x6FB077E1,
0x18B74777,
0x88085AE6,
0xFF0F6A70,
0x66063BCA,
0x11010B5C,
0x8F659EFF,
0xF862AE69,
0x616BFFD3,
0x166CCF45,
0xA00AE278,
0xD70DD2EE,
0x4E048354,
0x3903B3C2,
0xA7672661,
0xD06016F7,
0x4969474D,
0x3E6E77DB,
0xAED16A4A,
0xD9D65ADC,
0x40DF0B66,
0x37D83BF0,
0xA9BCAE53,
0xDEBB9EC5,
0x47B2CF7F,
0x30B5FFE9,
0xBDBDF21C,
0xCABAC28A,
0x53B39330,
0x24B4A3A6,
0xBAD03605,
0xCDD70693,
0x54DE5729,
0x23D967BF,
0xB3667A2E,
0xC4614AB8,
0x5D681B02,
0x2A6F2B94,
0xB40BBE37,
0xC30C8EA1,
0x5A05DF1B,
0x2D02EF8D};

/// 计算buffer的crc校验码
unsigned int crc32(const char *buffer, unsigned int size)
{
unsigned int crc = 0xffffffff;
for (unsigned int i = 0; i < size; i++) {
crc = crc_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);
}
return crc;
}
3 changes: 3 additions & 0 deletions src/observer/common/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,6 @@ using SlotNum = int32_t;

/// LSN for log sequence number
using LSN = int32_t;

/// page的CRC校验和
using CheckSum = unsigned int;
1 change: 0 additions & 1 deletion src/observer/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ See the Mulan PSL v2 for more details. */
* Author: Longda Feng
*/


#include <iostream>
#include <netinet/in.h>
#include <unistd.h>
Expand Down
3 changes: 3 additions & 0 deletions src/observer/storage/buffer/disk_buffer_pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ See the Mulan PSL v2 for more details. */
#include "common/io/io.h"
#include "common/lang/mutex.h"
#include "common/log/log.h"
#include "common/math/crc.h"
#include "storage/buffer/disk_buffer_pool.h"

using namespace common;
Expand Down Expand Up @@ -488,6 +489,7 @@ RC DiskBufferPool::flush_page_internal(Frame &frame)
// The better way is use mmap the block into memory,
// so it is easier to flush data to file.

frame.set_check_sum(crc32(frame.page().data, BP_PAGE_DATA_SIZE));
Page &page = frame.page();
int64_t offset = ((int64_t)page.page_num) * sizeof(Page);
if (lseek(file_desc_, offset, SEEK_SET) == offset - 1) {
Expand Down Expand Up @@ -600,6 +602,7 @@ RC DiskBufferPool::load_page(PageNum page_num, Frame *frame)
}

int DiskBufferPool::file_desc() const { return file_desc_; }

////////////////////////////////////////////////////////////////////////////////
BufferPoolManager::BufferPoolManager(int memory_size /* = 0 */)
{
Expand Down
18 changes: 10 additions & 8 deletions src/observer/storage/buffer/frame.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,16 @@ class Frame

void clear_page() { memset(&page_, 0, sizeof(page_)); }

int file_desc() const { return file_desc_; }
void set_file_desc(int fd) { file_desc_ = fd; }
Page &page() { return page_; }
PageNum page_num() const { return page_.page_num; }
void set_page_num(PageNum page_num) { page_.page_num = page_num; }
FrameId frame_id() const { return FrameId(file_desc_, page_.page_num); }
LSN lsn() const { return page_.lsn; }
void set_lsn(LSN lsn) { page_.lsn = lsn; }
int file_desc() const { return file_desc_; }
void set_file_desc(int fd) { file_desc_ = fd; }
Page &page() { return page_; }
PageNum page_num() const { return page_.page_num; }
void set_page_num(PageNum page_num) { page_.page_num = page_num; }
FrameId frame_id() const { return FrameId(file_desc_, page_.page_num); }
LSN lsn() const { return page_.lsn; }
void set_lsn(LSN lsn) { page_.lsn = lsn; }
CheckSum check_sum() const { return page_.check_sum; }
void set_check_sum(CheckSum check_sum) { page_.check_sum = check_sum; }

/// 刷新访问时间 TODO touch is better?
void access();
Expand Down
9 changes: 5 additions & 4 deletions src/observer/storage/buffer/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,16 @@ static constexpr int BP_INVALID_PAGE_NUM = -1;
static constexpr PageNum BP_HEADER_PAGE = 0;

static constexpr const int BP_PAGE_SIZE = (1 << 13);
static constexpr const int BP_PAGE_DATA_SIZE = (BP_PAGE_SIZE - sizeof(PageNum) - sizeof(LSN));
static constexpr const int BP_PAGE_DATA_SIZE = (BP_PAGE_SIZE - sizeof(PageNum) - sizeof(LSN) - sizeof(CheckSum));

/**
* @brief 表示一个页面,可能放在内存或磁盘上
* @ingroup BufferPool
*/
struct Page
{
PageNum page_num;
LSN lsn;
char data[BP_PAGE_DATA_SIZE];
PageNum page_num;
LSN lsn;
CheckSum check_sum;
char data[BP_PAGE_DATA_SIZE];
};

0 comments on commit ab25a46

Please sign in to comment.