{"record":{"id":"aa58e2aa4bd04837","repo":"juicedata/juicefs","slug":"get-range-v-v-s","errorCode":null,"errorMessage":"get range [%v-%v): %s","messagePattern":"get range \\[(.+?)-(.+?)\\): (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/meta/tkv_etcd.go","lineNumber":117,"sourceCode":"\t\t\tvalues[i] = v\n\t\t\tcontinue\n\t\t}\n\t\tvalues[i] = rs[k]\n\t\tif len(values[i]) == 0 {\n\t\t\ttx.observed[k] = 0\n\t\t}\n\t}\n\treturn values\n}\n\nfunc (tx *etcdTxn) scan(begin, end []byte, keysOnly bool, handler func(k, v []byte) bool) {\n\topts := []etcd.OpOption{etcd.WithRange(string(end))}\n\tif keysOnly {\n\t\topts = append(opts, etcd.WithKeysOnly())\n\t}\n\tresp, err := tx.kv.Get(tx.ctx, string(begin), opts...)\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"get range [%v-%v): %s\", string(begin), string(end), err))\n\t}\n\tfor _, kv := range resp.Kvs {\n\t\ttx.observed[string(kv.Key)] = kv.ModRevision\n\t\tif !handler(kv.Key, kv.Value) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (tx *etcdTxn) exist(prefix []byte) bool {\n\tresp, err := tx.kv.Get(tx.ctx, string(prefix), etcd.WithPrefix(), etcd.WithCountOnly())\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"get prefix %v with count only: %s\", string(prefix), err))\n\t}\n\treturn resp.Count > 0\n}\n\nfunc (tx *etcdTxn) set(key, value []byte) {","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/juicedata/juicefs/blob/c9a67b23e8e08ec23ec331aa6f1675e2319e921c/pkg/meta/tkv_etcd.go#L99-L135","documentation":"`etcdTxn.scan` reads a half-open key range [begin, end) from etcd; if the range Get RPC fails the transaction panics with this message naming the range. Scans power directory listing and other range reads in the TKV metadata layer.","triggerScenarios":"Listing a directory or scanning metadata keys in an etcd-backed volume when the etcd range query errors: unreachable endpoint, auth revoked, context deadline exceeded, etcd compaction/leader change mid-request.","commonSituations":"etcd overloaded by large directory scans; network flakiness; expired etcd user credentials/token; request timeout on huge directories over slow links.","solutions":["Run `etcdctl endpoint health` and check etcd logs for the failing range request","Fix connectivity/auth (endpoints, certificates, user permissions on the key range)","Retry the listing after transient etcd issues; increase client timeout for large directories","Keep directories reasonably sized or shard keys if scans routinely time out"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"etcdctl --endpoints=host:2379 endpoint health && etcdctl auth status","typeGuard":null,"tryCatchPattern":"if err := listDir(); err != nil {\n    if isTransient(err) { time.Sleep(backoff); listDir() } else { return err }\n}","preventionTips":["Verify etcd user has read permission on the volume's key prefix","Avoid giant directories when clients sit far from etcd","Keep etcd compacted/defragmented and monitored","Pin client timeouts generously for large scans"],"tags":["etcd","scan","network","timeout","juicefs"],"backgroundTag":"database-query-failed","analyzedSha":"c9a67b23e8e08ec23ec331aa6f1675e2319e921c","analyzedAt":"2026-09-06T17:55:48.476Z","contentChangedAt":"2026-09-06T17:55:48.476Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}