{"record":{"id":"149d45d74144a584","repo":"wavetermdev/waveterm","slug":"error-updating-client-data-w","errorCode":null,"errorMessage":"error updating client data: %w","messagePattern":"error updating client data: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/service/clientservice/clientservice.go","lineNumber":63,"sourceCode":"\treturn append(sshStatuses, wslStatuses...), nil\n}\n\n// moves the window to the front of the windowId stack\nfunc (cs *ClientService) FocusWindow(ctx context.Context, windowId string) error {\n\treturn wcore.FocusWindow(ctx, windowId)\n}\n\nfunc (cs *ClientService) AgreeTos(ctx context.Context) (waveobj.UpdatesRtnType, error) {\n\tctx = waveobj.ContextWithUpdates(ctx)\n\tclientData, err := wstore.DBGetSingleton[*waveobj.Client](ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error getting client data: %w\", err)\n\t}\n\ttimestamp := time.Now().UnixMilli()\n\tclientData.TosAgreed = timestamp\n\terr = wstore.DBUpdate(ctx, clientData)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error updating client data: %w\", err)\n\t}\n\twcore.BootstrapStarterLayout(ctx)\n\treturn waveobj.ContextGetUpdatesRtn(ctx), nil\n}\n\nfunc (cs *ClientService) TelemetryUpdate(ctx context.Context, telemetryEnabled bool) error {\n\tmeta := waveobj.MetaMapType{\n\t\twconfig.ConfigKey_TelemetryEnabled: telemetryEnabled,\n\t}\n\terr := wconfig.SetBaseConfigValue(meta)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error setting telemetry value: %w\", err)\n\t}\n\treturn nil\n}\n","sourceCodeStart":45,"sourceCodeEnd":79,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/service/clientservice/clientservice.go#L45-L79","documentation":"AgreeTos wraps failures from wstore.DBUpdate with 'error updating client data: %w'. The Client record was loaded and TosAgreed set, but persisting it back to wstore failed. This is a database write failure, so the ToS agreement was NOT saved.","triggerScenarios":"Calling AgreeTos when the wstore DB write fails: disk full, permissions issue, DB lock, or serialization error on the modified Client object.","commonSituations":"Read-only data directory or disk quota exceeded; another process holding the DB; corrupted wstore file failing the write.","solutions":["Check the wrapped error for disk/permission causes and free space or fix permissions on the data dir","Retry AgreeTos after resolving transient DB lock conditions","If persistent, validate/repair the wstore DB file"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// check disk space / permissions on the data dir before write-heavy ops\ninfo, err := os.Stat(dataDir)\nif err != nil || info.Mode().Perm()&0200 == 0 { return fmt.Errorf(\"data dir not writable\") }","typeGuard":null,"tryCatchPattern":"for i := 0; i < 3; i++ {\n    if _, err := cs.AgreeTos(ctx); err == nil { break }\n    time.Sleep(200 * time.Millisecond)\n}","preventionTips":["Monitor disk space in the Wave data directory","Avoid concurrent processes writing the same wstore","Keep settings/data dir permissions user-owned"],"tags":["go","database","write-failure","tos"],"backgroundTag":"database-write-failed","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}