in teamcity-symbol-server/src/main/java/jetbrains/buildServer/symbols/SymbolsCache.java [80:143]
public BuildMetadataEntry getEntry(@NotNull final String key,
@NotNull final MetadataSource metadataSource) {
Boolean missedSymbol = myMissedSymbols.getIfPresent(key);
if (missedSymbol != null && missedSymbol) {
LOG.debug("Symbol server does not host the symbol. Missed symbols cache contains key: " + key);
return null;
}
try {
Long buildId = myKeyToBuildIdMap.get(key);
if (buildId == null) {
LOG.debug("Searching buildId by key. Key: " + key);
buildId = metadataSource.getBuildIdByEntryKey(key);
if (buildId == null) {
LOG.debug("Could not found buildId by key. Key: " + key);
myMissedSymbols.put(key, true);
return null;
} else {
myKeyToBuildIdMap.put(key, buildId);
}
}
LOG.debug("Key was found in keyToBuildMap. Key: " + key + ", BuildId: " + buildId);
final AtomicBoolean shouldUpdateMap = new AtomicBoolean(false);
final Long lambdaBuildId = buildId;
final Optional<Map<String, BuildMetadataEntry>> buildEntries = myCachedBuilds.get(buildId, () -> {
final List<BuildMetadataEntry> entries = metadataSource.getEntriesByBuildId(lambdaBuildId);
if (entries.isEmpty()) {
return Optional.empty();
}
shouldUpdateMap.set(true);
final HashMap<String, BuildMetadataEntry> result = new HashMap<String, BuildMetadataEntry>();
for (BuildMetadataEntry entry: entries) {
result.put(entry.getKey(), entry);
}
return Optional.of(result);
});
if (buildEntries.isPresent()) {
LOG.debug("Build entries was found in cache. BuildId: " + buildId);
final Map<String, BuildMetadataEntry> buildEntriesMap = buildEntries.get();
if (shouldUpdateMap.get()) {
for (String entryKey: buildEntriesMap.keySet()) {
myKeyToBuildIdMap.put(entryKey, lambdaBuildId);
myMissedSymbols.invalidate(entryKey);
}
}
final BuildMetadataEntry metadata = buildEntriesMap.get(key);
if (metadata != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Key was found in cache. Key: " + key + ", Value: " + metadata);
}
return metadata;
}
}
LOG.debug("Key was found in keyToBuildIdMap but there was no such build in cache. Removing key from keyToBuildIdMap. Key: " + key + ", BuildId: " + buildId);
myKeyToBuildIdMap.remove(key);
} catch (ExecutionException | InterruptedException | TimeoutException e) {
LOG.error("Exception occured during metadata loading", e);
}
return null;
}