stellar/stellar-core · Archived

subsystem-summary-of-util

read this skill for a token-efficient summary of the util subsystem

First seen Apr 29, 2026

Installation

$ npx skills add stellar/stellar-core --skill subsystem-summary-of-util

Stronger alternatives

This repository is archived — consider an actively maintained alternative.

Also in this package

Other skills from stellar/stellar-core · top by installs.

npx skills add stellar/stellar-core

Browse all from stellar/stellar-core

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 3.3K
License LICENSE-APACHE.txt
Default branch master
Open issues 257
Status Archived

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 19,758 B
  • docs SUMMARY.md 100 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 2 installs

SKILL.md

Util Subsystem — Technical Summary

The src/util/ directory provides foundational infrastructure used across all of stellar-core. It covers timing, scheduling, logging, numeric safety, filesystem operations, serialization, data structures, threading, and various small helpers.


1. Virtual Clock & Timers (Timer.h, Timer.cpp)

VirtualClock

Central timing facility with two modes: REALTIME (wall clock) and VIRTUALTIME (simulated, for tests). Owns an asio::io_context for IO dispatch and a Scheduler for main-thread action scheduling.

  • Key types: timepoint (steady clock), systemtime_point (wall/calendar time), duration.
  • crank(bool block): The main event-loop step. Dispatches pending timers, polls IO (with exponential priority biasing under overload), runs scheduled actions, and transfers items from the thread-safe pending queue to the scheduler. In VIRTUAL_TIME mode, advances time to the next event if idle.
  • postAction(): Thread-safe submission point for deferred work callbacks. Uses a mutex-protected pending queue; wakes the main thread via asio::post when enqueueing into an empty queue.
  • setCurrentVirtualTime(): Advance virtual time forward (monotonic; asserts forward progress).
  • sleepfor(): Real sleep in REALTIME, virtual time advance in VIRTUAL_TIME.
  • shouldYield(): In REALTIME, returns true after 500ms has elapsed (time-slice limit). Always returns true in VIRTUALTIME.
  • Time conversion helpers: totimet, fromtimet, systemPointToTm, tmToSystemPoint, isoStringToTm, tmToISOString, systemPointToISOString.

VirtualTimer

Timer coupled to a VirtualClock that uses virtual time. Supports expiresat(), expiresfromnow(), asyncwait(), cancel(). Typical usage for all delayed / periodic operations in core.

VirtualClockEvent

Internal event representation stored in the clock's priority queue. Carries a callback, trigger time, sequence number, and cancelled state.


2. Scheduler (Scheduler.h, Scheduler.cpp)

A multi-queue fair scheduler implementing a variant of the LAS (Least Attained Service) / FB (Foreground-Background) algorithm.

Design

  • Multiple named ActionQueues each track cumulative runtime (mTotalService).
  • On each runOne(), the queue with the lowest accumulated service time runs its next action.
  • A latency window (default 5s) serves three roles: (1) credit cap to prevent bursty monopolization, (2) overload detection threshold, (3) idle queue expiration.
  • Droppable actions are shed under overload (queue time exceeds latency window).

ActionQueue (private inner class)

  • Stores a deque of Element{Action, enqueueTime}.
  • Tracks mTotalService, mLastService, idle list membership.
  • tryTrim(): drops droppable actions that exceed the latency window.
  • runNext(): runs the front action and updates total service (floored at minTotalService).

Scheduler public interface

  • enqueue(name, action, type): Creates or reactivates a queue and appends the action.
  • runOne(): Dequeues from the lowest-service queue, trims stale idle queues.
  • getOverloadedDuration(): Reports how long any queue has been overloaded.
  • currentActionType(): Returns the ActionType of the currently executing action.
  • shutdown(): Clears all queues.

3. Logging (Logging.h, Logging.cpp, SpdlogTweaks.h, LogPartitions.def)

Logging class

Static utility managing spdlog-based logging with partitioned loggers.

  • Partitions: Defined in LogPartitions.def via X-macro (LOG_PARTITION(name)), yielding ~15 named partitions (e.g., Bucket, Herder, Ledger, Overlay, Tx, etc.). Each partition has its own spdlog logger with independent log level.
  • init(): Creates sinks (stderr + optional file), registers all partition loggers, configures flush behavior (every 1s, immediate on error). Also initializes Rust-side logging.
  • setLogLevel(level, partition): Per-partition or global level setting.
  • setLoggingToFile(filename): Supports {datetime}-formatted filenames. Opens in append mode (O_APPEND) for durability with external log rotation.
  • setFmt(peerID): Sets the log pattern including a peer identifier.
  • rotate(): Log rotation support.

Log macros

  • CLOGTRACE/DEBUG/INFO/WARNING/ERROR/FATAL(partition, fmt, ...): Partition-aware logging with compile-time format string checking via FMTSTRING.
  • LOG_TRACE/DEBUG/INFO/WARNING/ERROR/FATAL(logger, fmt, ...): Logger-handle-based logging.
  • LOGCHECK: Guards log calls with shouldlog() check to avoid formatting overhead.

CoutLogger

Fallback logger when spdlog is not available. Writes to std::cout.

LogLevel enum

LVLFATAL(0) through LVLTRACE(5).

format_as overloads

Provides fmt-compatible formatting for XDR enum types and std::filesystem::path.


4. Numeric Utilities (numeric.h, numeric.cpp, numeric128.h)

Safe arithmetic for financial calculations where overflow matters.

64-bit operations (numeric.h)

  • bigDivide(result, A, B, C, rounding): Computes AB/C safely when AB would overflow int64_t. Returns success/failure bool.
  • bigDivideOrThrow(A, B, C, rounding): Throwing variant.
  • bigDivideUnsigned(): Unsigned variant.
  • bigSquareRoot(a, b): Integer square root of a*b, ROUND_DOWN only.
  • saturatingMultiply(a, b): Caps at INT64_MAX on overflow (non-negative inputs).
  • saturatingAdd(a, b): Unsigned, caps at type max.
  • isRepresentableAsInt64(double): Checks safe double→int64 conversion.
  • doubleToClampedUint32(double): Clamps double to uint32 range.
  • Rounding enum: ROUNDDOWN, ROUNDUP.

128-bit operations (numeric128.h)

  • bigMultiply(a, b) / bigMultiplyUnsigned(a, b): Returns uint128_t.
  • bigDivide128() / bigDivideUnsigned128(): Divide 128-bit by 64-bit.
  • hugeDivide(result, a, B, C, rounding): Computes aB/C when C < INT32MAX INT64MAX.

5. Filesystem Utilities (Fs.h, Fs.cpp, FileSystemException.h, TmpDir.h)

fs namespace

  • File locking: lockFile() / unlockFile() using flock (POSIX) or CreateFile (Win32).
  • Durable I/O: flushFileChanges() (fsync), durableRename() (rename + dir fsync), openFileToWrite().
  • Directory ops: exists(), deltree(), mkdir(), mkpath() (recursive), findfiles().
  • Path construction: hexStr(), hexDir(), baseName(), remoteName(), remoteDir() — used for history archive paths.
  • Handle counting: getMaxHandles(), getOpenHandleCount() — Linux reads /proc/self/fd.
  • bufsz(): Returns 256KB (AWS EBS IOP alignment).

FileSystemException

Extends std::runtime_error with failWith() and failWithErrno() static helpers that log before throwing.

TmpDir / TmpDirManager

RAII temporary directory management. TmpDirManager creates and cleans a root directory; TmpDir creates prefixed subdirectories that are deleted on destruction.


6. XDR Stream I/O (XDRStream.h)

XDRInputFileStream

Reads XDR-framed objects from a file one at a time.

  • readOne(T& out, SHA256* hasher): Reads 4-byte big-endian size header, then that many bytes, unmarshals into out. Optional hash accumulation.
  • readPage(T& out, key, pageSize): Reads a page-sized chunk and scans for a specific LedgerKey. Used for indexed bucket lookups.
  • Supports seek(), pos(), size limits.

OutputFileStream

Low-level durable write stream using ASIO buffered writes (POSIX) or FILE* (Win32).

  • writeBytes(), flush(), close() with optional fsync on close.
  • Cross-platform via fs::streamt / fs::nativehandle_t.

XDROutputFileStream

Extends OutputFileStream with XDR framing.

  • writeOne(T, hasher, bytesPut): Encodes 4-byte size header + XDR payload. Optional hash and byte counting.
  • durableWriteOne(): writeOne + flush + fsync for crash safety.

7. Data Structures

RandomEvictionCache<K, V> (RandomEvictionCache.h)

Fixed-size cache with random-2-choices eviction (not LRU). More robust under pathological access patterns.

  • Stores entries in unordered_map with stable pointers in a vector for random access.
  • Tracks generation counter for last-access ordering.
  • put(), get(), maybeGet(), exists(), erase_if(), clear().
  • Maintains hit/miss/insert/update/evict counters.

BitSet (BitSet.h)

Value-semantic C++ wrapper around a C bitset (cbitset.h). Uses inline storage for small sets (≤64 bits) to avoid heap allocation.

  • Full set operations: union (|), intersection (&), difference (-), symmetric difference.
  • Counting variants: unionCount(), intersectionCount(), etc.
  • Iteration: nextSet(i) for scanning set bits.
  • Hash function support via BitSet::HashFunction.

UnorderedMap<K, V> / UnorderedSet<K> (UnorderedMap.h, UnorderedSet.h)

Type aliases for std::unorderedmap / std::unorderedset using RandHasher to prevent hash-flooding attacks.

BinaryFuseFilter<T> (BinaryFuseFilter.h, BinaryFuseFilter.cpp)

Probabilistic membership-test filter (like Bloom filter but more space-efficient). Wraps binaryfuset library. Supports 8/16/32-bit widths with corresponding false-positive rates (1/256, 1/65536, 1/4B). Serializable via cereal to SerializedBinaryFuseFilter XDR type. Used for efficient key-membership checks in bucket indexes.

TarjanSCCCalculator (TarjanSCCCalculator.h)

Tarjan's algorithm for computing strongly connected components of a directed graph. Uses BitSet for SCC representation. Used in quorum analysis (SCP).


8. Threading Utilities

ThreadAnnotations.h

Comprehensive Clang thread-safety annotation macros (GUARDEDBY, REQUIRES, ACQUIRE, RELEASE, TRYACQUIRE, etc.). Provides annotated mutex wrappers:

  • Mutex: Wraps std::mutex with annotations.
  • SharedMutex: Wraps std::shared_mutex with Lock()/LockShared().
  • RecursiveMutex: Wraps std::recursive_mutex.
  • MutexLocker / RecursiveMutexLocker / SharedLockExclusive / SharedLockShared: RAII lock guards with annotations.

GlobalChecks.h / GlobalChecks.cpp

  • threadIsMain(): Checks if current thread is the main thread (captured at static init).
  • releaseAssert(e): Assert that is NOT compiled out by NDEBUG. Prints backtrace and aborts.
  • releaseAssertOrThrow(e): Like releaseAssert but throws runtime_error instead of aborting.
  • dbgAssert(e): Debug-only assert.
  • LockGuard / RecursiveLockGuard: Aliases that adapt between Tracy-instrumented and plain lock guards.

Thread.h / Thread.cpp

  • runCurrentThreadWithLowPriority() / runCurrentThreadWithMediumPriority(): OS-level thread priority adjustment.
  • futureIsReady(std::future|std::shared_future): Non-blocking readiness check.

JitterInjection.h / JitterInjection.cpp

Testing framework for probabilistic thread-delay injection (enabled via BUILDTHREADJITTER).

  • JitterInjector::injectDelay(probability, minUsec, maxUsec): Probabilistically sleeps to expose race conditions.
  • JITTERINJECTDELAY(), JITTER_YIELD() macros: Compile to no-ops in production.
  • Reproducible via seeded RNG tied to test seed.

NonCopyable.h

Base structs: NonCopyable, NonMovable, NonMovableOrCopyable — disable copy/move semantics via deleted special members.


9. Metrics & Performance Monitoring

MetricsRegistry (MetricsRegistry.h, MetricsRegistry.cpp)

Extends medida::MetricsRegistry with SimpleTimer support. NewSimpleTimer() registers lightweight timers. syncSimpleTimerStats() syncs max values (called on /metrics endpoint).

SimpleTimer / SimpleTimerContext (SimpleTimer.h, SimpleTimer.cpp)

Lightweight replacement for medida::Timer using counters (sum, count, max). Avoids histogram overhead. Uses medida::Counter internally for metric export. TimeScope() returns an RAII context for automatic timing.

MetricResetter (MetricResetter.h, MetricResetter.cpp)

Implements medida::MetricProcessor to reset all metric types (Counter, Meter, Histogram, Timer, Buckets).

LogSlowExecution (LogSlowExecution.h, LogSlowExecution.cpp)

RAII guard that logs a warning if a scope takes longer than a threshold (default 1 second). Two modes:

  • AUTOMATIC_RAII: Logs on destructor.
  • MANUAL: Caller checks checkElapsedTime().
  • RateLimitedLog: Subclass with zero threshold for rate-limited logging.

10. Type Utilities (types.h, types.cpp)

Core type definitions and helpers for XDR/Stellar types.

  • Blob: std::vector<unsigned char>.
  • LedgerKeySet: std::set<LedgerKey, LedgerEntryIdCmp>.
  • LedgerEntryKey(LedgerEntry): Extracts the key from an entry.
  • Asset helpers: assetToString(), getIssuer(), isIssuer(), assetCodeToStr(), strToAssetCode(), isAssetValid(), compareAsset().
  • getBucketLedgerKey(): Extracts LedgerKey from BucketEntry or HotArchiveBucketEntry.
  • addBalance(balance, delta, max): Safe balance addition with overflow check.
  • isZero(uint256), lessThanXored(): Hash/XOR comparison helpers.
  • unsignedToSigned(): Safe conversion with overflow check.
  • formatSize(): Human-readable size formatting.
  • iequals(): Case-insensitive string comparison.
  • Price comparison operators: >=, >, ==.
  • ASCII helpers: isAsciiAlphaNumeric(), isAsciiNonControl(), toAsciiLower() — locale-independent.
  • roundDown(v, m): Round down to largest multiple of power-of-2.

11. Resource Tracking (TxResource.h, TxResource.cpp)

Resource

Multi-dimensional resource vector for transaction resource accounting (operations, instructions, byte sizes, ledger entries). Supports:

  • 1-element (classic), 2-element (classic with bytes), or 7-element (Soroban) resource tuples.
  • Arithmetic: +=, -=, +, -, with overflow-safe bigDivideOrThrow.
  • Comparisons: <=, ==, >, anyLessThan(), anyGreater().
  • subtractNonNegative(), limitTo(), saturatedMultiplyByDouble().
  • Resource::Type enum: OPERATIONS, INSTRUCTIONS, TXBYTESIZE, DISKREADBYTES, WRITEBYTES, READLEDGERENTRIES, WRITELEDGER_ENTRIES.

12. XDR Query Engine (xdrquery/)

A mini query language for filtering XDR objects by field values.

Components

  • XDRFieldResolver.h: Template-based XDR field traversal using xdr_traits. Resolves dotted field paths (e.g., "data.account.balance") to values. Handles unions, enums, public keys (string representation), opaque arrays (hex).
  • XDRQueryEval.h: Expression evaluation engine. EvalNode hierarchy: LiteralNode, ColumnNode, BoolOpNode (AND/OR/NOT), ComparisonOpNode (==, !=, <, >, <=, >=). DynamicXDRGetter interface for runtime field access.
  • XDRQuery.h: TypedDynamicXDRGetterResolver<T> connects XDR types to the query engine. matchXDRQuery() function parses and evaluates queries against XDR objects.
  • XDRQueryError.h: Exception type for query parsing/evaluation errors.

13. Serialization Helpers

XDRCereal.h / XDRCereal.cpp

Custom cereal_override functions for human-readable JSON serialization of XDR types. Overrides for: public keys (StrKey), assets (code+issuer), enums (string names), opaque data (hex), optional pointers (null handling), SCAddress, MuxedAccount, ConfigUpgradeSetKey.

  • xdrToCerealString(t, name, compact): Serialize any XDR type to JSON string.

BufferedAsioCerealOutputArchive.h

Custom cereal output archive that writes through OutputFileStream (supporting fsync) instead of std::ofstream.

XDROperators.h

Imports xdr::operator== and xdr::operator< into the stellar namespace.


14. Hashing Utilities

RandHasher<T> (RandHasher.h)

Hash functor that XORs the output of std::hash<T> with a random mixer value (initialized once at startup). Prevents hash-flooding DoS attacks on hash tables.

HashOfHash (HashOfHash.h, HashOfHash.cpp)

Specialization of std::hash<stellar::uint256> for use in hash maps keyed by transaction/ledger hashes.


15. Protocol Version Utilities (ProtocolVersion.h, ProtocolVersion.cpp)

ProtocolVersion enum

Enumerates all protocol versions V0 through V26.

Comparison functions

  • protocolVersionIsBefore(version, beforeVersion): Strictly less than.
  • protocolVersionStartsFrom(version, fromVersion): Greater than or equal.
  • protocolVersionEquals(version, equalsVersion): Exact match.

Notable constants

  • SOROBANPROTOCOLVERSION = V_20
  • PARALLELSOROBANPHASEPROTOCOLVERSION = V_23
  • AUTORESTOREPROTOCOLVERSION = V23

16. Other Utilities

StatusManager (StatusManager.h)

Manages status messages by category (HISTORYCATCHUP, HISTORYPUBLISH, NTP, REQUIRES_UPGRADES). Used for the /info JSON endpoint.

SecretValue (SecretValue.h)

Wrapper around std::string to prevent accidental logging of sensitive values (DB passwords, secret keys).

Decoder.h

Base32/Base64 encoding and decoding helpers (encodeb32, encodeb64, decodeb32, decodeb64).

Math.h / Math.cpp

Random number utilities: randfraction(), randflip(), randuniform(), randelement(), kmeans(), closestcluster(), exponentialBackoff(). initializeAllGlobalState() initializes all PRNG and hash seeds. reinitializeAllGlobalStateWithSeed() (test-only) resets for reproducibility.

MetaUtils.h / MetaUtils.cpp

normalizeMeta(): Sorts order-agnostic fields in TransactionMeta / LedgerCloseMeta for deterministic comparison/hashing.

DebugMetaUtils.h / DebugMetaUtils.cpp

Manages debug meta-data files (XDR segments of ledger metadata). Handles file naming, path construction, listing, and cleanup based on configurable segment sizes (256 ledgers).

Backtrace.h / Backtrace.cpp

printCurrentBacktrace(): Prints stack trace via the Rust bridge.

must_use.h

MUSTUSE macro: Maps to attribute((warnunused_result)) where supported.

Algorithm.h

split() function template: Splits a vector into a map of vectors keyed by an extractor function.

asio.h

Correctly configures and includes ASIO headers with proper preprocessor definitions (ASIOSEPARATECOMPILATION, ASIO_STANDALONE). Must be included before other system headers.

TcmallocConfig.cpp

Tcmalloc configuration (if tcmalloc is the allocator).


Key Data Flows

  1. Main event loop: VirtualClock::crank() → dispatches timers → polls ASIO IO → runs Scheduler::runOne() → transfers pending actions from thread-safe queue to scheduler.
  1. Cross-thread work submission: Any thread → VirtualClock::postAction() (mutex-protected queue) → main thread dequeues into Scheduler → fair-scheduled execution.
  1. XDR file I/O: Write path: XDROutputFileStream::writeOne() → 4-byte size header + XDR marshal → buffered write → optional fsync. Read path: XDRInputFileStream::readOne() → read size header → read payload → XDR unmarshal.
  1. Metrics flow: Code uses medida::Timer/SimpleTimer → MetricsRegistry collects → syncSimpleTimerStats() synchronizes max tracking → exported via /metrics endpoint.
  1. Resource accounting: Resource vectors created per-transaction → arithmetic operations check against ledger limits → anyGreater()/<= comparisons for admission control.