aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2017-09-14 22:30:06 +0200
committerGravatar Philipp Wollermann <philwo@google.com>2017-09-15 11:28:37 +0200
commitfe46788eaf91673916c12e83396277e00fd0a9bd (patch)
treed29f839b4931c8e78733ea7fea374e3b0316d393 /src/main/java/com/google/devtools/build/lib
parentf38b433bf5d311a5bd914b8ef7ea497fd3b09941 (diff)
Add serialization support to BlazeDirectories (and .hashCode() and .equals() support into the bargain).
Equality checking isn't that important since there's only one instance per Blaze server, but it keeps serialization semantics reasonable. PiperOrigin-RevId: 168735669
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java42
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java48
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java61
3 files changed, 145 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
index 6ebdca048b..2362cbdd35 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectories.java
@@ -18,9 +18,15 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.hash.HashCode;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.skyframe.serialization.FastStringCodec;
+import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
import com.google.devtools.build.lib.util.StringCanonicalizer;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
+import java.util.Objects;
/**
* Encapsulates the directories related to a workspace.
@@ -210,4 +216,40 @@ public final class BlazeDirectories {
public static String getRelativeOutputPath(String productName) {
return StringCanonicalizer.intern(productName + "-out");
}
+
+ @Override
+ public int hashCode() {
+ // execRoot is derivable from other fields, but better safe than sorry.
+ return Objects.hash(serverDirectories, workspace, productName, execRoot);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof BlazeDirectories)) {
+ return false;
+ }
+ BlazeDirectories that = (BlazeDirectories) obj;
+ return this.serverDirectories.equals(that.serverDirectories)
+ && this.workspace.equals(that.workspace)
+ && this.productName.equals(that.productName)
+ // execRoot is derivable from other fields, but better safe than sorry.
+ && this.execRoot.equals(that.execRoot);
+ }
+
+ void serialize(CodedOutputStream codedOut, PathCodec pathCodec) throws IOException {
+ serverDirectories.serialize(codedOut, pathCodec);
+ pathCodec.serialize(workspace, codedOut);
+ FastStringCodec.INSTANCE.serialize(productName, codedOut);
+ }
+
+ static BlazeDirectories deserialize(CodedInputStream codedIn, PathCodec pathCodec)
+ throws IOException {
+ return new BlazeDirectories(
+ ServerDirectories.deserialize(codedIn, pathCodec),
+ pathCodec.deserialize(codedIn),
+ FastStringCodec.INSTANCE.deserialize(codedIn));
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
new file mode 100644
index 0000000000..61c3ff66be
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BlazeDirectoriesCodec.java
@@ -0,0 +1,48 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
+import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
+
+/**
+ * {@link ObjectCodec} for {@link BlazeDirectories}. Delegates to {@link BlazeDirectories} for
+ * everything.
+ */
+public class BlazeDirectoriesCodec implements ObjectCodec<BlazeDirectories> {
+ private final PathCodec pathCodec;
+
+ public BlazeDirectoriesCodec(PathCodec pathCodec) {
+ this.pathCodec = pathCodec;
+ }
+
+ @Override
+ public Class<BlazeDirectories> getEncodedClass() {
+ return BlazeDirectories.class;
+ }
+
+ @Override
+ public void serialize(BlazeDirectories obj, CodedOutputStream codedOut) throws IOException {
+ obj.serialize(codedOut, pathCodec);
+ }
+
+ @Override
+ public BlazeDirectories deserialize(CodedInputStream codedIn) throws IOException {
+ return BlazeDirectories.deserialize(codedIn, pathCodec);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
index 4c57ae6496..8c75f583d8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ServerDirectories.java
@@ -18,10 +18,14 @@ import com.google.common.base.Strings;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.skyframe.serialization.PathCodec;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.FileSystem;
import com.google.devtools.build.lib.vfs.Path;
-
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import java.io.IOException;
+import java.util.Objects;
import javax.annotation.Nullable;
/**
@@ -36,19 +40,25 @@ public final class ServerDirectories {
/** Where Blaze gets unpacked. */
private final Path installBase;
/** The content hash of everything in installBase. */
- private final HashCode installMD5;
+ @Nullable private final HashCode installMD5;
/** The root of the temp and output trees. */
private final Path outputBase;
public ServerDirectories(Path installBase, Path outputBase, @Nullable String installMD5) {
+ this(
+ installBase,
+ outputBase,
+ Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5)));
+ }
+
+ private ServerDirectories(Path installBase, Path outputBase, HashCode installMD5) {
this.installBase = installBase;
this.outputBase = outputBase;
- this.installMD5 =
- Strings.isNullOrEmpty(installMD5) ? null : checkMD5(HashCode.fromString(installMD5));
+ this.installMD5 = installMD5;
}
public ServerDirectories(Path installBase, Path outputBase) {
- this(installBase, outputBase, null);
+ this(installBase, outputBase, (HashCode) null);
}
private static HashCode checkMD5(HashCode hash) {
@@ -95,4 +105,43 @@ public final class ServerDirectories {
public HashCode getInstallMD5() {
return installMD5;
}
-} \ No newline at end of file
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(installBase, installMD5, outputBase);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ServerDirectories)) {
+ return false;
+ }
+ ServerDirectories that = (ServerDirectories) obj;
+ return this.installBase.equals(that.installBase)
+ && Objects.equals(this.installMD5, that.installMD5)
+ && this.outputBase.equals(that.outputBase);
+ }
+
+ void serialize(CodedOutputStream out, PathCodec pathCodec) throws IOException {
+ pathCodec.serialize(installBase, out);
+ out.writeBoolNoTag(installMD5 != null);
+ if (installMD5 != null) {
+ out.writeByteArrayNoTag(installMD5.asBytes());
+ }
+ pathCodec.serialize(outputBase, out);
+ }
+
+ static ServerDirectories deserialize(CodedInputStream in, PathCodec pathCodec)
+ throws IOException {
+ Path installBase = pathCodec.deserialize(in);
+ HashCode installMd5 = null;
+ if (in.readBool()) {
+ installMd5 = HashCode.fromBytes(in.readByteArray());
+ }
+ Path outputBase = pathCodec.deserialize(in);
+ return new ServerDirectories(installBase, outputBase, installMd5);
+ }
+}