Journal::LogBlocks() now calls cache_write() if the block is already in the
log entry - this is only necessary if the buffer is not the one of the CachedBlock object. Journal::TransactionDone() now properly aborts transactions if possible, instead of just writing them to disk (does only work if the log entry was not used by other transactions already). Added a comment about how to speed up writing the log entries a bit more (though it's not so easy to do, and might not be much faster). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3362 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
6c66b99b6b
commit
24d6529a93
@ -258,6 +258,8 @@ Journal::WriteLogEntry()
|
||||
|
||||
CachedBlock cached(fVolume);
|
||||
for (int32 i = 0;i < array->count;i++) {
|
||||
// ToDo: combine blocks if possible (using iovecs)!
|
||||
|
||||
uint8 *block = cached.SetTo(array->values[i]);
|
||||
if (block == NULL)
|
||||
return B_IO_ERROR;
|
||||
@ -368,8 +370,15 @@ Journal::TransactionDone(bool success)
|
||||
{
|
||||
if (!success && fTransactionsInEntry == 0) {
|
||||
// we can safely abort the transaction
|
||||
// ToDo: abort the transaction
|
||||
PRINT(("should abort transaction...\n"));
|
||||
sorted_array *array = fArray.Array();
|
||||
if (array != NULL) {
|
||||
// release the lock for all blocks in the array (we don't need
|
||||
// to be notified when they are actually written to disk)
|
||||
for (int32 i = 0; i < array->count; i++)
|
||||
release_block(fVolume->Device(), array->values[i]);
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
// Up to a maximum size, we will just batch several
|
||||
@ -396,8 +405,17 @@ Journal::LogBlocks(off_t blockNumber, const uint8 *buffer, size_t numBlocks)
|
||||
int32 blockSize = fVolume->BlockSize();
|
||||
|
||||
for (;numBlocks-- > 0; blockNumber++, buffer += blockSize) {
|
||||
if (fArray.Find(blockNumber) >= 0)
|
||||
if (fArray.Find(blockNumber) >= 0) {
|
||||
// The block is already in the log, so just update its data
|
||||
// Note, this is only necessary if this method is called with a buffer
|
||||
// different from the cached block buffer - which is unlikely but
|
||||
// we'll make sure this way (costs one cache lookup, though).
|
||||
status_t status = cached_write(fVolume->Device(), blockNumber, buffer, 1, blockSize);
|
||||
if (status < B_OK)
|
||||
return status;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Insert the block into the transaction's array, and write the changes
|
||||
// back into the locked cache buffer
|
||||
|
Loading…
Reference in New Issue
Block a user