tiny.closure.limits
Defined in tiny.closure.
API (23)
Types and contracts
Public types and contracts.
Values and defaults
Public values and defaults.
artifacts_maxauthorities_maxbuild_records_maxclaim_nodes_maxclaims_maxdigests_maxedges_maxheader_byteslineage_references_maxnodes_maxprovenance_parents_maxranges_maxreceipt_bytes_maxresidual_roots_maxservice_descriptors_maxslot_header_bytessource_records_maxstorage_alignment
Source
Source: lib/closure/src/limits.zig
zig
const schema = @import("schema/root.zig");const project = @import("project/root.zig");const std = @import("std");pub const nodes_max: usize = 64;pub const edges_max: usize = 128;pub const artifacts_max: usize = 32;pub const ranges_max: usize = 128;pub const digests_max: usize = 128;pub const provenance_parents_max: usize = 128;pub const source_records_max: usize = 64;pub const build_records_max: usize = 64;pub const authorities_max: usize = 64;pub const lineage_references_max: usize = 64;pub const service_descriptors_max: usize = 16;pub const residual_roots_max: usize = 64;pub const claims_max: usize = 8;pub const claim_nodes_max: usize = 128;pub const receipt_bytes_max: usize = 512 * 1_024;pub const storage_alignment: usize = 16;pub const header_bytes: usize = 512;pub const slot_header_bytes: usize = 256;pub const Limits = struct { nodes: usize = nodes_max, edges: usize = edges_max, artifacts: usize = artifacts_max, ranges: usize = ranges_max, digests: usize = digests_max, provenance_parents: usize = provenance_parents_max, source_records: usize = source_records_max, build_records: usize = build_records_max, authorities: usize = authorities_max, lineage_references: usize = lineage_references_max, service_descriptors: usize = service_descriptors_max, residual_roots: usize = residual_roots_max, claims: usize = claims_max, claim_nodes: usize = claim_nodes_max, receipt_bytes: usize = receipt_bytes_max,};pub const SlotLayout = struct { base: usize, header: usize, nodes: usize, edges: usize, artifacts: usize, ranges: usize, digests: usize, provenance_parents: usize, source_records: usize, build_records: usize, authorities: usize, lineage_references: usize, service_descriptors: usize, residual_roots: usize, claims: usize, claim_nodes: usize, end: usize,};pub const Layout = struct { header: usize, slots: [2]SlotLayout, visited: usize, queue: usize, receipt: usize, storage_bytes: usize,};pub const CapacityError = error{ EmptyLimit, NodeCapacityExceeded, EdgeCapacityExceeded, ArtifactCapacityExceeded, RangeCapacityExceeded, DigestCapacityExceeded, ProvenanceParentCapacityExceeded, SourceRecordCapacityExceeded, BuildRecordCapacityExceeded, AuthorityCapacityExceeded, LineageReferenceCapacityExceeded, ServiceDescriptorCapacityExceeded, ResidualRootCapacityExceeded, ClaimCapacityExceeded, ClaimNodeCapacityExceeded, ReceiptCapacityExceeded, CapacityArithmeticOverflow,};pub const Capacity = struct { nodes: usize, edges: usize, artifacts: usize, ranges: usize, digests: usize, provenance_parents: usize, source_records: usize, build_records: usize, authorities: usize, lineage_references: usize, service_descriptors: usize, residual_roots: usize, claims: usize, claim_nodes: usize, receipt_bytes: usize, projection_steps_max: usize, receipt_rows_max: usize, layout: Layout, storage_bytes: usize, pub const DeriveError: type = CapacityError; pub fn derive(requested: Limits) DeriveError!Capacity { try validate(requested); const layout = try deriveLayout(requested); const projection_steps = project.maximumWork(.{ .nodes = requested.nodes, .edges = requested.edges, .artifacts = requested.artifacts, .ranges = requested.ranges, .digests = requested.digests, .provenance_parents = requested.provenance_parents, .source_records = requested.source_records, .build_records = requested.build_records, .authorities = requested.authorities, .lineage_references = requested.lineage_references, .service_descriptors = requested.service_descriptors, .residual_roots = requested.residual_roots, .claims = requested.claims, .claim_nodes = requested.claim_nodes, }) catch return error.CapacityArithmeticOverflow; return .{ .nodes = requested.nodes, .edges = requested.edges, .artifacts = requested.artifacts, .ranges = requested.ranges, .digests = requested.digests, .provenance_parents = requested.provenance_parents, .source_records = requested.source_records, .build_records = requested.build_records, .authorities = requested.authorities, .lineage_references = requested.lineage_references, .service_descriptors = requested.service_descriptors, .residual_roots = requested.residual_roots, .claims = requested.claims, .claim_nodes = requested.claim_nodes, .receipt_bytes = requested.receipt_bytes, .projection_steps_max = projection_steps, .receipt_rows_max = try receiptRows(requested), .layout = layout, .storage_bytes = layout.storage_bytes, }; }};fn deriveLayout(requested: Limits) CapacityError!Layout { var cursor = try aligned(header_bytes, storage_alignment); const first = try slotLayout(cursor, requested); cursor = try aligned(first.end, storage_alignment); const second = try slotLayout(cursor, requested); cursor = try aligned(second.end, storage_alignment); const visited = cursor; cursor = try added(cursor, requested.nodes); cursor = try aligned(cursor, @alignOf(u32)); const queue = cursor; cursor = try segment(cursor, requested.nodes, @sizeOf(u32)); cursor = try aligned(cursor, storage_alignment); const receipt = cursor; cursor = try added(cursor, requested.receipt_bytes); cursor = try aligned(cursor, storage_alignment); return .{ .header = 0, .slots = .{ first, second }, .visited = visited, .queue = queue, .receipt = receipt, .storage_bytes = cursor, };}fn receiptRows(requested: Limits) CapacityError!usize { return total(&.{ requested.nodes, requested.edges, requested.artifacts, requested.ranges, requested.digests, requested.provenance_parents, requested.source_records, requested.build_records, requested.authorities, requested.lineage_references, requested.service_descriptors, requested.residual_roots, requested.claims, requested.claim_nodes, 1, });}fn validate(requested: Limits) Capacity.DeriveError!void { if (requested.nodes == 0 or requested.edges == 0 or requested.artifacts == 0 or requested.ranges == 0 or requested.digests == 0 or requested.provenance_parents == 0 or requested.source_records == 0 or requested.build_records == 0 or requested.authorities == 0 or requested.lineage_references == 0 or requested.service_descriptors == 0 or requested.residual_roots == 0 or requested.claims == 0 or requested.claim_nodes == 0 or requested.receipt_bytes == 0) { return error.EmptyLimit; } if (requested.nodes > nodes_max) return error.NodeCapacityExceeded; if (requested.edges > edges_max) return error.EdgeCapacityExceeded; if (requested.artifacts > artifacts_max) { return error.ArtifactCapacityExceeded; } if (requested.ranges > ranges_max) return error.RangeCapacityExceeded; if (requested.digests > digests_max) return error.DigestCapacityExceeded; if (requested.provenance_parents > provenance_parents_max) { return error.ProvenanceParentCapacityExceeded; } if (requested.source_records > source_records_max) { return error.SourceRecordCapacityExceeded; } if (requested.build_records > build_records_max) { return error.BuildRecordCapacityExceeded; } if (requested.authorities > authorities_max) { return error.AuthorityCapacityExceeded; } if (requested.lineage_references > lineage_references_max) { return error.LineageReferenceCapacityExceeded; } if (requested.service_descriptors > service_descriptors_max) { return error.ServiceDescriptorCapacityExceeded; } if (requested.residual_roots > residual_roots_max) { return error.ResidualRootCapacityExceeded; } if (requested.claims > claims_max) return error.ClaimCapacityExceeded; if (requested.claim_nodes > claim_nodes_max) { return error.ClaimNodeCapacityExceeded; } if (requested.receipt_bytes > receipt_bytes_max) { return error.ReceiptCapacityExceeded; }}fn slotLayout( base: usize, requested: Limits,) Capacity.DeriveError!SlotLayout { var cursor = base; const header = cursor; cursor = try added(cursor, slot_header_bytes); const nodes = try start(&cursor, requested.nodes, schema.Node); const edges = try start(&cursor, requested.edges, schema.Edge); const artifacts = try start(&cursor, requested.artifacts, schema.Artifact); const ranges = try start(&cursor, requested.ranges, schema.ByteRange); const digests = try start(&cursor, requested.digests, schema.DigestRecord); const provenance_parents = try start( &cursor, requested.provenance_parents, schema.ProvenanceParent, ); const source_records = try start(&cursor, requested.source_records, schema.SourceRecord); const build_records = try start(&cursor, requested.build_records, schema.BuildRecord); const authorities = try start(&cursor, requested.authorities, schema.Authority); const lineage_references = try start( &cursor, requested.lineage_references, schema.LineageReference, ); const service_descriptors = try start( &cursor, requested.service_descriptors, schema.ServiceDescriptor, ); const residual_roots = try start(&cursor, requested.residual_roots, schema.ResidualRoot); const claims = try start(&cursor, requested.claims, schema.Claim); const claim_nodes = try start(&cursor, requested.claim_nodes, schema.ClaimNode); return .{ .base = base, .header = header, .nodes = nodes, .edges = edges, .artifacts = artifacts, .ranges = ranges, .digests = digests, .provenance_parents = provenance_parents, .source_records = source_records, .build_records = build_records, .authorities = authorities, .lineage_references = lineage_references, .service_descriptors = service_descriptors, .residual_roots = residual_roots, .claims = claims, .claim_nodes = claim_nodes, .end = try aligned(cursor, storage_alignment), };}fn start( cursor: *usize, count: usize, comptime T: type,) Capacity.DeriveError!usize { cursor.* = try aligned(cursor.*, @alignOf(T)); const offset = cursor.*; cursor.* = try segment(cursor.*, count, @sizeOf(T)); return offset;}fn segment( offset: usize, count: usize, size: usize,) Capacity.DeriveError!usize { return added(offset, try multiplied(count, size));}fn aligned( value: usize, alignment: usize,) Capacity.DeriveError!usize { const extra = alignment - 1; const sum = try added(value, extra); return sum & ~extra;}fn multiplied( left: usize, right: usize,) Capacity.DeriveError!usize { return std.math.mul(usize, left, right) catch error.CapacityArithmeticOverflow;}fn added( left: usize, right: usize,) Capacity.DeriveError!usize { return std.math.add(usize, left, right) catch error.CapacityArithmeticOverflow;}fn total(values: []const usize) CapacityError!usize { var result: usize = 0; for (values) |value| result = try added(result, value); return result;}test "maximum closure capacity derives two disjoint slots and scratch" { const capacity = try Capacity.derive(.{}); try std.testing.expectEqual( @as(usize, 1_008_874), capacity.projection_steps_max, ); try std.testing.expect( capacity.layout.slots[0].end <= capacity.layout.slots[1].base, ); try std.testing.expect( capacity.layout.slots[1].end <= capacity.layout.visited, ); try std.testing.expect( capacity.layout.receipt + capacity.receipt_bytes <= capacity.storage_bytes, ); try std.testing.expectEqual(capacity.storage_bytes, capacity.layout.storage_bytes);}test "independent closure capacities reject maximum plus one" { var requested = Limits{}; inline for (.{ .{ "nodes", error.NodeCapacityExceeded }, .{ "edges", error.EdgeCapacityExceeded }, .{ "artifacts", error.ArtifactCapacityExceeded }, .{ "ranges", error.RangeCapacityExceeded }, .{ "digests", error.DigestCapacityExceeded }, .{ "provenance_parents", error.ProvenanceParentCapacityExceeded, }, .{ "source_records", error.SourceRecordCapacityExceeded }, .{ "build_records", error.BuildRecordCapacityExceeded }, .{ "authorities", error.AuthorityCapacityExceeded }, .{ "lineage_references", error.LineageReferenceCapacityExceeded, }, .{ "service_descriptors", error.ServiceDescriptorCapacityExceeded, }, .{ "residual_roots", error.ResidualRootCapacityExceeded }, .{ "claims", error.ClaimCapacityExceeded }, .{ "claim_nodes", error.ClaimNodeCapacityExceeded }, .{ "receipt_bytes", error.ReceiptCapacityExceeded }, }) |case| { requested = .{}; @field(requested, case[0]) += 1; try std.testing.expectError(case[1], Capacity.derive(requested)); }}Source: lib/closure/src/root.zig:16
zig
pub const limits = @import("limits.zig");Audit
| Definitions | 22 |
|---|---|
| Public names | 22 |
| Members | 40 |
| Version | 26.7.0 |
| Revision | daab053ee433 |