[ox/fs] Fix unnecessary FileStore compacting
This commit is contained in:
parent
c9d816503d
commit
7a2033da60
@ -242,12 +242,13 @@ template<typename size_t>
|
|||||||
Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSize, uint8_t fileType) {
|
Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSize, uint8_t fileType) {
|
||||||
oxTrace("ox::fs::FileStoreTemplate::write") << "Attempting to write to inode" << id;
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Attempting to write to inode" << id;
|
||||||
auto existing = find(id);
|
auto existing = find(id);
|
||||||
|
// TODO: change to !canWrite(...)
|
||||||
if (canWrite(existing, dataSize)) {
|
if (canWrite(existing, dataSize)) {
|
||||||
compact();
|
compact();
|
||||||
existing = find(id);
|
existing = find(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canWrite(existing, dataSize)) {
|
if (!canWrite(existing, dataSize)) {
|
||||||
// delete the old node if it exists
|
// delete the old node if it exists
|
||||||
if (existing.valid()) {
|
if (existing.valid()) {
|
||||||
oxTrace("ox::fs::FileStoreTemplate::write") << "Freeing old version of inode found at offset:" << existing.offset();
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Freeing old version of inode found at offset:" << existing.offset();
|
||||||
@ -263,10 +264,12 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
|
|||||||
auto dest = m_buffer->malloc(dataSize);
|
auto dest = m_buffer->malloc(dataSize);
|
||||||
// if first malloc failed, compact and try again
|
// if first malloc failed, compact and try again
|
||||||
if (!dest.valid()) {
|
if (!dest.valid()) {
|
||||||
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Allocation failed, compacting";
|
||||||
compact();
|
compact();
|
||||||
dest = m_buffer->malloc(dataSize);
|
dest = m_buffer->malloc(dataSize);
|
||||||
}
|
}
|
||||||
if (dest.valid()) {
|
if (dest.valid()) {
|
||||||
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Memory allocated";
|
||||||
dest->id = id;
|
dest->id = id;
|
||||||
dest->fileType = fileType;
|
dest->fileType = fileType;
|
||||||
auto destData = m_buffer->template dataOf<uint8_t>(dest);
|
auto destData = m_buffer->template dataOf<uint8_t>(dest);
|
||||||
@ -274,17 +277,21 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
|
|||||||
// write data if any was provided
|
// write data if any was provided
|
||||||
if (data != nullptr) {
|
if (data != nullptr) {
|
||||||
ox_memcpy(destData, data, dest->size());
|
ox_memcpy(destData, data, dest->size());
|
||||||
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Data written";
|
||||||
}
|
}
|
||||||
auto fsData = fileStoreData();
|
auto fsData = fileStoreData();
|
||||||
if (fsData) {
|
if (fsData) {
|
||||||
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Searching for root node at" << fsData->rootNode;
|
||||||
auto root = m_buffer->ptr(fsData->rootNode);
|
auto root = m_buffer->ptr(fsData->rootNode);
|
||||||
if (root.valid()) {
|
if (root.valid()) {
|
||||||
oxTrace("ox::fs::FileStoreTemplate::write") << "Placing" << dest->id << "on" << root->id << "at" << destData.offset();
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Placing" << dest->id << "on" << root->id << "at" << destData.offset();
|
||||||
return placeItem(dest);
|
return placeItem(dest);
|
||||||
} else {
|
} else {
|
||||||
oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode ( offset:" << dest.offset()
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode:" << dest->id << "( offset:" << dest.offset()
|
||||||
<< ", data size:" << destData.size() << ")";
|
<< ", data size:" << destData.size() << ")";
|
||||||
fsData->rootNode = dest.offset();
|
fsData->rootNode = dest.offset();
|
||||||
|
m_buffer->malloc(dataSize);
|
||||||
|
oxTrace("ox::fs::FileStoreTemplate::write") << "Root inode:" << dest->id;
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -462,6 +469,10 @@ template<typename size_t>
|
|||||||
void FileStoreTemplate<size_t>::compact() {
|
void FileStoreTemplate<size_t>::compact() {
|
||||||
m_buffer->compact([this](uint64_t oldAddr, ItemPtr item) {
|
m_buffer->compact([this](uint64_t oldAddr, ItemPtr item) {
|
||||||
if (item.valid()) {
|
if (item.valid()) {
|
||||||
|
oxTrace("ox::FileStoreTemplate::compact::moveItem")
|
||||||
|
<< "Moving Item:" << item->id
|
||||||
|
<< "from" << oldAddr
|
||||||
|
<< "to" << item.offset();
|
||||||
auto parent = findParent(rootInode(), item);
|
auto parent = findParent(rootInode(), item);
|
||||||
if (parent.valid()) {
|
if (parent.valid()) {
|
||||||
if (parent->left == oldAddr) {
|
if (parent->left == oldAddr) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user