Skip to content

Licensing

Every flexBlock volume is served under a license grant: a small JSON file signed by Paradigm4. The grant is both the volume’s address and its license. To obtain or renew a grant, contact info@paradigm4.com.

Every command that reaches object storage reads the grant file, by default /etc/flexblock/grant.json. The grant names the object storage provider, bucket, prefix, endpoint, region and path style, so no flexblock command takes those as flags: the grant is the volume’s address. It also carries the licensed maximum device size, issue and expiry dates, a grace period, and the bandwidth the daemon falls back to after the grace period.

The grant contains no secrets. It identifies the volume and the terms under which it may be served, and it does not contain object-storage credentials. See Credentials for how flexBlock authenticates.

Grants are ECDSA P-256 signatures over a canonical form of the JSON, and flexblock trusts only the public keys compiled into it. The signature covers every field, so a grant cannot be edited; any change needs a new grant from Paradigm4.

Optional fields may be left out.

FieldMeaning
formatThe grant format version, currently 1.
license_id, customerWho the grant is for. The license id also appears in show and the start banner.
issued_at, expires_atThe validity window, as UTC timestamps. A grant is Pending until an hour before issued_at.
graceOptional. How long after expires_at the volume runs unthrottled, for example 7d. Absent means none.
obj_providers3, gcs, blob or oci.
obj_bucket, obj_prefixWhere the volume lives. Together they are the volume’s address.
obj_region, obj_endpointOptional. The region, and a custom endpoint for an S3-compatible store or an emulator.
s3_force_path_styleOptional, S3 only. Path-style addressing, which some S3-compatible stores need.
blob_account, oci_namespaceThe storage account for blob and the namespace for oci; required for those providers.
device_sizeThe largest device the grant covers, for example 1T.
throttled_read, throttled_writeOptional. Bandwidth while throttled (Expired, Pending or Uncovered); defaults 64 MiB/s and 16 MiB/s.
key_id, signatureThe Paradigm4 signing key and the ECDSA P-256 signature over the other fields.

A trimmed example:

{
"format": 1,
"license_id": "ACME-0001",
"customer": "Acme Corp",
"issued_at": "2026-09-01T00:00:00Z",
"expires_at": "2027-09-01T00:00:00Z",
"obj_provider": "s3",
"obj_bucket": "acme-data",
"obj_prefix": "flexblock/acme-0001",
...
"signature": "..."
}

Because the grant names the bucket and prefix, each grant covers exactly one volume. Every flexblock command on every host that will serve the volume needs a copy of that volume’s grant.

A host that serves several volumes keeps several grant files and passes the global --grant-file flag to choose between them:

Terminal window
sudo flexblock --grant-file /etc/flexblock/analytics.json show --remote

The systemd template in Running Under systemd shows one way to organize this.

The daemon evaluates the grant at start and re-reads the file every minute. The state appears in the start banner, in the flexblock_license_state metric, and as a daily log notice in the last seven days before expiry.

StateMeaning and effect
ValidBetween the issue and expiry dates. Full speed; a daily notice starts seven days before expiry.
GraceExpired, but within the grace period the grant carries. Warnings only; nothing degrades.
Expired, PendingPast the grace period, or more than an hour before the issue date. Guest reads and writes are throttled to the grant’s rates (defaults 64 MiB/s read and 16 MiB/s write, never below 1 MiB/s) so data can still be evacuated. init and update --device-size refuse. attach, start, detach and wipe still work.
UncoveredThe device is larger than the licensed size, or a grant installed under a running daemon names another location. Throttled like Expired. start, attach and show <device> report an oversize volume without refusing; start refuses a location mismatch (exit code 9).

A sudden drop in throughput to a fixed ceiling usually means the license has expired past its grace period, or does not cover the volume. Check flexblock_license_state, or the license section of show <device>. See Alerting for the license alerts worth setting up.

Paradigm4 issues a new grant for the same bucket and prefix. Installing it is a file copy: the daemon picks it up within a minute, without a restart or unmount, and the license metrics show the new expiry once the grant is in force.

Terminal window
sudo install -m 0644 grant-renewed.json /etc/flexblock/grant.json
curl -s localhost:10056/metrics | grep ^flexblock_license_

The curl check needs a daemon started with --metrics-port 10056. Without a metrics endpoint, sudo flexblock show <device> prints the license state instead.

  • Future-dated renewals. A renewal dated to take effect later is held back while the current grant is still valid or in grace, and adopted when it takes effect. The held grant lives only in memory, so any restart in that window, including crash recovery or a reboot, serves throttled until the renewal takes effect. Install a future-dated renewal close to its start date.
  • Clock tolerance. A grant issued up to an hour ahead of this host’s clock counts as in force.
  • Bad copies. If the new file cannot be read or fails verification, the daemon keeps the last good grant and sets flexblock_license_reload_failed to 1, so a bad copy never interrupts service.
  • Checking a grant offline. start --dry-run prints the banner with its license section, which confirms a grant on a host that is not serving.
  • Install: installing the grant.
  • Growing a Volume: growth is bounded by the grant’s licensed size.
  • Alerting: flexblock_license_state and flexblock_license_expires_at_seconds.