forked from vitalif/vitastor
Followup to the "tried to overwrite" fix: also handle it in case of inmemory_meta == false
parent
153c73574a
commit
54ef2c389f
|
@ -3,6 +3,11 @@
|
||||||
|
|
||||||
#include "blockstore_impl.h"
|
#include "blockstore_impl.h"
|
||||||
|
|
||||||
|
#define INIT_META_EMPTY 0
|
||||||
|
#define INIT_META_READING 1
|
||||||
|
#define INIT_META_READ_DONE 2
|
||||||
|
#define INIT_META_WRITING 3
|
||||||
|
|
||||||
#define GET_SQE() \
|
#define GET_SQE() \
|
||||||
sqe = bs->get_sqe();\
|
sqe = bs->get_sqe();\
|
||||||
if (!sqe)\
|
if (!sqe)\
|
||||||
|
@ -32,7 +37,11 @@ void blockstore_init_meta::handle_event(ring_data_t *data, int buf_num)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (buf_num >= 0)
|
if (buf_num >= 0)
|
||||||
bufs[buf_num].state = 2;
|
{
|
||||||
|
bufs[buf_num].state = (bufs[buf_num].state == INIT_META_READING
|
||||||
|
? INIT_META_READ_DONE
|
||||||
|
: INIT_META_EMPTY);
|
||||||
|
}
|
||||||
submitted--;
|
submitted--;
|
||||||
bs->ringloop->wakeup();
|
bs->ringloop->wakeup();
|
||||||
}
|
}
|
||||||
|
@ -146,7 +155,7 @@ resume_2:
|
||||||
bufs[i].offset = next_offset;
|
bufs[i].offset = next_offset;
|
||||||
bufs[i].size = bs->dsk.meta_len-next_offset > bs->metadata_buf_size
|
bufs[i].size = bs->dsk.meta_len-next_offset > bs->metadata_buf_size
|
||||||
? bs->metadata_buf_size : bs->dsk.meta_len-next_offset;
|
? bs->metadata_buf_size : bs->dsk.meta_len-next_offset;
|
||||||
bufs[i].state = 1;
|
bufs[i].state = INIT_META_READING;
|
||||||
submitted++;
|
submitted++;
|
||||||
next_offset += bufs[i].size;
|
next_offset += bufs[i].size;
|
||||||
GET_SQE();
|
GET_SQE();
|
||||||
|
@ -167,19 +176,33 @@ resume_2:
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
if (bufs[i].state == 2)
|
if (bufs[i].state == INIT_META_READ_DONE)
|
||||||
{
|
{
|
||||||
// Handle result
|
// Handle result
|
||||||
unsigned entries_per_block = bs->dsk.meta_block_size / bs->dsk.clean_entry_size;
|
unsigned entries_per_block = bs->dsk.meta_block_size / bs->dsk.clean_entry_size;
|
||||||
|
bool changed = false;
|
||||||
for (uint64_t sector = 0; sector < bufs[i].size; sector += bs->dsk.meta_block_size)
|
for (uint64_t sector = 0; sector < bufs[i].size; sector += bs->dsk.meta_block_size)
|
||||||
{
|
{
|
||||||
// handle <count> entries
|
// handle <count> entries
|
||||||
handle_entries(
|
changed = changed || handle_entries(
|
||||||
bufs[i].buf + sector, entries_per_block,
|
bufs[i].buf + sector, entries_per_block,
|
||||||
((bufs[i].offset + sector - md_offset) / bs->dsk.meta_block_size) * entries_per_block
|
((bufs[i].offset + sector - md_offset) / bs->dsk.meta_block_size) * entries_per_block
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (changed && !bs->inmemory_meta)
|
||||||
|
{
|
||||||
|
// write the modified buffer back
|
||||||
|
GET_SQE();
|
||||||
|
data->iov = { bufs[i].buf, bufs[i].size };
|
||||||
|
data->callback = [this, i](ring_data_t *data) { handle_event(data, i); };
|
||||||
|
my_uring_prep_writev(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + bufs[i].offset);
|
||||||
|
bufs[i].state = INIT_META_WRITING;
|
||||||
|
submitted++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
bufs[i].state = 0;
|
bufs[i].state = 0;
|
||||||
|
}
|
||||||
bs->ringloop->wakeup();
|
bs->ringloop->wakeup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,7 +257,6 @@ bool blockstore_init_meta::handle_entries(uint8_t *buf, uint64_t count, uint64_t
|
||||||
// free the previous block
|
// free the previous block
|
||||||
// here we have to zero out the entry because otherwise we'll hit
|
// here we have to zero out the entry because otherwise we'll hit
|
||||||
// "tried to overwrite non-zero metadata entry" later
|
// "tried to overwrite non-zero metadata entry" later
|
||||||
// FIXME: Write it back if modified with inmemory_meta == false
|
|
||||||
updated = true;
|
updated = true;
|
||||||
memset(entry, 0, bs->dsk.clean_entry_size);
|
memset(entry, 0, bs->dsk.clean_entry_size);
|
||||||
#ifdef BLOCKSTORE_DEBUG
|
#ifdef BLOCKSTORE_DEBUG
|
||||||
|
|
Loading…
Reference in New Issue