public BuildMetadataEntry getEntry()

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;
  }