diff options
Diffstat (limited to 'src')
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]"); + } + } } |