forked from vitalif/vitastor
Fix blockstore returning garbage for unstable reads if there is an in-flight version
"In-flight" versions are added into dirty_db when writes are enqueued. And they weren't ignored by subsequent reads even though they didn't have data location yet. This bug was leading to test_heal.sh not passing sometimes with replicated setups.
parent
5ef8bed75f
commit
1d80bcc8d0
|
@ -139,7 +139,7 @@ int blockstore_impl_t::dequeue_read(blockstore_op_t *read_op)
|
||||||
while (dirty_it->first.oid == read_op->oid)
|
while (dirty_it->first.oid == read_op->oid)
|
||||||
{
|
{
|
||||||
dirty_entry& dirty = dirty_it->second;
|
dirty_entry& dirty = dirty_it->second;
|
||||||
bool version_ok = read_op->version >= dirty_it->first.version;
|
bool version_ok = !IS_IN_FLIGHT(dirty.state) && read_op->version >= dirty_it->first.version;
|
||||||
if (IS_SYNCED(dirty.state))
|
if (IS_SYNCED(dirty.state))
|
||||||
{
|
{
|
||||||
if (!version_ok && read_op->version != 0)
|
if (!version_ok && read_op->version != 0)
|
||||||
|
@ -174,7 +174,7 @@ int blockstore_impl_t::dequeue_read(blockstore_op_t *read_op)
|
||||||
dirty_it--;
|
dirty_it--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (clean_it != clean_db.end())
|
if (clean_found)
|
||||||
{
|
{
|
||||||
if (!result_version)
|
if (!result_version)
|
||||||
{
|
{
|
||||||
|
|
|
@ -139,7 +139,7 @@ bool blockstore_impl_t::enqueue_write(blockstore_op_t *op)
|
||||||
uint8_t *bmp_ptr = (uint8_t*)(dsk.clean_entry_bitmap_size > sizeof(void*) ? bmp : &bmp);
|
uint8_t *bmp_ptr = (uint8_t*)(dsk.clean_entry_bitmap_size > sizeof(void*) ? bmp : &bmp);
|
||||||
uint32_t bit = op->offset/dsk.bitmap_granularity;
|
uint32_t bit = op->offset/dsk.bitmap_granularity;
|
||||||
uint32_t bits_left = op->len/dsk.bitmap_granularity;
|
uint32_t bits_left = op->len/dsk.bitmap_granularity;
|
||||||
while (!(bit % 8) && bits_left > 8)
|
while (!(bit % 8) && bits_left >= 8)
|
||||||
{
|
{
|
||||||
// Copy bytes
|
// Copy bytes
|
||||||
bmp_ptr[bit/8] = ((uint8_t*)op->bitmap)[bit/8];
|
bmp_ptr[bit/8] = ((uint8_t*)op->bitmap)[bit/8];
|
||||||
|
|
Loading…
Reference in New Issue