NationalSecurityAgency/ghidra · error · ElasticException

Missing critical configuration value:

Error message

Missing critical configuration value: 

What it means

Thrown in getCriticalValue when a required configuration key is absent from the key/value map loaded by readKeyValues. Critical keys include name, owner, description, major, minor, and settings. The missing key name is appended to the error message for diagnosis.

Source

Thrown at Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/elastic/ElasticDatabase.java:2143

				continue;		// This might be the "sequence" document
			}
			res.put(key, value.getAsString());
		}
		return res;
	}

	/**
	 * Given a critical key in the database configuration, return its corresponding value
	 * @param key is the configuration key
	 * @param keyValue is the key/value map
	 * @return the corresponding value
	 * @throws ElasticException if the key is missing
	 */
	private String getCriticalValue(String key, Map<String, String> keyValue)
			throws ElasticException {
		String value = keyValue.get(key);
		if (value == null) {
			throw new ElasticException("Missing critical configuration value: " + key);
		}
		return value;
	}

	/**
	 * Write DatabaseInformation to database in one bulk request. If -k- and -L- are greater than zero, they are written as well
	 * @param k (optional) is the database k parameter
	 * @param L (optional) is the database L parameter
	 * @throws ElasticException for communication problems with the server
	 */
	private void writeBasicInfo(int k, int L) throws ElasticException {
		StringBuilder buffer = new StringBuilder();
		buffer.append("{ \"index\": { \"_id\": \"name\" } }\n");
		buffer.append("{ \"type\": \"keyvalue\", \"value\": \"")
				.append(info.databasename)
				.append("\" }\n");
		buffer.append("{ \"index\": { \"_id\": \"owner\" } }\n");
		buffer.append("{ \"type\": \"keyvalue\",  \"value\": \"")

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Read the missing key name from the error message and either re-add it to the configuration index manually or recreate the database.
  2. Drop and recreate the database using a BSim client version compatible with the stored LAYOUT_VERSION.
  3. Verify that the BSim client version matches the database schema version (compareLayout should return 0).
  4. Inspect all configuration documents via curl GET <repo>_configuration/_search to see which keys are present.
Defensive patterns

Strategy: validation

Validate before calling

// Verify all critical configuration keys are present
String[] requiredKeys = {"name", "owner", "description", "major", "minor", "settings"};
for (String key : requiredKeys) {
    if (!keyValue.containsKey(key)) {
        throw new IllegalStateException("Missing configuration key: " + key);
    }
}

Try / catch

try {
    database.initialize();
} catch (ElasticException e) {
    if (e.getMessage().startsWith("Missing critical configuration value:")) {
        String missingKey = e.getMessage().substring(e.getMessage().lastIndexOf(' ') + 1);
        Msg.error(this, "Configuration key '" + missingKey + "' is missing; database may need recreation.");
    }
    throw e;
}

Prevention

When it happens

Trigger: During initialize() -> readBasicInfo, getCriticalValue is called for each required key against the HashMap populated from the configuration index. If keyValue.get(key) returns null for any critical key, this exception is thrown.

Common situations: Database created by an older or newer BSim version that uses a different set of configuration keys; a configuration document was manually deleted from the index; interrupted writeBasicInfo that wrote some but not all key/value documents.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/1a10e2f74ed18c1d. Report an issue: GitHub.