pnoltes opened a new issue, #830:
URL: https://github.com/apache/celix/issues/830

   ### Description
   
   ASF Celix bundles are currently distributed and loaded as ZIP files, which 
requires a runtime dependency on `libzip`. This proposal details the concept of 
a **Bundle Store** architecture designed to decouple the distribution format 
from runtime execution. By adopting a Content-Addressable Storage (CAS) model 
(aligned with the **OCI Registry as Storage (ORAS)** concept) bundles can be 
provisioned via ZIP, TAR, or OCI layers, while moving the bundle runtime usage 
to a  directory-based system.
   
   ### Rationale
   
   * **Removal of Runtime Overhead:** Transitioning to a directory-based store 
eliminates the need for `libzip` and runtime decompression.
   * **OCI Ecosystem Alignment:** Leveraging the ORAS concept for bundle 
distribution and possible signing. 
   * **Security & Reliability:** Explicitly separates immutable bundle code 
from application state.
   
   ### Storage Management: `celix-bnd-storage`
   
   The management of the bundle store and the association of storage tiers is 
handled by a new utility: **`celix-bnd-storage`**.
   
   #### Configuration (`~/.config/celix/bnd-storage.json`)
   
   This human-editable file defines the global environment settings:
   
   * **Storage Roots:** Base paths for the **Bundle Store**, **Persistent 
Storage**, and **Volatile Storage**.
   * **Policy Settings:** Default garbage collection (GC) rules and retention 
periods.
   
   #### Instance (Bundle) State (`/var/run/celix/instances.d/` or 
`~/.local/share/celix/state/instances.d/`)
   
   To ensure concurrency safety and remove the usage of a state directory in 
the CWD, a directory-based **Instance State** is introduced. Each active 
framework instance maintains its own JSON entry named after its SHA-256 ID. 
This registry tracks:
   
   * **Instance Mapping:** Linkage between the **Framework Instance SHA-256** 
and its assigned **Friendly Name**.
   * **Process Tracking:** The current **Process ID (PID)** and start time.
   
   ### Framework Instance Identification
   
   The framework transitions from random UUIDs to deterministic **SHA-256 
Framework Instance IDs**.
   
   1. **Identity Derivation:** If an instance ID is not explicitly provided, 
the Celix launcher generates a SHA-256 hash based on:
   * The absolute path of the application executable
   * The absolute path of the current working directory (CWD).
   
   2. **Naming Approach:** Instances are assigned "friendly names" (e.g., 
`focused_hawking`) mapped to the SHA-256 ID within the State Registry entries 
(nice to have). 
   3. **Launcher Integration:** The launcher supports the `--instance_id` 
argument to manually specify a SHA-256 ID. And optionally support a 
`--instance_name` argument.
   
   ### Architecture: The 3-Tier Filesystem Model
   
   The framework interacts with three distinct filesystem areas:
   
   1. **Bundle Store (Immutable):**
   * `blobs/sha256/`: Contains unpacked bundle content, indexed by the SHA-256 
hash. If possible, these directories should be mounted or marked as 
**read-only** to ensure integrity.
   * `tags/<bundle_symbolic_name>/<bundle_version>`: A structure of symbolic 
links, linking to unpacked bundle blob entries.
   
   
   2. **Volatile Storage:**
   * Located at `<volatile_root>/<instance_sha256>/`. Intended for `tmpfs` 
storage.
   
   
   3. **Persistent Storage:**
   * Located at `<persistent_root>/<instance_sha256>/`. Reserved for long-term 
state that survives restarts.
   
   
   ### Proposed API Changes
   
   The `celix_bundle.h` and `celix_framework.h` interfaces are extended:
   
   * **Immutable Resources:**
     * `const char* celix_bundle_getBundleStorePath(const celix_bundle_t* bnd, 
const char* path)`: Returns the absolute path to a file within the **Bundle 
Store** for the specific bundle.
   
   
   * **Instance Storage:**
     * `char* celix_bundle_getPersistentStoragePath(const celix_bundle_t* 
bnd)`: Returns the path to the persistent directory dedicated to the bundle for 
the specific framework instance.
     * `char* celix_bundle_getVolatileStoragePath(const celix_bundle_t* bnd)`: 
Returns the path to the volatile directory for the current run.
   
   * **Framework**
     * `const char* celix_framework_getInstanceId(const celix_framework_t* 
fw)`: Returns the framework instance id (SHA256).
     * `const char* celix_framework_getName(const celix_framework_t* fw)`: 
Returns the framework (human friendly) name.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to