aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Michajlo Matijkiw <michajlo@google.com>2015-06-08 16:02:40 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-06-09 09:57:10 +0000
commitb17689b4d7ba9618f49a50e7b0b6d7ec8cbf2506 (patch)
treeb24a90e2e3c276aed4dbb2529f93c672b324578f
parent7c66f2dd42f8feefeba0bd20ec72e731404bc387 (diff)
Log exceptions deserializing Packages
Due to our streaming deserialization approach we can leave data on the wire when encountering exceptions. Java serialization, the primary consumer of this code, isn't happy with that and throws an IllegalStateException("unread block data"), drowning out the original exception and leaving us without much useful debug information. -- MOS_MIGRATED_REVID=95442892
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index a3faab4e2f..c909557e0e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -45,12 +45,16 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Functionality to deserialize loaded packages.
*/
public class PackageDeserializer {
+ private static final Logger LOG = Logger.getLogger(PackageDeserializer.class.getName());
+
// Workaround for Java serialization not allowing to pass in a context manually.
// volatile is needed to ensure that the objects are published safely.
// TODO(bazel-team): Subclass ObjectOutputStream to pass through environment variables.
@@ -406,6 +410,16 @@ public class PackageDeserializer {
* @throws IOException on failures reading from {@code in}
*/
public Package deserialize(InputStream in) throws PackageDeserializationException, IOException {
+ try {
+ return deserializeInternal(in);
+ } catch (PackageDeserializationException | RuntimeException e) {
+ LOG.log(Level.WARNING, "Failed to deserialize Package object", e);
+ throw e;
+ }
+ }
+
+ private Package deserializeInternal(InputStream in)
+ throws PackageDeserializationException, IOException {
// Read the initial Package message so we have the data to initialize the builder. We will read
// the Targets in individually later.
Build.Package packagePb = Build.Package.parseDelimitedFrom(in);