Skip to content

Commit 23ab2b0

Browse files
aoeuicopybara-github
authored andcommitted
Make Artifact codecs into DeferredObjectCodecs.
This makes them async-comptiable. PiperOrigin-RevId: 597604918 Change-Id: Ia30612832296c7790dd18b19e2da04b101d2f615
1 parent f93ceb1 commit 23ab2b0

File tree

1 file changed

+211
-43
lines changed

1 file changed

+211
-43
lines changed

src/main/java/com/google/devtools/build/lib/actions/ArtifactCodecs.java

Lines changed: 211 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,23 @@
2323
import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact;
2424
import com.google.devtools.build.lib.actions.Artifact.SpecialArtifactType;
2525
import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact;
26-
import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
26+
import com.google.devtools.build.lib.skyframe.serialization.AsyncDeserializationContext;
27+
import com.google.devtools.build.lib.skyframe.serialization.DeferredObjectCodec;
2728
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
2829
import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
2930
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
3031
import com.google.devtools.build.lib.vfs.PathFragment;
32+
import com.google.devtools.build.lib.vfs.Root;
3133
import com.google.protobuf.CodedInputStream;
3234
import com.google.protobuf.CodedOutputStream;
3335
import java.io.IOException;
36+
import java.util.function.Supplier;
3437

3538
/** Codec implementations for {@link Artifact} subclasses. */
3639
final class ArtifactCodecs {
3740

3841
@SuppressWarnings("unused") // Codec used by reflection.
39-
private static final class DerivedArtifactCodec implements ObjectCodec<DerivedArtifact> {
42+
private static final class DerivedArtifactCodec extends DeferredObjectCodec<DerivedArtifact> {
4043

4144
@Override
4245
public Class<DerivedArtifact> getEncodedClass() {
@@ -53,17 +56,52 @@ public void serialize(
5356
}
5457

5558
@Override
56-
public DerivedArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
59+
public Supplier<DerivedArtifact> deserializeDeferred(
60+
AsyncDeserializationContext context, CodedInputStream codedIn)
5761
throws SerializationException, IOException {
58-
ArtifactRoot root = context.deserialize(codedIn);
59-
PathFragment rootRelativePath = context.deserialize(codedIn);
60-
Object generatingActionKey = context.deserialize(codedIn);
61-
DerivedArtifact artifact =
62+
DeserializedDerivedArtifactBuilder builder =
63+
new DeserializedDerivedArtifactBuilder(
64+
context.getDependency(ArtifactSerializationContext.class));
65+
context.deserializeFully(codedIn, builder, DeserializedDerivedArtifactBuilder::setRoot);
66+
context.deserializeFully(
67+
codedIn, builder, DeserializedDerivedArtifactBuilder::setRootRelativePath);
68+
context.deserializeFully(
69+
codedIn, builder, DeserializedDerivedArtifactBuilder::setGeneratingActionKey);
70+
return builder;
71+
}
72+
}
73+
74+
private static class DeserializedDerivedArtifactBuilder implements Supplier<DerivedArtifact> {
75+
private final ArtifactSerializationContext context;
76+
private ArtifactRoot root;
77+
private PathFragment rootRelativePath;
78+
private Object generatingActionKey;
79+
80+
private DeserializedDerivedArtifactBuilder(ArtifactSerializationContext context) {
81+
this.context = context;
82+
}
83+
84+
@Override
85+
public DerivedArtifact get() {
86+
return context.intern(
6287
new DerivedArtifact(
6388
root,
6489
getExecPathForDeserialization(root, rootRelativePath, generatingActionKey),
65-
generatingActionKey);
66-
return context.getDependency(ArtifactSerializationContext.class).intern(artifact);
90+
generatingActionKey));
91+
}
92+
93+
private static void setRoot(DeserializedDerivedArtifactBuilder builder, Object value) {
94+
builder.root = (ArtifactRoot) value;
95+
}
96+
97+
private static void setRootRelativePath(
98+
DeserializedDerivedArtifactBuilder builder, Object value) {
99+
builder.rootRelativePath = (PathFragment) value;
100+
}
101+
102+
private static void setGeneratingActionKey(
103+
DeserializedDerivedArtifactBuilder builder, Object value) {
104+
builder.generatingActionKey = value;
67105
}
68106
}
69107

@@ -95,7 +133,7 @@ private static PathFragment getExecPathForDeserialization(
95133

96134
/** {@link ObjectCodec} for {@link SourceArtifact} */
97135
@SuppressWarnings("unused") // Used by reflection.
98-
private static final class SourceArtifactCodec implements ObjectCodec<SourceArtifact> {
136+
private static final class SourceArtifactCodec extends DeferredObjectCodec<SourceArtifact> {
99137

100138
@Override
101139
public Class<SourceArtifact> getEncodedClass() {
@@ -107,25 +145,55 @@ public void serialize(
107145
SerializationContext context, SourceArtifact obj, CodedOutputStream codedOut)
108146
throws SerializationException, IOException {
109147
context.serialize(obj.getExecPath(), codedOut);
110-
context.serialize(obj.getRoot(), codedOut);
148+
context.serialize(obj.getRoot().getRoot(), codedOut);
111149
context.serialize(obj.getArtifactOwner(), codedOut);
112150
}
113151

114152
@Override
115-
public SourceArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
153+
public Supplier<SourceArtifact> deserializeDeferred(
154+
AsyncDeserializationContext context, CodedInputStream codedIn)
116155
throws SerializationException, IOException {
117-
PathFragment execPath = context.deserialize(codedIn);
118-
ArtifactRoot artifactRoot = context.deserialize(codedIn);
119-
ArtifactOwner owner = context.deserialize(codedIn);
120-
return context
121-
.getDependency(ArtifactSerializationContext.class)
122-
.getSourceArtifact(execPath, artifactRoot.getRoot(), owner);
156+
DeserializedSourceArtifactBuilder builder =
157+
new DeserializedSourceArtifactBuilder(
158+
context.getDependency(ArtifactSerializationContext.class));
159+
context.deserializeFully(codedIn, builder, DeserializedSourceArtifactBuilder::setExecPath);
160+
context.deserializeFully(codedIn, builder, DeserializedSourceArtifactBuilder::setRoot);
161+
context.deserializeFully(codedIn, builder, DeserializedSourceArtifactBuilder::setOwner);
162+
return builder;
163+
}
164+
}
165+
166+
private static class DeserializedSourceArtifactBuilder implements Supplier<SourceArtifact> {
167+
private final ArtifactSerializationContext context;
168+
private PathFragment execPath;
169+
private Root root;
170+
private ArtifactOwner owner;
171+
172+
private DeserializedSourceArtifactBuilder(ArtifactSerializationContext context) {
173+
this.context = context;
174+
}
175+
176+
@Override
177+
public SourceArtifact get() {
178+
return context.getSourceArtifact(execPath, root, owner);
179+
}
180+
181+
private static void setExecPath(DeserializedSourceArtifactBuilder builder, Object value) {
182+
builder.execPath = (PathFragment) value;
183+
}
184+
185+
private static void setRoot(DeserializedSourceArtifactBuilder builder, Object value) {
186+
builder.root = (Root) value;
187+
}
188+
189+
private static void setOwner(DeserializedSourceArtifactBuilder builder, Object value) {
190+
builder.owner = (ArtifactOwner) value;
123191
}
124192
}
125193

126194
// Keep in sync with DerivedArtifactCodec.
127195
@SuppressWarnings("unused") // Used by reflection.
128-
private static final class SpecialArtifactCodec implements ObjectCodec<SpecialArtifact> {
196+
private static final class SpecialArtifactCodec extends DeferredObjectCodec<SpecialArtifact> {
129197

130198
@Override
131199
public Class<SpecialArtifact> getEncodedClass() {
@@ -143,26 +211,66 @@ public void serialize(
143211
}
144212

145213
@Override
146-
public SpecialArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
214+
public Supplier<SpecialArtifact> deserializeDeferred(
215+
AsyncDeserializationContext context, CodedInputStream codedIn)
147216
throws SerializationException, IOException {
148-
ArtifactRoot root = context.deserialize(codedIn);
149-
PathFragment rootRelativePath = context.deserialize(codedIn);
150-
Object generatingActionKey = context.deserialize(codedIn);
151-
SpecialArtifactType type = context.deserialize(codedIn);
152-
SpecialArtifact artifact =
153-
new SpecialArtifact(
154-
root,
155-
getExecPathForDeserialization(root, rootRelativePath, generatingActionKey),
156-
generatingActionKey,
157-
type);
217+
DeserializedSpecialArtifactBuilder builder =
218+
new DeserializedSpecialArtifactBuilder(
219+
context.getDependency(ArtifactSerializationContext.class));
220+
context.deserializeFully(codedIn, builder, DeserializedSpecialArtifactBuilder::setRoot);
221+
context.deserializeFully(
222+
codedIn, builder, DeserializedSpecialArtifactBuilder::setRootRelativePath);
223+
context.deserializeFully(
224+
codedIn, builder, DeserializedSpecialArtifactBuilder::setGeneratingActionKey);
225+
context.deserializeFully(codedIn, builder, DeserializedSpecialArtifactBuilder::setType);
226+
return builder;
227+
}
228+
}
229+
230+
private static class DeserializedSpecialArtifactBuilder implements Supplier<SpecialArtifact> {
231+
private final ArtifactSerializationContext context;
232+
private ArtifactRoot root;
233+
private PathFragment rootRelativePath;
234+
private Object generatingActionKey;
235+
private SpecialArtifactType type;
236+
237+
private DeserializedSpecialArtifactBuilder(ArtifactSerializationContext context) {
238+
this.context = context;
239+
}
240+
241+
@Override
242+
public SpecialArtifact get() {
158243
return (SpecialArtifact)
159-
context.getDependency(ArtifactSerializationContext.class).intern(artifact);
244+
context.intern(
245+
new SpecialArtifact(
246+
root,
247+
getExecPathForDeserialization(root, rootRelativePath, generatingActionKey),
248+
generatingActionKey,
249+
type));
250+
}
251+
252+
private static void setRoot(DeserializedSpecialArtifactBuilder builder, Object value) {
253+
builder.root = (ArtifactRoot) value;
254+
}
255+
256+
private static void setRootRelativePath(
257+
DeserializedSpecialArtifactBuilder builder, Object value) {
258+
builder.rootRelativePath = (PathFragment) value;
259+
}
260+
261+
private static void setGeneratingActionKey(
262+
DeserializedSpecialArtifactBuilder builder, Object value) {
263+
builder.generatingActionKey = value;
264+
}
265+
266+
private static void setType(DeserializedSpecialArtifactBuilder builder, Object value) {
267+
builder.type = (SpecialArtifactType) value;
160268
}
161269
}
162270

163271
@SuppressWarnings("unused") // Codec used by reflection.
164272
private static final class ArchivedTreeArtifactCodec
165-
implements ObjectCodec<ArchivedTreeArtifact> {
273+
extends DeferredObjectCodec<ArchivedTreeArtifact> {
166274

167275
@Override
168276
public Class<ArchivedTreeArtifact> getEncodedClass() {
@@ -181,24 +289,55 @@ public void serialize(
181289
}
182290

183291
@Override
184-
public ArchivedTreeArtifact deserialize(
185-
DeserializationContext context, CodedInputStream codedIn)
292+
public Supplier<ArchivedTreeArtifact> deserializeDeferred(
293+
AsyncDeserializationContext context, CodedInputStream codedIn)
186294
throws SerializationException, IOException {
187-
SpecialArtifact treeArtifact = context.deserialize(codedIn);
188-
PathFragment derivedTreeRoot = context.deserialize(codedIn);
189-
PathFragment rootRelativePath = context.deserialize(codedIn);
295+
DeserializedArchivedTreeArtifactBuilder builder =
296+
new DeserializedArchivedTreeArtifactBuilder();
297+
context.deserializeFully(
298+
codedIn, builder, DeserializedArchivedTreeArtifactBuilder::setTreeArtifact);
299+
context.deserializeFully(
300+
codedIn, builder, DeserializedArchivedTreeArtifactBuilder::setDerivedTreeRoot);
301+
context.deserializeFully(
302+
codedIn, builder, DeserializedArchivedTreeArtifactBuilder::setRootRelativePath);
303+
return builder;
304+
}
305+
}
306+
307+
private static class DeserializedArchivedTreeArtifactBuilder
308+
implements Supplier<ArchivedTreeArtifact> {
309+
private SpecialArtifact treeArtifact;
310+
private PathFragment derivedTreeRoot;
311+
private PathFragment rootRelativePath;
312+
313+
@Override
314+
public ArchivedTreeArtifact get() {
190315
Object generatingActionKey =
191316
treeArtifact.hasGeneratingActionKey()
192317
? treeArtifact.getGeneratingActionKey()
193318
: OMITTED_FOR_SERIALIZATION;
194-
195319
return ArchivedTreeArtifact.createInternal(
196320
treeArtifact, derivedTreeRoot, rootRelativePath, generatingActionKey);
197321
}
322+
323+
private static void setTreeArtifact(
324+
DeserializedArchivedTreeArtifactBuilder builder, Object value) {
325+
builder.treeArtifact = (SpecialArtifact) value;
326+
}
327+
328+
private static void setDerivedTreeRoot(
329+
DeserializedArchivedTreeArtifactBuilder builder, Object value) {
330+
builder.derivedTreeRoot = (PathFragment) value;
331+
}
332+
333+
private static void setRootRelativePath(
334+
DeserializedArchivedTreeArtifactBuilder builder, Object value) {
335+
builder.rootRelativePath = (PathFragment) value;
336+
}
198337
}
199338

200339
@SuppressWarnings("unused") // Used by reflection.
201-
private static final class TreeFileArtifactCodec implements ObjectCodec<TreeFileArtifact> {
340+
private static final class TreeFileArtifactCodec extends DeferredObjectCodec<TreeFileArtifact> {
202341

203342
@Override
204343
public Class<TreeFileArtifact> getEncodedClass() {
@@ -215,13 +354,42 @@ public void serialize(
215354
}
216355

217356
@Override
218-
public TreeFileArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
357+
public Supplier<TreeFileArtifact> deserializeDeferred(
358+
AsyncDeserializationContext context, CodedInputStream codedIn)
219359
throws SerializationException, IOException {
220-
SpecialArtifact parent = context.deserialize(codedIn);
221-
PathFragment parentRelativePath = context.deserialize(codedIn);
222-
Object generatingActionKey = context.deserialize(codedIn);
360+
DeserializedTreeFileArtifactBuilder builder = new DeserializedTreeFileArtifactBuilder();
361+
context.deserializeFully(codedIn, builder, DeserializedTreeFileArtifactBuilder::setParent);
362+
context.deserializeFully(
363+
codedIn, builder, DeserializedTreeFileArtifactBuilder::setParentRelativePath);
364+
context.deserializeFully(
365+
codedIn, builder, DeserializedTreeFileArtifactBuilder::setGeneratingActionKey);
366+
return builder;
367+
}
368+
}
369+
370+
private static class DeserializedTreeFileArtifactBuilder implements Supplier<TreeFileArtifact> {
371+
private SpecialArtifact parent;
372+
private PathFragment parentRelativePath;
373+
private Object generatingActionKey;
374+
375+
@Override
376+
public TreeFileArtifact get() {
223377
return new TreeFileArtifact(parent, parentRelativePath, generatingActionKey);
224378
}
379+
380+
private static void setParent(DeserializedTreeFileArtifactBuilder builder, Object value) {
381+
builder.parent = (SpecialArtifact) value;
382+
}
383+
384+
private static void setParentRelativePath(
385+
DeserializedTreeFileArtifactBuilder builder, Object value) {
386+
builder.parentRelativePath = (PathFragment) value;
387+
}
388+
389+
private static void setGeneratingActionKey(
390+
DeserializedTreeFileArtifactBuilder builder, Object value) {
391+
builder.generatingActionKey = value;
392+
}
225393
}
226394

227395
private ArtifactCodecs() {}

0 commit comments

Comments
 (0)