{"record":{"id":"c41f13f2df32854d","repo":"tikv/tikv","slug":"data-dir-must-be-specified","errorCode":null,"errorMessage":"--data-dir must be specified","messagePattern":"--data-dir must be specified","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/tikv-ctl/src/main.rs","lineNumber":149,"sourceCode":"                \"ldb\" => run_ldb_command(args, &cfg),\n                \"sst_dump\" => run_sst_dump_command(args, &cfg),\n                _ => Opt::command().print_help().unwrap(),\n            }\n        }\n        Cmd::RaftEngineCtl { args } => {\n            if !validate_storage_data_dir(&mut cfg, opt.data_dir) {\n                return;\n            }\n            let key_manager =\n                data_key_manager_from_config(&cfg.security.encryption, &cfg.storage.data_dir)\n                    .expect(\"data_key_manager_from_config should success\");\n            let file_system = Arc::new(ManagedFileSystem::new(key_manager.map(Arc::new), None));\n            raft_engine_ctl::run_command(args, file_system);\n        }\n        Cmd::BadSsts { manifest, pd } => {\n            let data_dir = opt.data_dir.as_deref();\n            assert!(data_dir.is_some(), \"--data-dir must be specified\");\n            let data_dir = data_dir.expect(\"--data-dir must be specified\");\n            let pd_client = get_pd_rpc_client(Some(pd), Arc::clone(&mgr));\n            print_bad_ssts(data_dir, manifest.as_deref(), pd_client, &cfg);\n        }\n        Cmd::DumpSnapMeta { file } => {\n            let path = file.as_ref();\n            dump_snap_meta_file(path);\n        }\n        Cmd::DecryptFile { file, out_file } => {\n            if !validate_storage_data_dir(&mut cfg, opt.data_dir) {\n                return;\n            }\n            let message =\n                \"This action will expose sensitive data as plaintext on persistent storage\";\n            if !warning_prompt(message) {\n                return;\n            }\n            let infile = &file;\n            let outfile = &out_file;","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/tikv/tikv/blob/78aedc1c81ef3f7d8bacc6e9d09f56460f134937/cmd/tikv-ctl/src/main.rs#L131-L167","documentation":"The tikv-ctl bad-ssts command requires the path to the TiKV data directory to locate the SST/manifest files it inspects. If opt.data_dir is None, an assert! panics with \"--data-dir must be specified\"; the subsequent expect uses the same message.","triggerScenarios":"Running `tikv-ctl bad-ssts` without the --data-dir command-line flag.","commonSituations":"Diagnosing corrupted/missing SSTs after a crash and forgetting --data-dir, scripted invocations where the flag was dropped, or assuming the PD endpoint alone suffices.","solutions":["Pass --data-dir pointing at the TiKV data directory when running bad-ssts","Fix the invoking script so it includes --data-dir","Check `tikv-ctl bad-ssts --help` for the exact flag name and expected value"],"exampleFix":"// before\ntikv-ctl bad-ssts --manifest MANIFEST -pd http://pd:2379\n// after\ntikv-ctl bad-ssts --data-dir /tidb/tikv-data --manifest MANIFEST -pd http://pd:2379","handlingStrategy":"validation","validationCode":"// shell pre-check\nif [ -z \"$DATA_DIR\" ]; then echo \"--data-dir is required for bad-ssts\"; exit 1; fi\n# in Rust caller\nlet data_dir = opt.data_dir.as_deref();\nif data_dir.is_none() { eprintln!(\"pass --data-dir for bad-ssts\"); std::process::exit(2); }","typeGuard":null,"tryCatchPattern":"match run_bad_ssts(data_dir, manifest, pd) {\n    Err(e) => eprintln!(\"bad-ssts failed: {:?}\", e),\n    Ok(_) => {}\n}","preventionTips":["Always pass --data-dir with bad-ssts","Wrap tikv-ctl invocations in a script that asserts required flags","Consult `tikv-ctl bad-ssts --help` for required arguments"],"tags":["tikv-ctl","panic","cli","missing-argument"],"backgroundTag":"missing-data-dir-flag","analyzedSha":"78aedc1c81ef3f7d8bacc6e9d09f56460f134937","analyzedAt":"2026-09-03T23:31:32.398Z","contentChangedAt":"2026-09-03T23:31:32.398Z","schemaVersion":2},"datasetVersion":"2026-09-11T07:07:21.782Z"}