Dmitriy Govorukhin created IGNITE-9049:
------------------------------------------
Summary: Missed SWITCH_SEGMENT_RECORD at the end of WAL file but
space enough
Key: IGNITE-9049
URL: https://issues.apache.org/jira/browse/IGNITE-9049
Project: Ignite
Issue Type: Improvement
Reporter: Dmitriy Govorukhin
There is a situation the several threads try addRecord when the free space ends
(need rollOver to the next WAL segment) and none thread writes
SWITCH_SEGMENT_RECORD. This leads to an end of the file will have garbage. If
we try to iterate over this segment, iterator stopped when try to read next
record and stumble on the garbage at the end of the file, it leads log will not
be fully read. Any type of operation required iterator may be broken (crash
recovery, delta rebalance, etc.).
Example:
File size 1024 bytes
Current tail position 768 (free space 256)
1. Thread-1 try addRecord (size 128) -> tail update to 896.
2. Thread-2 try addRecord (size 128) -> tail update to 1024 (free space ended).
None thread still not write any data, it just reserves position for write.
(SegmentedRingByteBuffer.offer).
3. Thread-3 try addRecord (size 128) -> no space enough -> rollOver and CAS
stop flag to TRUE.
4. Thread-1 and Thread-2 try to write data and cannot do it.
FileWriteHandle.addRecord
{code}
if (buf == null || (stop.get() && rec.type() != SWITCH_SEGMENT_RECORD))
return null; // Can not write to this segment, need
to switch to the next one.
{code}
Thread-3 - can not write SWITCH_SEGMENT_RECORD because of not enough space.
Thread-1 and Thread-2 cannot write their data because a stop is TRUE
We have garbage from 768 to 1024 position.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)