Skip to content

Logger的checksum更新的未加锁问题 #32

@zzzrw

Description

@zzzrw

这里更新校验和在锁之外进行,假设线程 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);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions