wavetermdev/waveterm · error

error updating %q meta: %w

Error message

error updating %q meta: %w

What it means

UpdateObjectMeta wraps failures from wstore.UpdateObjectMeta with 'error updating %q meta: %w'. The oref parsed but applying the meta map to the stored object failed — e.g. the target object does not exist, the object rejects the meta keys, or the DB write failed. The failing oref string is embedded in the message.

Source

Thrown at pkg/service/objectservice/objectservice.go:131

}

func (svc *ObjectService) UpdateObjectMeta_Meta() tsgenmeta.MethodMeta {
	return tsgenmeta.MethodMeta{
		ArgNames: []string{"uiContext", "oref", "meta"},
	}
}

func (svc *ObjectService) UpdateObjectMeta(uiContext waveobj.UIContext, orefStr string, meta waveobj.MetaMapType) (waveobj.UpdatesRtnType, error) {
	ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout)
	defer cancelFn()
	ctx = waveobj.ContextWithUpdates(ctx)
	oref, err := parseORef(orefStr)
	if err != nil {
		return nil, fmt.Errorf("error parsing object reference: %w", err)
	}
	err = wstore.UpdateObjectMeta(ctx, *oref, meta, false)
	if err != nil {
		return nil, fmt.Errorf("error updating %q meta: %w", orefStr, err)
	}
	return waveobj.ContextGetUpdatesRtn(ctx), nil
}

func (svc *ObjectService) UpdateObject_Meta() tsgenmeta.MethodMeta {
	return tsgenmeta.MethodMeta{
		ArgNames: []string{"uiContext", "waveObj", "returnUpdates"},
	}
}

func (svc *ObjectService) UpdateObject(uiContext waveobj.UIContext, waveObj waveobj.WaveObj, returnUpdates bool) (waveobj.UpdatesRtnType, error) {
	ctx, cancelFn := context.WithTimeout(context.Background(), DefaultTimeout)
	defer cancelFn()
	ctx = waveobj.ContextWithUpdates(ctx)
	if waveObj == nil {
		return nil, fmt.Errorf("update wavobj is nil")
	}
	oref := waveobj.ORefFromWaveObj(waveObj)

View on GitHub (pinned to a4447c1563)

Solutions

  1. Check the wrapped error: 'key not found' means the object is gone — re-resolve the oref from live state
  2. Verify meta keys/values are accepted by the current schema (check for renames after upgrades)
  3. Retry after resolving DB write conditions (disk, permissions, locks)

Example fix

// before
_, err := svc.UpdateObjectMeta(uiContext, orefStr, meta)
// after
if _, err := svc.UpdateObjectMeta(uiContext, orefStr, meta); err != nil && strings.Contains(err.Error(), "key not found") {
    orefStr = resolveLiveOref(ctx) // object moved/deleted; refresh then retry
    _, err = svc.UpdateObjectMeta(uiContext, orefStr, meta)
}
Defensive patterns

Strategy: retry

Validate before calling

// verify object still exists before meta update
if _, err := svc.GetObject(ctx, orefStr); err != nil { return fmt.Errorf("object gone: %w", err) }

Try / catch

err := retry(3, func() error {
    _, err := svc.UpdateObjectMeta(uiContext, orefStr, meta)
    if err != nil && strings.Contains(err.Error(), "key not found") { return errStop }
    return err
})

Prevention

When it happens

Trigger: Calling UpdateObjectMeta with a valid-format oref for a deleted object, with invalid/unknown meta keys, or when the wstore write fails (permissions/disk/lock).

Common situations: Updating meta on a block that was closed concurrently; schema changes where a meta key is no longer accepted; read-only data dir or full disk.

Related errors


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/c85cb9acc5ed4a84. Report an issue: GitHub.