FastSort/src/sort/phase_1_write.cpp

96 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
Description: 第一阶段写入中间文件
Copyright : All right reserved by ICT
Author : Zhang Zhonghai
Date : 2026/06/02
*/
#include "phase_1_write.h"
#include <klib/kthread.h>
#include <spdlog/spdlog.h>
#include <zlib.h>
#include <algorithm>
#include <string>
#include "common_data.h"
#include "const_val.h"
#include "phase_1.h"
#include "phase_1_compress.h"
#include "phase_1_write.h"
#include "sort.h"
#include "util/profiling.h"
static void checkCompress(uint8_t *addr, uint64_t len) {
size_t curReadPos = 0;
int blockLen = 0;
int maxBlockLen = 0;
DataBuffer buf;
buf.AllocMem(SINGLE_BLOCK_SIZE);
while (curReadPos + BLOCK_HEADER_LENGTH <= len) { /* 确保能解析block长度 */
blockLen = unpackInt16(&addr[curReadPos + 16]) + 1;
if (blockLen > maxBlockLen) {
maxBlockLen = blockLen;
}
if (curReadPos + blockLen <= len) { /* 完整的block数据在buf里 */
size_t dlen = SINGLE_BLOCK_SIZE; // 65535
uint32_t crc = le_to_u32(addr + curReadPos + blockLen - 8);
int ret = bgzfUncompress(buf.data, &dlen, (Bytef*)(addr + curReadPos) + BLOCK_HEADER_LENGTH, blockLen - BLOCK_HEADER_LENGTH, crc);
if (ret != 0) {
spdlog::error("block len: {}, uncompressed len: {}", blockLen, dlen);
exit(0);
}
curReadPos += blockLen;
} else {
spdlog::error("not valid compressed block: {}, {}", curReadPos + blockLen, len);
break; /* 当前block数据不完整一部分在还没读入的file数据里 */
}
}
if (curReadPos != len) {
spdlog::error("addr: {}, len: {}", curReadPos, len);
exit(0);
}
}
static void doWrite(Phase1PipelineArg& p) {
PROF_G_BEG(write_mid);
DataBuffer& compressBuf = p.compressBuf[p.writeOrder % p.COMPRESS_BUF_NUM];
// checkCompress(compressBuf.data, compressBuf.curLen);
fwrite(compressBuf.data, 1, compressBuf.curLen, p.midFilePtr);
PROF_G_END(write_mid);
}
void* phase1Write(void* data) {
Phase1PipelineArg& p = *(Phase1PipelineArg*)data;
// for test写header
// fwrite(nsgv::gInHdr.compressed.data, 1, nsgv::gInHdr.compressed.curLen, p.midFilePtr);
/* do the work */
while (true) {
// previous dependency
yarn::DEPENDENCY_NOT_TO_BE(p.compressSig, 0);
if (p.compressFinish) {
while (p.writeOrder < p.compressOrder) {
doWrite(p);
p.writeOrder += 1;
}
break;
}
doWrite(p);
// update status
yarn::CONSUME_SIGNAL(p.compressSig);
p.writeOrder += 1;
}
// 写结尾空blockbam文件需要
//fwrite("\037\213\010\4\0\0\0\0\0\377\6\0\102\103\2\0\033\0\3\0\0\0\0\0\0\0\0\0", 1, 28, p.midFilePtr);
spdlog::info("End write order: {}", p.writeOrder);
return nullptr;
}