[ox/fs] Add Error return to FileStore compact
This commit is contained in:
		@@ -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);
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								deps/ox/src/ox/ptrarith/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								deps/ox/src/ox/ptrarith/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							@@ -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>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user