Skip to documentation
SLOP

tiny.closure.limits

Reference tiny.closure limits

Defined in tiny.closure.

API (23)

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callstiny.closurelimits
Static calls · unresolved targets: unknown · external targets: unknown.

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

Definitions22
Public names22
Members40
Version26.7.0
Revisiondaab053ee433