aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodec.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationException.java17
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodecTest.java31
3 files changed, 54 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodec.java
index 19a493b75b..d8218da3ef 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodec.java
@@ -123,7 +123,12 @@ public class DynamicCodec implements ObjectCodec<Object> {
serializeField(context, codedOut, arr, type.getComponentType(), base + scale * i);
}
} else {
- context.serialize(UnsafeProvider.getInstance().getObject(obj, offset), codedOut);
+ try {
+ context.serialize(UnsafeProvider.getInstance().getObject(obj, offset), codedOut);
+ } catch (SerializationException.NoCodecException e) {
+ e.addTrail(this.type);
+ throw e;
+ }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationException.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationException.java
index 8efd958087..3d45adbc1b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationException.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationException.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.skyframe.serialization;
import java.io.NotSerializableException;
+import java.util.ArrayList;
/** Exception signaling a failure to Serialize or Deserialize an Object. */
public class SerializationException extends Exception {
@@ -35,6 +36,8 @@ public class SerializationException extends Exception {
* or type of object.
*/
public static class NoCodecException extends SerializationException {
+ ArrayList<String> trail = new ArrayList<>();
+
NoCodecException(String message) {
super(message);
}
@@ -51,6 +54,20 @@ public class SerializationException extends Exception {
NoCodecException(String message, NoCodecException e) {
super(message, e);
}
+
+ @Override
+ public String getMessage() {
+ return super.getMessage() + (trail.isEmpty() ? "" : " " + trail);
+ }
+
+ /**
+ * Adds extra tracing info for debugging.
+ *
+ * <p>Primarily useful for {@link DynamicCodec}.
+ */
+ public void addTrail(Class<?> type) {
+ trail.add(type.getName());
+ }
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodecTest.java
index 7d48929ee9..1d73f6c386 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodecTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/DynamicCodecTest.java
@@ -15,8 +15,11 @@
package com.google.devtools.build.lib.skyframe.serialization;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
+import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Objects;
import org.junit.Test;
@@ -371,4 +374,32 @@ public final class DynamicCodecTest {
.setRepetitions(100000)
.runTests();
}
+
+ private static class NoCodecExample2 {
+ @SuppressWarnings("unused")
+ private final BufferedInputStream noCodec = new BufferedInputStream(null);
+ }
+
+ private static class NoCodecExample1 {
+ @SuppressWarnings("unused")
+ private final NoCodecExample2 noCodec = new NoCodecExample2();
+ }
+
+ @Test
+ public void testNoCodecExample() throws Exception {
+ ObjectCodecs codecs = new ObjectCodecs(AutoRegistry.get(), ImmutableMap.of());
+ try {
+ codecs.serializeMemoized(new NoCodecExample1());
+ fail();
+ } catch (SerializationException.NoCodecException expected) {
+ assertThat(expected)
+ .hasMessageThat()
+ .contains(
+ "java.io.BufferedInputStream ["
+ + "com.google.devtools.build.lib.skyframe.serialization."
+ + "DynamicCodecTest$NoCodecExample2, "
+ + "com.google.devtools.build.lib.skyframe.serialization."
+ + "DynamicCodecTest$NoCodecExample1]");
+ }
+ }
}