Overview
Thecloudstic break-lock command forcibly removes lock files from a Cloudstic repository. Locks are automatically acquired by operations like backup, restore, and prune to prevent concurrent writes that could corrupt the repository.
When to Use
Usebreak-lock when:
- A Cloudstic process was killed (SIGKILL, crash, system reboot) and left a stale lock
- You receive an error like:
repository is locked by another operation - You have verified that no other Cloudstic process is running (check with
ps,htop, or your process manager)
Basic Usage
Terminal Output Examples
Stale Lock Removed
No Lock Found
Multiple Locks Removed
Command Flags
break-lock has no command-specific flags. It uses global flags for repository access.
Global Flags
Storage backend URI. Formats:
local:<path>, s3:<bucket>[/<prefix>], b2:<bucket>[/<prefix>], sftp://[user@]host[:port]/<path>.Platform key (64 hex chars = 32 bytes) for encrypted repositories.
Repository password for encrypted repositories.
24-word BIP39 recovery phrase.
AWS KMS key ARN for KMS-encrypted repositories.
Prompt for password interactively (use alongside
-encryption-key or -kms-key-arn to add a password layer).Log detailed operations.
Suppress output (not recommended for this command).
Write the command result as JSON to stdout. This suppresses the human-readable lock summary.
Log every store request (network calls, timing, sizes).
S3-Specific Flags
S3-compatible endpoint (MinIO, R2, etc.).
S3 region.
S3 access key ID.
S3 secret access key.
SFTP Store Credentials
SFTP store password.
Path to SSH private key for SFTP store authentication.
Path to custom
known_hosts file for host key validation.Skip host key validation (INSECURE).
Examples
Local Repository
Remote S3 Repository
SFTP Repository
With Debug Logging
How Locks Work
Lock Types
Cloudstic uses a reader-writer lock protocol stored directly in the repository:| Type | Key | Operations |
|---|---|---|
| Shared | index/lock.shared/<timestamp> | backup, restore; multiple can coexist |
| Exclusive | index/lock.exclusive | prune; blocks all shared locks |
forget acquires no lock. check acquires no lock.
Lock Acquisition
When an operation starts, it:- Checks for conflicts: shared ops check for an exclusive lock; exclusive ops check for any shared or exclusive lock
- Writes its lock object: JSON metadata stored at the key above
- Re-reads to verify ownership: mitigates TOCTOU races on stores without atomic writes
- Starts a refresh goroutine: extends
expires_atevery 30 seconds
Lock Expiration
- TTL: 1 minute from acquisition, refreshed every 30 seconds while the process is alive
- On crash: The refresh goroutine stops; the lock expires after at most 1 minute
- Automatic recovery: The next operation sees an expired
expires_atand proceeds normally: no manual intervention required
Lock Storage
Locks are stored as JSON objects in the repository underindex/:
- Exclusive key:
index/lock.exclusive - Shared key:
index/lock.shared/<timestamp> - Content: JSON metadata (operation, holder, acquired_at, expires_at, is_shared)
- Unencrypted: Lock objects are stored in plaintext for debuggability
Understanding Lock Information
Operation
The Cloudstic command that held the lock:backup: Backup operation (shared lock)restore: Restore operation (shared lock)prune: Prune operation (exclusive lock)
Holder
Unique identifier for the process that acquired the lock:- hostname: Machine hostname
- pid: Process ID (PID)
Acquired / Expired At
- Acquired: When the lock was first created
- Expired at: When the lock would automatically become invalid
Shared
- true: Shared lock (
backuporrestore): multiple can coexist - false: Exclusive lock (
prune): blocks all other operations
Safety Considerations
How to Verify No Active Processes
Linux/macOS
Windows
Systemd/Cron
Check if Cloudstic is running as a scheduled task:When It’s Safe to Break a Lock
✅ Safe scenarios:- Process was killed (SIGKILL, crash, reboot)
- Lock expiration time has passed
- You confirmed no active Cloudstic processes
- Lock holder hostname is a decommissioned machine
- Active backup is in progress on another machine
- Scheduled backup might be running (check cron/systemd)
- Uncertain about process status
Troubleshooting
Error: Failed to init store
-store URI and credentials (e.g., -s3-access-key).
Error: Failed to break lock
- Check storage backend permissions (S3 IAM policy, SFTP file permissions)
- Verify you have write access to the repository
Lock reappears immediately after breaking
Cause: Another process is actively creating locks (e.g., running backup). Resolution:- Find and stop the active process
- Wait for the lock to expire naturally (check “Expired at” time)
- Do not repeatedly break locks: this indicates an underlying issue
Repository is corrupted after breaking lock
Cause: Lock was broken while another process was writing. Resolution:- Run
cloudstic checkto assess damage - If errors found, restore from an earlier snapshot or backup
- In the future, always verify no processes are running before breaking locks
Use Cases
Crashed Backup Job
Remote Repository Lock After Server Reboot
CI/CD Pipeline Failure
Exit Codes
- 0: Success (lock removed or no lock found)
- 1: Error (store initialization failed, permission denied, or command error)
Related Commands
- cloudstic backup: Acquires a shared lock
- cloudstic restore: Acquires a shared lock
- cloudstic prune: Acquires an exclusive lock; blocks backup and restore