66 lines
2.0 KiB
Zig
66 lines
2.0 KiB
Zig
//! RFC-0020: OPQ (Offline Packet Queue) - Manager
|
|
//!
|
|
//! Orchestrates the flow of frames into the store, enforcing quotas and TTLs.
|
|
|
|
const std = @import("std");
|
|
const store = @import("store.zig");
|
|
const quota = @import("quota.zig");
|
|
const lwf = @import("lwf");
|
|
|
|
pub const OPQManager = struct {
|
|
allocator: std.mem.Allocator,
|
|
policy: quota.Policy,
|
|
store: store.WALStore,
|
|
|
|
pub fn init(allocator: std.mem.Allocator, base_dir: []const u8, persona: quota.Persona) !OPQManager {
|
|
const policy = quota.Policy.init(persona);
|
|
const wal = try store.WALStore.init(allocator, base_dir, policy.segment_size);
|
|
|
|
return OPQManager{
|
|
.allocator = allocator,
|
|
.policy = policy,
|
|
.store = wal,
|
|
};
|
|
}
|
|
|
|
pub fn deinit(self: *OPQManager) void {
|
|
self.store.deinit();
|
|
}
|
|
|
|
/// Ingest a frame into the queue
|
|
pub fn ingestFrame(self: *OPQManager, frame: *const lwf.LWFFrame) !void {
|
|
// 1. Append to WAL
|
|
try self.store.appendFrame(frame);
|
|
|
|
// 2. Periodic maintenance (could be on a timer, but here we do it after ingest)
|
|
try self.maintenance();
|
|
}
|
|
|
|
pub fn maintenance(self: *OPQManager) !void {
|
|
// 1. Prune by TTL
|
|
_ = try self.store.prune(self.policy.max_retention_seconds);
|
|
|
|
// 2. Prune by Size Quota
|
|
_ = try self.store.pruneToSize(self.policy.max_storage_bytes);
|
|
}
|
|
};
|
|
|
|
test "OPQ Manager: Policy Enforcement" {
|
|
const allocator = std.testing.allocator;
|
|
const test_dir = "test_opq_manager";
|
|
|
|
std.fs.cwd().deleteTree(test_dir) catch {};
|
|
defer std.fs.cwd().deleteTree(test_dir) catch {};
|
|
|
|
// 1. Client Policy: 5MB limit, 1hr TTL
|
|
var manager = try OPQManager.init(allocator, test_dir, .client);
|
|
defer manager.deinit();
|
|
|
|
try std.testing.expectEqual(manager.policy.max_storage_bytes, 5 * 1024 * 1024);
|
|
|
|
// 2. Ingest Sample Frame
|
|
var frame = try lwf.LWFFrame.init(allocator, 10);
|
|
defer frame.deinit(allocator);
|
|
try manager.ingestFrame(&frame);
|
|
}
|