Skip to content

Commit 9b78df7

Browse files
committed
Misc fixes
- adding protections against storing large strings in cache - fixed errant use of CacheEntry.utf8(String) instead of entry.utf8() - removed unnecessary lookupTimeMs variable
1 parent 4102a26 commit 9b78df7

2 files changed

Lines changed: 13 additions & 6 deletions

File tree

dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/GenerationalUtf8Cache.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.trace.common.writer.ddagent;
22

33
import datadog.communication.serialization.EncodingCache;
4+
import datadog.trace.common.writer.ddagent.SimpleUtf8Cache.CacheEntry;
45
import java.nio.charset.StandardCharsets;
56
import java.util.Arrays;
67

@@ -74,6 +75,8 @@ public final class GenerationalUtf8Cache implements EncodingCache {
7475
private static final double PURGE_THRESHOLD = 0.25D;
7576
private static final double PROMOTION_THRESHOLD_ADJ_FACTOR = 1.5;
7677

78+
private static final int MAX_ENTRY_LEN = 256;
79+
7780
private final CacheEntry[] edenEntries;
7881
private final int[] edenMarkers;
7982

@@ -181,12 +184,13 @@ public final byte[] getUtf8(String value) {
181184
* the specified accessTimeMs is used to update the cache entry
182185
*/
183186
public final byte[] getUtf8(String value, long accessTimeMs) {
187+
if (value.length() > MAX_ENTRY_LEN) return CacheEntry.utf8(value);
188+
184189
int adjHash = CacheEntry.adjHash(value);
185190
long lookupTimeMs = this.accessTimeMs;
186191

187192
CacheEntry[] tenuredEntries = this.tenuredEntries;
188-
int matchingTenuredIndex =
189-
lookupEntryIndex(tenuredEntries, MAX_TENURED_PROBES, adjHash, value, lookupTimeMs);
193+
int matchingTenuredIndex = lookupEntryIndex(tenuredEntries, MAX_TENURED_PROBES, adjHash, value);
190194
if (matchingTenuredIndex != -1) {
191195
CacheEntry tenuredEntry = tenuredEntries[matchingTenuredIndex];
192196

@@ -197,8 +201,7 @@ public final byte[] getUtf8(String value, long accessTimeMs) {
197201
}
198202

199203
CacheEntry[] edenEntries = this.edenEntries;
200-
int matchingEdenIndex =
201-
lookupEntryIndex(edenEntries, MAX_EDEN_PROBES, adjHash, value, lookupTimeMs);
204+
int matchingEdenIndex = lookupEntryIndex(edenEntries, MAX_EDEN_PROBES, adjHash, value);
202205
if (matchingEdenIndex != -1) {
203206
CacheEntry edenEntry = edenEntries[matchingEdenIndex];
204207

@@ -250,7 +253,7 @@ public final byte[] getUtf8(String value, long accessTimeMs) {
250253
this.earlyPromotions += 1;
251254

252255
edenEntries[edenMfuIndex] = newEntry;
253-
return CacheEntry.utf8(value);
256+
return newEntry.utf8();
254257
}
255258

256259
// No empty slot - or space to promote into the global cache
@@ -384,7 +387,7 @@ static final int initialBucketIndex(int[] marks, int adjHash) {
384387
}
385388

386389
static final int lookupEntryIndex(
387-
CacheEntry[] entries, int numProbes, int adjHash, String value, long lookupTimeMs) {
390+
CacheEntry[] entries, int numProbes, int adjHash, String value) {
388391
int initialBucketIndex = initialBucketIndex(entries, adjHash);
389392
for (int probe = 0, index = initialBucketIndex; probe < numProbes; ++probe, ++index) {
390393
if (index >= entries.length) index = 0;

dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/SimpleUtf8Cache.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public final class SimpleUtf8Cache implements EncodingCache {
5454
private static final double HIT_DECAY = 0.5D;
5555
private static final double PURGE_THRESHOLD = 0.25D;
5656

57+
private static final int MAX_ENTRY_LEN = 128;
58+
5759
protected int hits = 0;
5860
protected int evictions = 0;
5961

@@ -88,6 +90,8 @@ public byte[] encode(CharSequence charSeq) {
8890

8991
/** Returns the UTF-8 encoding of value -- using a cache value if available */
9092
public final byte[] getUtf8(String value) {
93+
if (value.length() > MAX_ENTRY_LEN) return CacheEntry.utf8(value);
94+
9195
CacheEntry[] thisEntries = this.entries;
9296

9397
int adjHash = CacheEntry.adjHash(value);

0 commit comments

Comments
 (0)