descriptors released in the last transaction are now reused in the next

This commit is contained in:
Krasimir Angelov
2022-05-23 09:50:58 +02:00
parent 9cd5634873
commit 35176cc721
2 changed files with 28 additions and 4 deletions

View File

@@ -348,6 +348,7 @@ PgfDB::PgfDB(const char* filepath, int flags, int mode) {
free_blocks = ms->free_blocks;
free_descriptors[0] = ms->free_descriptors;
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
PGF_INTERNAL
@@ -644,6 +645,8 @@ object PgfDB::upd_block_descr(object map, object left, object right)
descr->chain = free_descriptors[1];
free_descriptors[1] = map;
if (free_descriptors[2] == 0)
free_descriptors[2] = map;
if (free_descriptors[0] != 0) {
map = free_descriptors[0];
@@ -955,6 +958,8 @@ fit:
int index = (descr->descr_txn_id != ms->curr_txn_id);
descr->chain = free_descriptors[index];
free_descriptors[index] = map;
if (index == 1 && free_descriptors[2] == 0)
free_descriptors[2] = map;
if (descr->left == 0) {
return descr->right;
@@ -1172,6 +1177,7 @@ void PgfDB::start_transaction()
free_blocks = ms->free_blocks;
free_descriptors[0] = ms->free_descriptors;
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
PGF_INTERNAL
@@ -1188,12 +1194,24 @@ void PgfDB::commit()
if (current_db->fd < 0) {
ms->top = top;
ms->free_blocks = free_blocks;
if (free_descriptors[2] != 0) {
ptr(block_descr,free_descriptors[2])->chain = free_descriptors[0];
free_descriptors[0] = free_descriptors[1];
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
ms->free_descriptors = free_descriptors[0];
free_descriptors[1] = 0;
ms->curr_txn_id++;
res = 0;
} else {
#endif
if (free_descriptors[2] != 0) {
ptr(block_descr,free_descriptors[2])->chain = free_descriptors[0];
free_descriptors[0] = free_descriptors[1];
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
res = msync((void *) base, mmap_size, MS_SYNC | MS_INVALIDATE);
if (res != 0)
throw pgf_systemerror(errno);
@@ -1201,7 +1219,6 @@ void PgfDB::commit()
ms->top = top;
ms->free_blocks = free_blocks;
ms->free_descriptors = free_descriptors[0];
free_descriptors[1] = 0;
ms->curr_txn_id++;
res = msync((void *) ms, page_size, MS_SYNC | MS_INVALIDATE);
@@ -1217,13 +1234,19 @@ void PgfDB::commit()
#endif
#else
if (current_db->fd > 0) {
if (free_descriptors[2] != 0) {
ptr(block_descr,free_descriptors[2])->chain = free_descriptors[0];
free_descriptors[0] = free_descriptors[1];
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
if (!FlushViewOfFile(base,mmap_size)) {
throw pgf_systemerror(last_error_to_errno());
}
ms->top = top;
ms->free_blocks = free_blocks;
ms->free_descriptors = free_descriptors[0];
free_descriptors[1] = 0;
ms->curr_txn_id++;
if (!FlushViewOfFile(ms,page_size)) {
ms->top = save_top;
@@ -1243,6 +1266,7 @@ void PgfDB::rollback()
free_blocks = ms->free_blocks;
free_descriptors[0] = ms->free_descriptors;
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
#ifdef _WIN32

View File

@@ -70,7 +70,7 @@ private:
// The exception is when a transaction is active.
object top;
object free_blocks;
object free_descriptors[2];
object free_descriptors[3];
size_t mmap_size;
size_t page_size;