Node.js Buffer异或操作出现异常行为的问题排查
纠删码块生成逻辑的哈希不一致问题排查
业务场景
- 用户上传大小为X的文件,将其分割为12个均等块;若无法整除则向上取整,除最后一块外其余块长度一致。
- 对这12个块进行预处理,生成6个纠删块(4个本地块、2个全局块),用于文件恢复,以此减少磁盘占用、优化恢复效率并提升容错性。
正常工作的实现代码
function erasureChunkCreate(chunks,callback) { let erasureChunks = {}; let locale = undefined; let global = undefined; erasureChunks = {'local': {}, 'global': {}}; async.eachSeries(chunks, (item, callback_times) => { if (locale === undefined) locale = item.chunk.slice(); else locale = xor(locale, item.chunk); if (item.seq_no % 3 === 2) { erasureChunks['local'][Math.ceil(item.seq_no / 3)] = locale; if (global === undefined) global = locale.slice(); else global = xor(global, locale); locale = undefined; } callback_times(null); }, (err_times) => { if (err_times) return callback(err_times, null); erasureChunks['global'] = global; return callback(null, erasureChunks); }); }
遇到的问题
当把全局块的计算逻辑移到本地块异或操作之后(不放在item.seq_no % 3 === 2的判断分支里),会出现块哈希不一致的异常行为。
异常场景的代码片段
if (locale === undefined) locale = item.chunk.slice(); else locale = xor(locale, item.chunk); if (global === undefined) global = locale.slice(); else global = xor(global, locale); if (item.seq_no % 3 === 2) { erasureChunks['local'][Math.ceil(item.seq_no / 3)] = locale; locale = undefined; }
排查与修复过程
- 调试并手动检查Buffer及异或结果,发现两种场景下的异或值存在明显差异。
- 调整代码逻辑,将全局块的计算逻辑放到本地块完成并存储的分支内,得到了上述正常工作的代码,解决了哈希不一致的问题。
使用的依赖模块
- async
- buffer-xor
内容的提问来源于stack exchange,提问作者Bogdan Matei
相关产品推荐
相关产品推荐

