Skip to content

Commit

Permalink
don't recompute hash for known tags
Browse files Browse the repository at this point in the history
  • Loading branch information
vandonr committed Jul 11, 2024
1 parent 8b00e3e commit 8c523ac
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
public class DefaultPathwayContext implements PathwayContext {
private static final Logger log = LoggerFactory.getLogger(DefaultPathwayContext.class);
private final Lock lock = new ReentrantLock();
private final WellKnownTags wellKnownTags;
private final long hashOfKnownTags;
private final TimeSource timeSource;
private final GrowingByteArrayOutput outputBuffer =
GrowingByteArrayOutput.withInitialCapacity(20);
Expand Down Expand Up @@ -67,7 +67,7 @@ public class DefaultPathwayContext implements PathwayContext {

public DefaultPathwayContext(TimeSource timeSource, WellKnownTags wellKnownTags) {
this.timeSource = timeSource;
this.wellKnownTags = wellKnownTags;
this.hashOfKnownTags = PathwayHashBuilder.getBaseHash(wellKnownTags);
}

private DefaultPathwayContext(
Expand All @@ -77,8 +77,7 @@ private DefaultPathwayContext(
long pathwayStartNanoTicks,
long edgeStartNanoTicks,
long hash) {
this.timeSource = timeSource;
this.wellKnownTags = wellKnownTags;
this(timeSource, wellKnownTags);
this.pathwayStartNanos = pathwayStartNanos;
this.pathwayStartNanoTicks = pathwayStartNanoTicks;
this.edgeStartNanoTicks = edgeStartNanoTicks;
Expand Down Expand Up @@ -124,7 +123,7 @@ public void setCheckpoint(
// So far, each tag key has only one tag value, so we're initializing the capacity to match
// the number of tag keys for now. We should revisit this later if it's no longer the case.
List<String> allTags = new ArrayList<>(sortedTags.size());
PathwayHashBuilder pathwayHashBuilder = new PathwayHashBuilder(wellKnownTags);
PathwayHashBuilder pathwayHashBuilder = new PathwayHashBuilder(hashOfKnownTags);
DataSetHashBuilder dataSetHashBuilder = new DataSetHashBuilder();

if (!started) {
Expand Down Expand Up @@ -408,35 +407,35 @@ public long addValue(String val) {
}

private static class PathwayHashBuilder {
private final StringBuilder builder;
private long hash;

public PathwayHashBuilder(long baseHash) {
hash = baseHash;
}

public void addTag(String tag) {
hash = FNV64Hash.continueHash(hash, tag, FNV64Hash.Version.v1);
}

public long getHash() {
return hash;
}

public PathwayHashBuilder(WellKnownTags wellKnownTags) {
builder = new StringBuilder();
public static long getBaseHash(WellKnownTags wellKnownTags) {
StringBuilder builder = new StringBuilder();
builder.append(wellKnownTags.getService());
builder.append(wellKnownTags.getEnv());

String primaryTag = Config.get().getPrimaryTag();
if (primaryTag != null) {
builder.append(primaryTag);
}
}

public void addTag(String tag) {
builder.append(tag);
}

public long generateHash() {
return FNV64Hash.generateHash(builder.toString(), FNV64Hash.Version.v1);
}

@Override
public String toString() {
return builder.toString();
}
}

private long generateNodeHash(PathwayHashBuilder pathwayHashBuilder) {
return pathwayHashBuilder.generateHash();
return pathwayHashBuilder.getHash();
}

private long generatePathwayHash(long nodeHash, long parentHash) {
Expand Down
25 changes: 19 additions & 6 deletions internal-api/src/main/java/datadog/trace/util/FNV64Hash.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,33 @@ public static long generateHash(String data, Version version) {
return generateHash(data.getBytes(), version);
}

public static long continueHash(long currentHash, String data, Version version) {
return generateHash(currentHash, data.getBytes(), version);
}

public static long generateHash(byte[] data, Version version) {
return generateHash(data, 0, data.length, version);
}

public static long generateHash(long currentHash, byte[] data, Version version) {
return generateHash(currentHash, data, 0, data.length, version);
}

public static long generateHash(byte[] data, int start, int length, Version version) {
return generateHash(FNV_INIT, data, start, length, version);
}

public static long generateHash(
long currentHash, byte[] data, int start, int length, Version version) {
if (version == Version.v1) {
return generateFNV1Hash(data, start, length);
return generateFNV1Hash(currentHash, data, start, length);
} else {
return generateFNV1AHash(data, start, length);
return generateFNV1AHash(currentHash, data, start, length);
}
}

private static long generateFNV1Hash(byte[] data, int start, int length) {
long hash = FNV_INIT;
private static long generateFNV1Hash(long currentHash, byte[] data, int start, int length) {
long hash = currentHash;

for (int i = start; i < start + length; i++) {
hash *= FNV_PRIME;
Expand All @@ -41,8 +54,8 @@ private static long generateFNV1Hash(byte[] data, int start, int length) {
return hash;
}

private static long generateFNV1AHash(byte[] data, int start, int length) {
long hash = FNV_INIT;
private static long generateFNV1AHash(long currentHash, byte[] data, int start, int length) {
long hash = currentHash;

for (int i = start; i < start + length; i++) {
hash ^= 0xffL & data[i];
Expand Down

0 comments on commit 8c523ac

Please sign in to comment.