-
Notifications
You must be signed in to change notification settings - Fork 272
Open
Description
这里更新校验和在锁之外进行,假设线程 A 写入日志后释放锁,线程 B 获得锁,写入新日志,线程 A 此时才执行 fc.position(0) 写入校验和,结果校验和与日志数据不一致,如果B先更新校验和,就会出现新的校验和被覆盖?
private int calChecksum(int xCheck, byte[] log) {
for (byte b : log) {
xCheck = xCheck * SEED + b;
}
return xCheck;
}
@Override
public void log(byte[] data) {
byte[] log = wrapLog(data);
ByteBuffer buf = ByteBuffer.wrap(log);
lock.lock();
try {
fc.position(fc.size());
fc.write(buf);
} catch(IOException e) {
Panic.panic(e);
} finally {
lock.unlock();
}
updateXChecksum(log);
}
private void updateXChecksum(byte[] log) {
this.xChecksum = calChecksum(this.xChecksum, log);
try {
fc.position(0);
fc.write(ByteBuffer.wrap(Parser.int2Byte(xChecksum)));
fc.force(false);
} catch(IOException e) {
Panic.panic(e);
}
}
dabidai
Metadata
Metadata
Assignees
Labels
No labels