Skip to content

Commit 530b9a6

Browse files
authored
fix(jackson): increase max serialized string length default (#8053)
1 parent 1251795 commit 530b9a6

File tree

37 files changed

+1616
-1871
lines changed

37 files changed

+1616
-1871
lines changed

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ResolverUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.linkedin.datahub.graphql.resolvers;
22

33
import com.datahub.authentication.Authentication;
4+
import com.fasterxml.jackson.core.StreamReadConstraints;
45
import com.fasterxml.jackson.databind.ObjectMapper;
56
import com.google.common.collect.ImmutableSet;
67
import com.linkedin.common.urn.Urn;
@@ -29,6 +30,8 @@
2930
import org.slf4j.Logger;
3031
import org.slf4j.LoggerFactory;
3132

33+
import static com.linkedin.metadata.Constants.*;
34+
3235

3336
public class ResolverUtils {
3437

@@ -37,6 +40,10 @@ public class ResolverUtils {
3740
"_entityType"
3841
);
3942
private static final ObjectMapper MAPPER = new ObjectMapper();
43+
static {
44+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
45+
MAPPER.getFactory().setStreamReadConstraints(StreamReadConstraints.builder().maxStringLength(maxSize).build());
46+
}
4047

4148
private static final Logger _logger = LoggerFactory.getLogger(ResolverUtils.class.getName());
4249

datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/common/steps/GMSQualificationStep.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.linkedin.datahub.upgrade.common.steps;
22

3+
import com.fasterxml.jackson.core.StreamReadConstraints;
34
import com.fasterxml.jackson.databind.JsonNode;
45
import com.fasterxml.jackson.databind.ObjectMapper;
56
import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -17,6 +18,8 @@
1718
import java.util.function.Function;
1819
import lombok.RequiredArgsConstructor;
1920

21+
import static com.linkedin.metadata.Constants.*;
22+
2023

2124
@RequiredArgsConstructor
2225
public class GMSQualificationStep implements UpgradeStep {
@@ -78,6 +81,10 @@ public Function<UpgradeContext, UpgradeStepResult> executable() {
7881
String responseString = convertStreamToString(response);
7982

8083
ObjectMapper mapper = new ObjectMapper();
84+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH,
85+
MAX_JACKSON_STRING_SIZE));
86+
mapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder()
87+
.maxStringLength(maxSize).build());
8188
JsonNode configJson = mapper.readTree(responseString);
8289
if (isEligible((ObjectNode) configJson)) {
8390
return new DefaultUpgradeStepResult(

entity-registry/src/main/java/com/linkedin/metadata/models/registry/ConfigEntityRegistry.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.linkedin.metadata.models.registry;
22

3+
import com.fasterxml.jackson.core.StreamReadConstraints;
34
import com.fasterxml.jackson.databind.ObjectMapper;
45
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
56
import com.linkedin.data.schema.DataSchema;
@@ -31,6 +32,7 @@
3132
import javax.annotation.Nonnull;
3233
import lombok.extern.slf4j.Slf4j;
3334

35+
import static com.linkedin.metadata.Constants.*;
3436
import static com.linkedin.metadata.models.registry.EntityRegistryUtils.*;
3537

3638

@@ -49,6 +51,10 @@ public class ConfigEntityRegistry implements EntityRegistry {
4951
private final Map<String, AspectSpec> _aspectNameToSpec;
5052

5153
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory());
54+
static {
55+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
56+
OBJECT_MAPPER.getFactory().setStreamReadConstraints(StreamReadConstraints.builder().maxStringLength(maxSize).build());
57+
}
5258

5359
public ConfigEntityRegistry(Pair<Path, Path> configFileClassPathPair) throws IOException {
5460
this(DataSchemaFactory.withCustomClasspath(configFileClassPathPair.getSecond()), configFileClassPathPair.getFirst());

entity-registry/src/main/java/com/linkedin/metadata/models/registry/PatchEntityRegistry.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.linkedin.metadata.models.registry;
22

3+
import com.fasterxml.jackson.core.StreamReadConstraints;
34
import com.fasterxml.jackson.databind.ObjectMapper;
45
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
56
import com.linkedin.data.schema.DataSchema;
@@ -31,6 +32,7 @@
3132
import lombok.extern.slf4j.Slf4j;
3233
import org.apache.maven.artifact.versioning.ComparableVersion;
3334

35+
import static com.linkedin.metadata.Constants.*;
3436
import static com.linkedin.metadata.models.registry.EntityRegistryUtils.*;
3537

3638

@@ -51,6 +53,10 @@ public class PatchEntityRegistry implements EntityRegistry {
5153
private final String identifier;
5254

5355
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory());
56+
static {
57+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
58+
OBJECT_MAPPER.getFactory().setStreamReadConstraints(StreamReadConstraints.builder().maxStringLength(maxSize).build());
59+
}
5460

5561
@Override
5662
public String toString() {

entity-registry/src/main/java/com/linkedin/metadata/models/registry/template/util/TemplateUtil.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.linkedin.metadata.models.registry.template.util;
22

3+
import com.fasterxml.jackson.core.StreamReadConstraints;
34
import com.fasterxml.jackson.databind.JsonNode;
45
import com.fasterxml.jackson.databind.ObjectMapper;
56
import com.github.fge.jsonpatch.Patch;
67
import java.util.ArrayList;
78
import java.util.List;
89

10+
import static com.linkedin.metadata.Constants.*;
11+
912

1013
public class TemplateUtil {
1114

@@ -14,9 +17,13 @@ private TemplateUtil() {
1417
}
1518

1619
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
20+
static {
21+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
22+
OBJECT_MAPPER.getFactory().setStreamReadConstraints(StreamReadConstraints.builder().maxStringLength(maxSize).build());
23+
}
1724

1825
public static List<String> getPaths(Patch jsonPatch) {
19-
JsonNode patchNode = new ObjectMapper().valueToTree(jsonPatch);
26+
JsonNode patchNode = OBJECT_MAPPER.valueToTree(jsonPatch);
2027
List<String> paths = new ArrayList<>();
2128
patchNode.elements().forEachRemaining(node -> {
2229
paths.add(node.get("path").asText());

li-utils/src/main/java/com/linkedin/metadata/Constants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ public class Constants {
1616
public static final Long ASPECT_LATEST_VERSION = 0L;
1717
public static final String UNKNOWN_DATA_PLATFORM = "urn:li:dataPlatform:unknown";
1818

19+
// !!!!!!! IMPORTANT !!!!!!!
20+
// This effectively sets the max aspect size to 16 MB. Used in deserialization of messages. Without this the limit is
21+
// whatever Jackson is defaulting to (5 MB currently).
22+
public static final String MAX_JACKSON_STRING_SIZE = "16000000";
23+
public static final String INGESTION_MAX_SERIALIZED_STRING_LENGTH = "INGESTION_MAX_SERIALIZED_STRING_LENGTH";
24+
1925
/**
2026
* System Metadata
2127
*/

metadata-integration/java/datahub-client/src/main/java/datahub/client/file/FileEmitter.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datahub.client.file;
22

3+
import com.fasterxml.jackson.core.StreamReadConstraints;
34
import java.io.BufferedWriter;
45
import java.io.FileWriter;
56
import java.io.IOException;
@@ -25,14 +26,16 @@
2526
import java.util.concurrent.atomic.AtomicBoolean;
2627
import lombok.extern.slf4j.Slf4j;
2728

29+
import static com.linkedin.metadata.Constants.*;
30+
31+
2832
@Slf4j
2933
public class FileEmitter implements Emitter {
3034

3135
private final EventFormatter eventFormatter;
3236
private final FileEmitterConfig config;
33-
private final ObjectMapper objectMapper = new ObjectMapper()
34-
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
35-
private final JacksonDataTemplateCodec dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
37+
private final ObjectMapper objectMapper;
38+
private final JacksonDataTemplateCodec dataTemplateCodec;
3639

3740
private final BufferedWriter writer;
3841
private final Future<MetadataWriteResponse> cachedSuccessFuture;
@@ -46,6 +49,11 @@ public class FileEmitter implements Emitter {
4649
* @param config
4750
*/
4851
public FileEmitter(FileEmitterConfig config) {
52+
objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
53+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
54+
objectMapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder()
55+
.maxStringLength(maxSize).build());
56+
dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
4957

5058
this.config = config;
5159
this.eventFormatter = this.config.getEventFormatter();

metadata-integration/java/datahub-client/src/main/java/datahub/client/rest/RestEmitter.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datahub.client.rest;
22

3+
import com.fasterxml.jackson.core.StreamReadConstraints;
34
import com.google.common.annotations.VisibleForTesting;
45
import java.io.ByteArrayOutputStream;
56
import java.io.IOException;
@@ -47,6 +48,8 @@
4748
import java.security.KeyStoreException;
4849
import java.security.NoSuchAlgorithmException;
4950

51+
import static com.linkedin.metadata.Constants.*;
52+
5053

5154
@ThreadSafe
5255
@Slf4j
@@ -77,8 +80,8 @@ public class RestEmitter implements Emitter {
7780
private final String ingestOpenApiUrl;
7881
private final String configUrl;
7982

80-
private final ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
81-
private final JacksonDataTemplateCodec dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
83+
private final ObjectMapper objectMapper;
84+
private final JacksonDataTemplateCodec dataTemplateCodec;
8285
private final CloseableHttpAsyncClient httpClient;
8386
private final EventFormatter eventFormatter;
8487

@@ -87,6 +90,12 @@ public class RestEmitter implements Emitter {
8790
* @param config
8891
*/
8992
public RestEmitter(RestEmitterConfig config) {
93+
objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
94+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
95+
objectMapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder()
96+
.maxStringLength(maxSize).build());
97+
dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
98+
9099
this.config = config;
91100
// Override httpClient settings with RestEmitter configs if present
92101
if (config.getTimeoutSec() != null) {

metadata-integration/java/datahub-client/src/main/java/datahub/event/EventFormatter.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datahub.event;
22

33
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.core.StreamReadConstraints;
45
import com.fasterxml.jackson.databind.ObjectMapper;
56
import com.linkedin.common.urn.Urn;
67
import com.linkedin.data.ByteString;
@@ -13,19 +14,26 @@
1314
import java.nio.charset.StandardCharsets;
1415
import lombok.SneakyThrows;
1516

17+
import static com.linkedin.metadata.Constants.*;
18+
1619

1720
/**
1821
* A class that helps to format Metadata events for transport
1922
*/
2023
public class EventFormatter {
2124

22-
private final ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
25+
private final ObjectMapper objectMapper;
2326

24-
private final JacksonDataTemplateCodec dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
27+
private final JacksonDataTemplateCodec dataTemplateCodec;
2528
private final Format serializationFormat;
2629

2730
public EventFormatter(Format serializationFormat) {
2831
this.serializationFormat = serializationFormat;
32+
objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
33+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
34+
objectMapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder()
35+
.maxStringLength(maxSize).build());
36+
dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
2937
}
3038

3139
public EventFormatter() {

metadata-integration/java/datahub-client/src/test/java/datahub/client/file/FileEmitterTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datahub.client.file;
22

3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.core.StreamReadConstraints;
35
import java.io.File;
46
import java.io.IOException;
57
import java.io.InputStream;
@@ -27,9 +29,20 @@
2729
import datahub.client.MetadataWriteResponse;
2830
import datahub.event.MetadataChangeProposalWrapper;
2931

32+
import static com.linkedin.metadata.Constants.*;
33+
34+
3035
public class FileEmitterTest {
31-
private final ObjectMapper objectMapper = new ObjectMapper();
32-
private final JacksonDataTemplateCodec dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
36+
private final ObjectMapper objectMapper;
37+
private final JacksonDataTemplateCodec dataTemplateCodec;
38+
39+
public FileEmitterTest() {
40+
objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
41+
int maxSize = Integer.parseInt(System.getenv().getOrDefault(INGESTION_MAX_SERIALIZED_STRING_LENGTH, MAX_JACKSON_STRING_SIZE));
42+
objectMapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder()
43+
.maxStringLength(maxSize).build());
44+
dataTemplateCodec = new JacksonDataTemplateCodec(objectMapper.getFactory());
45+
}
3346

3447
@Rule
3548
public TemporaryFolder tempFolder = new TemporaryFolder();

0 commit comments

Comments
 (0)