What Is the TTL for Session Pinning Entries in WorkWeave Router?
The TTL for session pinning entries in WorkWeave Router defaults to 30 minutes, configurable via the ROUTER_SESSION_PIN_TTL environment variable.
WorkWeave Router uses session pinning to maintain consistent routing decisions for user sessions across multiple requests. Understanding the TTL for session pinning entries in WorkWeave Router is essential for tuning session persistence and ensuring stale routing data is purged efficiently. The system calculates expiration using a PinnedUntil timestamp that is set to the current time plus the configured TTL duration.
How the Session Pin TTL Is Configured
The router determines the lifespan of a session pin through the ROUTER_SESSION_PIN_TTL environment variable. When this variable is unset, the system falls back to a hardcoded default of 30 minutes (30 * time.Minute).
According to the WorkWeave Router source code, a configuration helper—typically SessionPinTTL() in internal/config/config.go—parses this environment variable and returns the appropriate time.Duration. This value is applied whenever a new pin is created or updated.
Implementation Details in the Source Code
The Pin Struct and PinnedUntil Field
At the core of the TTL mechanism is the Pin struct defined in internal/router/sessionpin/store.go (lines 55-58). This struct includes a PinnedUntil field that stores the expiration timestamp for each routing decision.
// Pin represents a session routing decision with expiration
type Pin struct {
SessionKey string
Role string
InstallationID string
Provider string
Model string
PinnedUntil time.Time // Expiration timestamp
}
When the router pins a session to a specific provider or model, it calculates PinnedUntil as the current time plus the configured TTL.
PostgreSQL Store Implementation
The concrete implementation in internal/postgres/session_pin_repo.go handles the persistence logic. In the Upsert method (lines 78-85), the repository reads the TTL from the configuration and sets the PinnedUntil field accordingly:
// Upsert creates or updates a session pin with TTL
func (r *SessionPinRepo) Upsert(ctx context.Context, pin sessionpin.Pin) error {
pin.PinnedUntil = time.Now().Add(r.config.SessionPinTTL())
// ... SQL INSERT/UPDATE logic ...
}
This ensures every pinned session receives the same TTL duration from the moment it is written to the database.
Expired Pin Cleanup
The Store interface defines a SweepExpired method (lines 37-38 in internal/router/sessionpin/store.go) that the background janitor invokes periodically. This method removes rows where PinnedUntil is in the past, guaranteeing that stale routing decisions do not accumulate in PostgreSQL.
Practical Configuration Examples
To use the default 30-minute TTL, no additional configuration is required. The router automatically applies this duration when creating pins:
// Using the default 30-minute TTL
pin := sessionpin.Pin{
SessionKey: sessionKey,
Role: sessionpin.DefaultRole,
InstallationID: installationID,
Provider: provider,
Model: model,
PinnedUntil: time.Now().Add(config.SessionPinTTL()), // 30 minutes
}
if err := store.Upsert(ctx, pin); err != nil {
log.Error("failed to upsert session pin", "err", err)
}
To override the default, export the environment variable before starting the router:
# Set TTL to 1 hour
export ROUTER_SESSION_PIN_TTL=1h
# Start the router
./router
With this configuration, all new session pins will expire after one hour instead of 30 minutes.
Summary
- The default TTL for session pinning entries in WorkWeave Router is 30 minutes.
- Override the default by setting the
ROUTER_SESSION_PIN_TTLenvironment variable to any valid Go duration string. - The
Pinstruct ininternal/router/sessionpin/store.gotracks expiration via thePinnedUntilfield. - The PostgreSQL repository in
internal/postgres/session_pin_repo.goapplies the TTL during the upsert operation. - The
SweepExpiredmethod periodically removes stale pins based on thePinnedUntiltimestamp.
Frequently Asked Questions
What is the default session pinning TTL in WorkWeave Router?
The default TTL is 30 minutes. This value is hardcoded as 30 * time.Minute and applies when the ROUTER_SESSION_PIN_TTL environment variable is not configured.
How do I change the session pinning TTL?
Set the ROUTER_SESSION_PIN_TTL environment variable to your desired duration (e.g., 1h, 30m, 2h30m) before starting the router. The configuration parser accepts any valid Go duration string.
How does WorkWeave Router handle expired session pins?
The router runs a background cleanup process that invokes the SweepExpired method defined in internal/router/sessionpin/store.go. This method queries for pins where PinnedUntil is in the past and deletes them from the PostgreSQL store.
What happens if ROUTER_SESSION_PIN_TTL is set to an invalid value?
If the environment variable contains an invalid duration string, the configuration helper will typically fail during startup or fall back to the default 30-minute TTL, depending on the specific error handling implemented in the config package. Always use valid Go duration formats like 30m or 1h30m.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →