[ox/fs] Add Error return to FileStore compact

This commit is contained in:
Gary Talent 2019-07-20 18:46:52 -05:00
parent 22378d0a9f
commit 2d2cd2bbb6
2 changed files with 13 additions and 11 deletions

View File

@ -130,7 +130,7 @@ class FileStoreTemplate {
bool valid() const; bool valid() const;
void compact(); ox::Error compact();
private: private:
FileStoreData *fileStoreData() const; FileStoreData *fileStoreData() const;
@ -247,7 +247,7 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
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);
if (!canWrite(existing, dataSize)) { if (!canWrite(existing, dataSize)) {
compact(); oxReturnError(compact());
existing = find(id); existing = find(id);
} }
@ -268,7 +268,7 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
// 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"; oxTrace("ox::fs::FileStoreTemplate::write") << "Allocation failed, compacting";
compact(); oxReturnError(compact());
dest = m_buffer->malloc(dataSize); dest = m_buffer->malloc(dataSize);
} }
if (dest.valid()) { if (dest.valid()) {
@ -413,7 +413,7 @@ const ptrarith::Ptr<uint8_t, std::size_t> FileStoreTemplate<size_t>::read(InodeI
template<typename size_t> template<typename size_t>
ox::Error FileStoreTemplate<size_t>::resize() { ox::Error FileStoreTemplate<size_t>::resize() {
compact(); oxReturnError(compact());
oxReturnError(m_buffer->setSize(size() - available())); oxReturnError(m_buffer->setSize(size() - available()));
oxTrace("ox::fs::FileStoreTemplate::resize") << "resize to:" << size() - available(); oxTrace("ox::fs::FileStoreTemplate::resize") << "resize to:" << size() - available();
oxTrace("ox::fs::FileStoreTemplate::resize") << "resized to:" << m_buffer->size(); oxTrace("ox::fs::FileStoreTemplate::resize") << "resized to:" << m_buffer->size();
@ -491,15 +491,15 @@ ValErr<typename FileStoreTemplate<size_t>::InodeId_t> FileStoreTemplate<size_t>:
} }
template<typename size_t> template<typename size_t>
void FileStoreTemplate<size_t>::compact() { ox::Error FileStoreTemplate<size_t>::compact() {
auto isFirstItem = true; auto isFirstItem = true;
m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) { return m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) -> ox::Error {
if (isFirstItem) { if (isFirstItem) {
isFirstItem = false; isFirstItem = false;
return; return OxError(0);
} }
if (!item.valid()) { if (!item.valid()) {
return; return OxError(1);
} }
oxTrace("ox::FileStoreTemplate::compact::moveItem") oxTrace("ox::FileStoreTemplate::compact::moveItem")
<< "Moving Item:" << item->id << "Moving Item:" << item->id
@ -520,6 +520,7 @@ void FileStoreTemplate<size_t>::compact() {
parent->right = item; parent->right = item;
} }
} }
return OxError(0);
}); });
} }

View File

@ -150,7 +150,7 @@ class __attribute__((packed)) NodeBuffer {
size_t spaceNeeded(size_t size); size_t spaceNeeded(size_t size);
template<typename F> template<typename F>
void compact(F cb = [](uint64_t, ItemPtr) {}); ox::Error compact(F cb = [](uint64_t, ItemPtr) {});
void truncate(); void truncate();
@ -354,13 +354,13 @@ size_t NodeBuffer<size_t, Item>::spaceNeeded(size_t size) {
template<typename size_t, typename Item> template<typename size_t, typename Item>
template<typename F> template<typename F>
void NodeBuffer<size_t, Item>::compact(F cb) { ox::Error NodeBuffer<size_t, Item>::compact(F cb) {
auto src = firstItem(); auto src = firstItem();
auto dest = ptr(sizeof(*this)); auto dest = ptr(sizeof(*this));
while (src.valid() && dest.valid() && dest.offset() <= src.offset()) { while (src.valid() && dest.valid() && dest.offset() <= src.offset()) {
// move node // move node
ox_memcpy(dest, src, src.size()); ox_memcpy(dest, src, src.size());
cb(src, dest); oxReturnError(cb(src, dest));
// update surrounding nodes // update surrounding nodes
auto prev = ptr(dest->prev); auto prev = ptr(dest->prev);
if (prev.valid()) { if (prev.valid()) {
@ -374,6 +374,7 @@ void NodeBuffer<size_t, Item>::compact(F cb) {
src = ptr(dest->next); src = ptr(dest->next);
dest = ptr(dest.offset() + dest.size()); dest = ptr(dest.offset() + dest.size());
} }
return OxError(0);
} }
template<typename size_t, typename Item> template<typename size_t, typename Item>