GPDB中AOCO列存页的checksum
为了保证数据的正确性,AOCO列存页采用CRC32即循环冗余校验算法来进行校验。首先看下页结构。
页类型有四种:AOSmallContentHeader、AOLargeContentHeader、AONonBulkDenseContentHeader和AOBulkDenseContentHeader。页头的大小都是8个字节。除了这些内容外,页头其实还有firstRowNum和checksum,但这两个成员在计算时归到了数据那部分。
下面我们以SmallContentHeader为例来讲解下checksum。
页头部分结构如上图所示。Checksum部分大小为8字节,分为2部分:block checksum与header checksum。首先计算block checksum,其实就是数据部分的checksum:firstRowNum与value部分的crc值;然后再计算header checksum:AoHeader_RegularSize与block checksum部分的crc值。这样通过两个checksum来分别保证页头和数据部分的正确性。
我们看下计算流程:计算时先计算block checksum,存储位置位于第1个crc的位置,计算内容从firstRowNum开始的所有数据。接着计算header checksum,存储位置位于第2个crc位置,计算内容从页头开始一直到第一个crc的结尾。
AppendOnlyStorageFormat_AddBlockHeaderChecksums函数计算checksum:
再看下,什么时候进行校验:
也就是当从磁盘上加载上来列内容后,会立即通过函数
AppendOnlyStorageFormat_VerifyHeaderChecksum
进行页头的checksum校验,然后读取块内容时调用函数
AppendOnlyStorageFormat_VerifyBlockChecksum
进行block checksum校验。