{"id":15047592,"url":"https://github.com/nuatlas/furrballs","last_synced_at":"2026-01-25T11:05:58.643Z","repository":{"id":250384530,"uuid":"832624808","full_name":"NuAtlas/Furrballs","owner":"NuAtlas","description":"Furrballs: A C++17 Offset-Based Caching solution","archived":false,"fork":false,"pushed_at":"2024-08-19T23:10:24.000Z","size":564,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-02T16:41:59.046Z","etag":null,"topics":["caching","cpp","cpp17","memory-management"],"latest_commit_sha":null,"homepage":"https://nuatlas.github.io/Furrballs/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NuAtlas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-23T11:52:42.000Z","updated_at":"2024-08-06T07:55:56.000Z","dependencies_parsed_at":"2024-08-20T03:35:51.693Z","dependency_job_id":null,"html_url":"https://github.com/NuAtlas/Furrballs","commit_stats":null,"previous_names":["thesphynxoid/furrballs","nuatlas/furrballs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NuAtlas%2FFurrballs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NuAtlas%2FFurrballs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NuAtlas%2FFurrballs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NuAtlas%2FFurrballs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NuAtlas","download_url":"https://codeload.github.com/NuAtlas/Furrballs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239097845,"owners_count":19581111,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["caching","cpp","cpp17","memory-management"],"created_at":"2024-09-24T21:00:55.635Z","updated_at":"2025-10-31T02:31:21.486Z","avatar_url":"https://github.com/NuAtlas.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Furrballs\nBasic Archiving and caching solution, It'll feature LZ4 on-the-fly compression, LRU eviction plan \nand Offset-based Caching. It's primary target is Game Engines, thus Furrballs aims to have as low latency\nas possible.\n\nThe plan is to have a basic solution with minimal dependencies (Simply because Cachelib had to many \ndependencies)\n# Setup\n**Requirements:**\n\n**-CMake**\n\n**-C++17**\n\n**-LZ4**\n\n**-RocksDB**\n\n**-64-bit System**\n\n# AMP (Adaptive Memory Pooling): \n\nAMP employs a counter that increments on eviction when a cache entry is accessed. \nIf this counter exceeds a specified threshold, the cache expands to accommodate more values. \nEach expansion also triggers an increment of a secondary counter. \nIf this secondary counter reaches its threshold, \nthe number of pages allocated in the expansion increases to prevent temporary fragmentation.\n\nThe memory pool introduces an indirection layer for pointers returned by the library, \nusing virtual pointers that remain valid even if the underlying data is moved. \nThis enables defragmentation without invalidating pointers, allowing the use of the upper bits for metadata.\n\n**Note:** The defragmentation operation should block all threads. \nConsider researching non-blocking memory management solutions such as Hoard or TBB, \nor implementing incremental memory expansion using a separate thread.\n\n**Important:** This approach assumes that very large memory usage or large pointers are not considered. \nIf such large memory usage occurs, the system will break and may require an alternative approach that avoids using virtual pointers. \nThis issue is relevant only for servers with very large memory available, which are not the target for this library.\n\nAdditionally, this solution is designed exclusively for 64-bit systems, as enforced by the build system.\n\n# Coding Guidelines:\n\n**Use 'const' on member functions and arguments when ever it's possible.**\n\n**All functions should be noexcept unless they explicitly throw as an indication to user.**\n\n**Everything should be designed with Multi-threading in mind.**\n\n**When possible use atomic types/operations.**\n\n**Allow for modularity and integration with and into other projects.**\n(ex: allow for the use of a threadpool or a job system provided externally for burst)\n\n**Only paging system is allowed to allocated memory, \nany allocation goes through it (or MemoryManager class) if independent buffer is needed**\n\n**Exceptions are only for unrecoverable errors or rare uses** \notherwise continue gracefully and inform user.\n\n**In case of Exceptions:** \n- Rethrow if you didn't recover and don't catch.\n- Rethrown exceptions should never be caught again.\n- Have only one layer of try/except.\n- Do NOT use catch to catch all exception types.\n- Only handle exceptions that are supposed to be recovered from.\n- Do not catch exceptions in multi-threaded execution.\n- Do not catch Memory Exceptions thrown by the library.\n- NEVER throw in constructor, if the constructor is throwing use a factory design instead. \nand let the factory return errors or (nullptr to indicate failure to initialize)\n\u003e This is to **guarantee** that all constructed objects are ***initialized*** correctly \n***without*** requiring additional checks after creation or else 'nullptr' is returned.\n- Destructors should never under any cirumstance throw. Unlike destructors, they should not\nbe replaced by cleanup function that throws, simply put **DESTRUCTORS/CLEANUP MUST NEVER THROW!**\n\u003e This is to **guarantee** that **Cleanup** is always ***reliable***, \n***stable*** and callable ***without additional precaution***.\n\n*In any other case Prioritize **performance and low latency** over **all**.*\n\u003e Mark code as critical to indicate that the guidelines are overriden. Do not abuse this.\n\n### Notes:\nPriorities are Unix(POSIX) and Windows.\nmacOS is not a priority.\n\n\u003eBecause of limited use (none to be exact) or compatibility considerations, \nmacOS-related issues will not be the primary focus. \nSpecifically, the author will not engage with macOS-related issues, \nconform to macOS guidelines, or implement macOS-specific code. \n(This decision is based on a personal preference to avoid Apple products,\nthough POSIX compliance allows for indirect support.)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuatlas%2Ffurrballs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnuatlas%2Ffurrballs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnuatlas%2Ffurrballs/lists"}