tailscale/tailscale · error

set profile failed: %w

Error message

set profile failed: %w

What it means

Raised by startNewLogger when binding the new audit logger to the current profile ID fails. It wraps the SetProfileID error; the logger cannot persist entries without a profile.

Source

Thrown at ipn/auditlog/extension.go:99

		return nil, fmt.Errorf("%T cannot be used as transport", cc)
	}

	// Create a new log store if this is the first logger.
	// Otherwise, get the existing log store.
	store, err := e.store.GetErr(func() (LogStore, error) {
		return newDefaultLogStore(e.logf)
	})
	if err != nil {
		return nil, fmt.Errorf("failed to create audit log store: %w", err)
	}

	logger := NewLogger(Opts{
		Logf:       e.logf,
		RetryLimit: 32,
		Store:      store,
	})
	if err := logger.SetProfileID(profileID); err != nil {
		return nil, fmt.Errorf("set profile failed: %w", err)
	}
	if err := logger.Start(transport); err != nil {
		return nil, fmt.Errorf("start failed: %w", err)
	}
	return logger, nil
}

func (e *extension) controlClientChanged(cc controlclient.Client, profile ipn.LoginProfileView) (cleanup func()) {
	logger, err := e.startNewLogger(cc, profile.ID())
	e.mu.Lock()
	e.logger = logger // nil on error
	e.mu.Unlock()
	if err != nil {
		// If we fail to create or start the logger, log the error
		// and return a nil cleanup function. There's nothing more
		// we can do here.
		//
		// But [extension.getCurrentLogger] returns [noCurrentLogger]

View on GitHub (pinned to 6e0912f979)

Solutions

  1. Create a fresh logger per profile rather than reusing one.
  2. Check the store for corruption.
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at ipn/auditlog/extension.go:99 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18). Data as JSON: /api/errors/beb6dd36029989bd. Report an issue: GitHub.