wavetermdev/waveterm · error

error updating meta

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.

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.

Appendix: 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)