mirror of
				https://github.com/Zygo/bees.git
				synced 2025-11-04 04:00:36 +01:00 
			
		
		
		
	context: get rid of shared_ptr<BeesContext> in every single cached Fd object
Support for multiple BeesContext objects sharing a FdCache was wasting significant space and atomic inc/dec memory cycles for no good reason since the shared-FdCache feature was deprecated. open_root and open_root_ino still need a BeesContext to work. Pass the BeesContext pointer through the function object instead of the cache key arguments. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
		@@ -21,18 +21,19 @@ using namespace crucible;
 | 
				
			|||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BeesFdCache::BeesFdCache()
 | 
					BeesFdCache::BeesFdCache(shared_ptr<BeesContext> ctx) :
 | 
				
			||||||
 | 
						m_ctx(ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	m_root_cache.func([&](shared_ptr<BeesContext> ctx, uint64_t root) -> Fd {
 | 
						m_root_cache.func([&](uint64_t root) -> Fd {
 | 
				
			||||||
		Timer open_timer;
 | 
							Timer open_timer;
 | 
				
			||||||
		auto rv = ctx->roots()->open_root_nocache(root);
 | 
							auto rv = m_ctx->roots()->open_root_nocache(root);
 | 
				
			||||||
		BEESCOUNTADD(open_root_ms, open_timer.age() * 1000);
 | 
							BEESCOUNTADD(open_root_ms, open_timer.age() * 1000);
 | 
				
			||||||
		return rv;
 | 
							return rv;
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
	m_root_cache.max_size(BEES_ROOT_FD_CACHE_SIZE);
 | 
						m_root_cache.max_size(BEES_ROOT_FD_CACHE_SIZE);
 | 
				
			||||||
	m_file_cache.func([&](shared_ptr<BeesContext> ctx, uint64_t root, uint64_t ino) -> Fd {
 | 
						m_file_cache.func([&](uint64_t root, uint64_t ino) -> Fd {
 | 
				
			||||||
		Timer open_timer;
 | 
							Timer open_timer;
 | 
				
			||||||
		auto rv = ctx->roots()->open_root_ino_nocache(root, ino);
 | 
							auto rv = m_ctx->roots()->open_root_ino_nocache(root, ino);
 | 
				
			||||||
		BEESCOUNTADD(open_ino_ms, open_timer.age() * 1000);
 | 
							BEESCOUNTADD(open_ino_ms, open_timer.age() * 1000);
 | 
				
			||||||
		return rv;
 | 
							return rv;
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
@@ -51,15 +52,15 @@ BeesFdCache::clear()
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Fd
 | 
					Fd
 | 
				
			||||||
BeesFdCache::open_root(shared_ptr<BeesContext> ctx, uint64_t root)
 | 
					BeesFdCache::open_root(uint64_t root)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return m_root_cache(ctx, root);
 | 
						return m_root_cache(root);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Fd
 | 
					Fd
 | 
				
			||||||
BeesFdCache::open_root_ino(shared_ptr<BeesContext> ctx, uint64_t root, uint64_t ino)
 | 
					BeesFdCache::open_root_ino(uint64_t root, uint64_t ino)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return m_file_cache(ctx, root, ino);
 | 
						return m_file_cache(root, ino);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@@ -1107,7 +1108,7 @@ BeesContext::fd_cache()
 | 
				
			|||||||
		throw BeesHalt();
 | 
							throw BeesHalt();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (!m_fd_cache) {
 | 
						if (!m_fd_cache) {
 | 
				
			||||||
		m_fd_cache = make_shared<BeesFdCache>();
 | 
							m_fd_cache = make_shared<BeesFdCache>(shared_from_this());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	auto rv = m_fd_cache;
 | 
						auto rv = m_fd_cache;
 | 
				
			||||||
	return rv;
 | 
						return rv;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -709,7 +709,7 @@ BeesRoots::open_root(uint64_t rootid)
 | 
				
			|||||||
		return Fd();
 | 
							return Fd();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return m_ctx->fd_cache()->open_root(m_ctx, rootid);
 | 
						return m_ctx->fd_cache()->open_root(rootid);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool
 | 
					bool
 | 
				
			||||||
@@ -906,7 +906,7 @@ BeesRoots::open_root_ino_nocache(uint64_t root, uint64_t ino)
 | 
				
			|||||||
Fd
 | 
					Fd
 | 
				
			||||||
BeesRoots::open_root_ino(uint64_t root, uint64_t ino)
 | 
					BeesRoots::open_root_ino(uint64_t root, uint64_t ino)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return m_ctx->fd_cache()->open_root_ino(m_ctx, root, ino);
 | 
						return m_ctx->fd_cache()->open_root_ino(root, ino);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RateEstimator &
 | 
					RateEstimator &
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								src/bees.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/bees.h
									
									
									
									
									
								
							@@ -697,15 +697,16 @@ public:
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BeesFdCache {
 | 
					class BeesFdCache {
 | 
				
			||||||
	LRUCache<Fd, shared_ptr<BeesContext>, uint64_t>			m_root_cache;
 | 
						shared_ptr<BeesContext> 		m_ctx;
 | 
				
			||||||
	LRUCache<Fd, shared_ptr<BeesContext>, uint64_t, uint64_t>	m_file_cache;
 | 
						LRUCache<Fd, uint64_t>			m_root_cache;
 | 
				
			||||||
 | 
						LRUCache<Fd, uint64_t, uint64_t>	m_file_cache;
 | 
				
			||||||
	Timer					m_root_cache_timer;
 | 
						Timer					m_root_cache_timer;
 | 
				
			||||||
	Timer					m_file_cache_timer;
 | 
						Timer					m_file_cache_timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
	BeesFdCache();
 | 
						BeesFdCache(shared_ptr<BeesContext> ctx);
 | 
				
			||||||
	Fd open_root(shared_ptr<BeesContext> ctx, uint64_t root);
 | 
						Fd open_root(uint64_t root);
 | 
				
			||||||
	Fd open_root_ino(shared_ptr<BeesContext> ctx, uint64_t root, uint64_t ino);
 | 
						Fd open_root_ino(uint64_t root, uint64_t ino);
 | 
				
			||||||
	void clear();
 | 
						void clear();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user