From 9f4d5fe77be3572e9632601842a62007ccfefef7 Mon Sep 17 00:00:00 2001 From: janakr Date: Tue, 19 Jun 2018 11:04:31 -0700 Subject: [PATCH] Put a trail into every SerializationException, not just NoCodecException, and have DynamicCodec add to it. It's very useful to have this trail available when debugging or whitelisting. PiperOrigin-RevId: 201205884 --- .../skyframe/serialization/DynamicCodec.java | 2 +- .../serialization/ObjectCodecRegistry.java | 8 ++-- .../serialization/SerializationException.java | 37 ++++++++++++------- .../serialization/DynamicCodecTest.java | 1 + 4 files changed, 30 insertions(+), 18 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 57bfe6a87c49d1..99257cbddb9b48 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 @@ -132,7 +132,7 @@ private void serializeField( } else { try { context.serialize(UnsafeProvider.getInstance().getObject(obj, offset), codedOut); - } catch (SerializationException.NoCodecException e) { + } catch (SerializationException e) { e.addTrail(this.type); throw e; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistry.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistry.java index 7c28f6a5811725..0912e7e095411b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistry.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistry.java @@ -390,7 +390,8 @@ private CodecDescriptor getDynamicCodecDescriptor(String className, @Nullable Cl CodecDescriptor descriptor = supplier.get(); if (descriptor == null) { throw new SerializationException.NoCodecException( - "There was a problem creating a codec for " + className + ". Check logs for details"); + "There was a problem creating a codec for " + className + ". Check logs for details", + type); } return descriptor; } @@ -405,10 +406,11 @@ private CodecDescriptor getDynamicCodecDescriptor(String className, @Nullable Cl "No default codec available for " + className + ". If this is a lambda, try casting it to (type & Serializable), like " - + "(Supplier & Serializable)"); + + "(Supplier & Serializable)", + type); } } throw new SerializationException.NoCodecException( - "No default codec available for " + className); + "No default codec available for " + className, type); } } 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 3d45adbc1bead1..ab263b63b2f479 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 @@ -14,11 +14,13 @@ package com.google.devtools.build.lib.skyframe.serialization; +import com.google.common.collect.ImmutableList; import java.io.NotSerializableException; import java.util.ArrayList; /** Exception signaling a failure to Serialize or Deserialize an Object. */ public class SerializationException extends Exception { + private final ArrayList trail = new ArrayList<>(); public SerializationException(String msg) { super(msg); @@ -36,12 +38,15 @@ public SerializationException(String msg, Throwable cause) { * or type of object. */ public static class NoCodecException extends SerializationException { - ArrayList trail = new ArrayList<>(); - NoCodecException(String message) { super(message); } + NoCodecException(String message, Class type) { + super(message); + addTrail(type); + } + NoCodecException(String message, NotSerializableException e) { super(message, e); } @@ -54,20 +59,24 @@ public static class NoCodecException extends SerializationException { NoCodecException(String message, NoCodecException e) { super(message, e); } + } - @Override - public String getMessage() { - return super.getMessage() + (trail.isEmpty() ? "" : " " + trail); - } + @Override + public String getMessage() { + return super.getMessage() + (trail.isEmpty() ? "" : " " + trail); + } - /** - * Adds extra tracing info for debugging. - * - *

Primarily useful for {@link DynamicCodec}. - */ - public void addTrail(Class type) { - trail.add(type.getName()); - } + /** + * Adds extra tracing info for debugging. + * + *

Primarily useful for {@link DynamicCodec}. + */ + public void addTrail(Class type) { + trail.add(type.getName()); + } + + public ImmutableList getTrailForTesting() { + return ImmutableList.copyOf(trail); } /** 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 1d73f6c386e5ba..2e595f6fb20391 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 @@ -396,6 +396,7 @@ public void testNoCodecExample() throws Exception { .hasMessageThat() .contains( "java.io.BufferedInputStream [" + + "java.io.BufferedInputStream, " + "com.google.devtools.build.lib.skyframe.serialization." + "DynamicCodecTest$NoCodecExample2, " + "com.google.devtools.build.lib.skyframe.serialization."