diff --git a/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java b/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java index 6ee33af32407fe..5d4921ee0a3e60 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java @@ -127,19 +127,39 @@ public byte[] getValueFingerprint() { return getDigest(); } + /** Returns whether the file contents exist remotely. */ + public boolean isRemote() { + return false; + } + + /** Returns the location index for remote files. For non-remote files, returns 0. */ + public int getLocationIndex() { + return 0; + } + /** - * Index used to resolve remote files. + * Returns the time when the remote file contents expire. If the contents never expire, including + * when they're not remote, returns null. * - *

0 indicates that no such information is available which can mean that it's either a local - * file, empty, or an omitted output. + *

The expiration time does not factor into equality, as it can be mutated by {@link + * #setExpirationTime}. */ - public int getLocationIndex() { - return 0; + @Nullable + public Instant getExpirationTime() { + return null; } - /** Returns whether the file contents exist remotely. */ - public boolean isRemote() { - return false; + /** + * Sets the expiration time. If this metadata was originally constructed without an expiration + * time, does nothing. + */ + public void setExpirationTime(Instant newExpirationTime) {} + + /** + * Returns whether the file contents are available (either locally, or remotely and not expired). + */ + public final boolean isAlive(Instant now) { + return getExpirationTime() == null || getExpirationTime().isAfter(now); } /** @@ -566,10 +586,10 @@ public static RemoteFileArtifactValueWithMaterializationData createWithMateriali byte[] digest, long size, int locationIndex, - long expireAtEpochMilli, + @Nullable Instant expirationTime, @Nullable PathFragment materializationExecPath) { return new RemoteFileArtifactValueWithMaterializationData( - digest, size, locationIndex, materializationExecPath, expireAtEpochMilli); + digest, size, locationIndex, materializationExecPath, expirationTime); } /** @@ -586,7 +606,7 @@ public static RemoteFileArtifactValue createFromExistingWithMaterializationPath( metadata.getDigest(), metadata.getSize(), metadata.getLocationIndex(), - metadata.getExpireAtEpochMilli(), + metadata.getExpirationTime(), metadata.getMaterializationExecPath().orElse(materializationExecPath)); } @@ -635,26 +655,6 @@ public final int getLocationIndex() { return locationIndex; } - /** - * Returns the time when the remote file expires in milliseconds since epoch. A negative value - * means the remote is not known to expire. - * - *

Expiration time does not contribute to equality of remote files. - */ - public long getExpireAtEpochMilli() { - return -1; - } - - /** - * Extends the expiration time for this metadata. If it was constructed without known expiration - * time (i.e. expireAtEpochMilli < 0), this extension does nothing. - */ - public void extendExpireAtEpochMilli(long expireAtEpochMilli) {} - - public boolean isAlive(Instant now) { - return true; - } - @Override public final boolean wasModifiedSinceDigest(Path path) { return false; @@ -682,32 +682,38 @@ public String toString() { public static final class RemoteFileArtifactValueWithMaterializationData extends RemoteFileArtifactValue { @Nullable private final PathFragment materializationExecPath; - private long expireAtEpochMilli; + private long expirationTime; @Nullable private FileContentsProxy proxy; private RemoteFileArtifactValueWithMaterializationData( byte[] digest, long size, int locationIndex, - PathFragment materializationExecPath, - long expireAtEpochMilli) { + @Nullable PathFragment materializationExecPath, + @Nullable Instant expirationTime) { super(digest, size, locationIndex); this.materializationExecPath = materializationExecPath; - this.expireAtEpochMilli = expireAtEpochMilli; + this.expirationTime = toEpochMilli(expirationTime); + } + + private static long toEpochMilli(@Nullable Instant expirationTime) { + return expirationTime != null ? expirationTime.toEpochMilli() : -1; + } + + @Nullable + private static Instant fromEpochMilli(long expirationTime) { + return expirationTime >= 0 ? Instant.ofEpochMilli(expirationTime) : null; } @Override - public long getExpireAtEpochMilli() { - return expireAtEpochMilli; + @Nullable + public Instant getExpirationTime() { + return fromEpochMilli(expirationTime); } @Override - public void extendExpireAtEpochMilli(long expireAtEpochMilli) { - if (expireAtEpochMilli < 0) { - return; - } - checkState(expireAtEpochMilli > this.expireAtEpochMilli); - this.expireAtEpochMilli = expireAtEpochMilli; + public void setExpirationTime(Instant expirationTime) { + this.expirationTime = toEpochMilli(expirationTime); } /** @@ -738,14 +744,6 @@ public boolean canSetContentsProxy() { return true; } - @Override - public boolean isAlive(Instant now) { - if (expireAtEpochMilli < 0) { - return true; - } - return now.toEpochMilli() < expireAtEpochMilli; - } - @Override public Optional getMaterializationExecPath() { return Optional.ofNullable(materializationExecPath); @@ -779,7 +777,7 @@ public String toString() { .add("size", getSize()) .add("locationIndex", getLocationIndex()) .add("materializationExecPath", materializationExecPath) - .add("expireAtEpochMilli", expireAtEpochMilli) + .add("expirationTime", fromEpochMilli(expirationTime)) .add("proxy", proxy) .toString(); } diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java b/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java index c92237f36cc663..62f0c0308a94c5 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java +++ b/src/main/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCache.java @@ -506,7 +506,8 @@ private static void encodeRemoteMetadata( VarInt.putVarInt(value.getLocationIndex(), sink); - VarInt.putVarLong(value.getExpireAtEpochMilli(), sink); + VarInt.putVarLong( + value.getExpirationTime() != null ? value.getExpirationTime().toEpochMilli() : -1, sink); Optional materializationExecPath = value.getMaterializationExecPath(); if (materializationExecPath.isPresent()) { @@ -532,7 +533,7 @@ private static RemoteFileArtifactValue decodeRemoteMetadata( int locationIndex = VarInt.getVarInt(source); - long expireAtEpochMilli = VarInt.getVarLong(source); + long expirationTimeEpochMilli = VarInt.getVarLong(source); PathFragment materializationExecPath = null; int numMaterializationExecPath = VarInt.getVarInt(source); @@ -544,12 +545,16 @@ private static RemoteFileArtifactValue decodeRemoteMetadata( PathFragment.create(getStringForIndex(indexer, VarInt.getVarInt(source))); } - if (expireAtEpochMilli < 0 && materializationExecPath == null) { + if (expirationTimeEpochMilli < 0 && materializationExecPath == null) { return RemoteFileArtifactValue.create(digest, size, locationIndex); } return RemoteFileArtifactValue.createWithMaterializationData( - digest, size, locationIndex, expireAtEpochMilli, materializationExecPath); + digest, + size, + locationIndex, + Instant.ofEpochMilli(expirationTimeEpochMilli), + materializationExecPath); } /** diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java index 6d6efc511f45b6..1e5acd001e838f 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java @@ -59,6 +59,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.channels.SeekableByteChannel; +import java.time.Instant; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -299,7 +300,7 @@ public void updateContext(ActionExecutionMetadata action) { this.action = action; } - void injectRemoteFile(PathFragment path, byte[] digest, long size, long expireAtEpochMilli) + void injectRemoteFile(PathFragment path, byte[] digest, long size, Instant expirationTime) throws IOException { if (!isOutput(path)) { return; @@ -309,7 +310,7 @@ void injectRemoteFile(PathFragment path, byte[] digest, long size, long expireAt digest, size, /* locationIndex= */ 1, - expireAtEpochMilli, + expirationTime, /* materializationExecPath= */ null); remoteOutputTree.injectFile(path, metadata); } diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java index 60ed5e1872a73b..65cd1ab0973c18 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java @@ -1280,7 +1280,7 @@ public InMemoryOutput downloadOutputs(RemoteAction action, RemoteActionResult re combinedCache, digestUtil, context, action.getRemotePathResolver()); // The expiration time for remote cache entries. - var expireAtEpochMilli = Instant.now().plus(remoteOptions.remoteCacheTtl).toEpochMilli(); + var expirationTime = Instant.now().plus(remoteOptions.remoteCacheTtl); ActionInput inMemoryOutput = null; AtomicReference inMemoryOutputData = new AtomicReference<>(null); @@ -1325,7 +1325,7 @@ public InMemoryOutput downloadOutputs(RemoteAction action, RemoteActionResult re file.path().asFragment(), DigestUtil.toBinaryDigest(file.digest()), file.digest().getSizeBytes(), - expireAtEpochMilli); + expirationTime); } if (isInMemoryOutputFile) { @@ -1373,7 +1373,7 @@ public InMemoryOutput downloadOutputs(RemoteAction action, RemoteActionResult re file.path().asFragment(), DigestUtil.toBinaryDigest(file.digest()), file.digest().getSizeBytes(), - expireAtEpochMilli); + expirationTime); } } } diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java index d098b6bf15c127..b5c1ece87462bf 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java @@ -31,7 +31,6 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.FileArtifactValue; -import com.google.devtools.build.lib.actions.FileArtifactValue.RemoteFileArtifactValue; import com.google.devtools.build.lib.actions.cache.ActionCache; import com.google.devtools.build.lib.actions.cache.ActionCache.Entry; import com.google.devtools.build.lib.actions.cache.ActionCache.Entry.SerializableTreeArtifactValue; @@ -128,7 +127,7 @@ private void doExtendLeases() { // issue one giant `FindMissingBlobs` call to avoid increasing memory footprint. Since // this happens in the background, increased network calls are acceptable. try (var silentCloseable1 = Profiler.instance().profile(action.describe())) { - extendLeaseForAction(action, remoteFiles, earliestExpiration.toEpochMilli()); + extendLeaseForAction(action, remoteFiles, earliestExpiration); } } } @@ -152,7 +151,7 @@ private void doExtendLeases() { } private static boolean isRemoteMetadataWithTtl(FileArtifactValue metadata) { - return metadata.isRemote() && ((RemoteFileArtifactValue) metadata).getExpireAtEpochMilli() >= 0; + return metadata.isRemote() && metadata.getExpirationTime() != null; } private ImmutableList> collectRemoteFiles( @@ -179,7 +178,7 @@ private ImmutableList> collectR private void extendLeaseForAction( Action action, ImmutableList> remoteFiles, - long expireAtEpochMilli) + Instant expirationTime) throws IOException, InterruptedException { ImmutableSet missingDigests; try (var silentCloseable = Profiler.instance().profile("findMissingDigests")) { @@ -196,15 +195,15 @@ private void extendLeaseForAction( var token = getActionCacheToken(action); for (var remoteFile : remoteFiles) { var artifact = remoteFile.getKey(); - var metadata = (RemoteFileArtifactValue) remoteFile.getValue(); + var metadata = remoteFile.getValue(); // Only extend the lease for the remote output if it is still alive remotely. if (!missingDigests.contains(buildDigest(metadata))) { - metadata.extendExpireAtEpochMilli(expireAtEpochMilli); + metadata.setExpirationTime(expirationTime); if (token != null) { if (artifact instanceof TreeFileArtifact treeFileArtifact) { - token.extendOutputTreeFile(treeFileArtifact, expireAtEpochMilli); + token.extendOutputTreeFile(treeFileArtifact, expirationTime); } else { - token.extendOutputFile(artifact, expireAtEpochMilli); + token.extendOutputFile(artifact, expirationTime); } } } @@ -260,20 +259,20 @@ private static class ActionCacheToken { this.entry = entry; } - void extendOutputFile(Artifact artifact, long expireAtEpochMilli) { + void extendOutputFile(Artifact artifact, Instant expirationTime) { var metadata = entry.getOutputFile(artifact); if (metadata != null) { - metadata.extendExpireAtEpochMilli(expireAtEpochMilli); + metadata.setExpirationTime(expirationTime); dirty = true; } } - void extendOutputTreeFile(TreeFileArtifact treeFile, long expireAtEpochMilli) { + void extendOutputTreeFile(TreeFileArtifact treeFile, Instant expirationTime) { SerializableTreeArtifactValue treeMetadata = entry.getOutputTree(treeFile.getParent()); if (treeMetadata != null) { var metadata = treeMetadata.childValues().get(treeFile.getTreeRelativePathString()); if (metadata != null) { - metadata.extendExpireAtEpochMilli(expireAtEpochMilli); + metadata.setExpirationTime(expirationTime); dirty = true; } } diff --git a/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java b/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java index c1a7995da59749..ea3c4562b9e0a3 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java @@ -466,14 +466,16 @@ private RemoteFileArtifactValue createRemoteFileMetadata( String content, @Nullable PathFragment materializationExecPath) { byte[] bytes = content.getBytes(UTF_8); return RemoteFileArtifactValue.createWithMaterializationData( - digest(bytes), bytes.length, 1, /* expireAtEpochMilli= */ -1, materializationExecPath); + digest(bytes), bytes.length, 1, /* expirationTime= */ null, materializationExecPath); } private RemoteFileArtifactValue createRemoteFileMetadata( - String content, long expireAtEpochMilli, @Nullable PathFragment materializationExecPath) { + String content, + @Nullable Instant expirationTime, + @Nullable PathFragment materializationExecPath) { byte[] bytes = content.getBytes(UTF_8); return RemoteFileArtifactValue.createWithMaterializationData( - digest(bytes), bytes.length, 1, expireAtEpochMilli, materializationExecPath); + digest(bytes), bytes.length, 1, expirationTime, materializationExecPath); } private static TreeArtifactValue createTreeMetadata( @@ -609,7 +611,9 @@ public void saveOutputMetadata_remoteFileExpired_remoteFileMetadataNotLoaded() t new InjectOutputFileMetadataAction( output, createRemoteFileMetadata( - content, /* expireAtEpochMilli= */ 0, /* materializationExecPath= */ null)); + content, + /* expirationTime= */ Instant.ofEpochMilli(1), + /* materializationExecPath= */ null)); FakeInputMetadataHandler metadataHandler = new FakeInputMetadataHandler(); runAction(action); @@ -1190,7 +1194,9 @@ public void saveOutputMetadata_treeFileExpired_treeMetadataNotLoaded() throws Ex "file1", createRemoteFileMetadata("content1"), "file2", createRemoteFileMetadata( - "content2", /* expireAtEpochMilli= */ 0, /* materializationExecPath= */ null)); + "content2", + /* expirationTime= */ Instant.ofEpochMilli(1), + /* materializationExecPath= */ null)); Action action = new InjectOutputTreeMetadataAction( output, @@ -1240,7 +1246,7 @@ public void saveOutputMetadata_archivedRepresentationExpired_treeMetadataNotLoad /* archivedArtifactValue= */ Optional.of( createRemoteFileMetadata( "archived", - /* expireAtEpochMilli= */ 0, + /* expirationTime= */ Instant.ofEpochMilli(1), /* materializationExecPath= */ null)), /* materializationExecPath= */ Optional.empty())); FakeInputMetadataHandler metadataHandler = new FakeInputMetadataHandler(); diff --git a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java index 838af5eda54dee..dd1c3bcfadbc2c 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.Map; import java.util.Optional; import javax.annotation.Nullable; @@ -219,7 +220,7 @@ private FileArtifactValue createLocalMetadata(Artifact artifact, String content) private RemoteFileArtifactValue createRemoteMetadata( Artifact artifact, String content, - long expireAtEpochMilli, + @Nullable Instant expirationTime, @Nullable PathFragment materializationExecPath) { byte[] bytes = content.getBytes(StandardCharsets.UTF_8); byte[] digest = @@ -231,13 +232,13 @@ private RemoteFileArtifactValue createRemoteMetadata( .hashBytes(bytes) .asBytes(); return RemoteFileArtifactValue.createWithMaterializationData( - digest, bytes.length, 1, expireAtEpochMilli, materializationExecPath); + digest, bytes.length, 1, expirationTime, materializationExecPath); } private RemoteFileArtifactValue createRemoteMetadata( Artifact artifact, String content, @Nullable PathFragment materializationExecPath) { return createRemoteMetadata( - artifact, content, /* expireAtEpochMilli= */ -1, materializationExecPath); + artifact, content, /* expirationTime= */ null, materializationExecPath); } private RemoteFileArtifactValue createRemoteMetadata(Artifact artifact, String content) { @@ -282,21 +283,21 @@ public void putAndGet_savesRemoteFileMetadata() { } @Test - public void putAndGet_savesRemoteFileMetadata_withExpireAtEpochMilli() { + public void putAndGet_savesRemoteFileMetadata_withExpirationTime() { String key = "key"; ActionCache.Entry entry = new ActionCache.Entry(key, ImmutableMap.of(), false, OutputPermissions.READONLY); Artifact artifact = ActionsTestUtil.DUMMY_ARTIFACT; - long expireAtEpochMilli = Instant.now().toEpochMilli(); + Instant expirationTime = Instant.now().truncatedTo(ChronoUnit.MILLIS); RemoteFileArtifactValue metadata = createRemoteMetadata( - artifact, "content", expireAtEpochMilli, /* materializationExecPath= */ null); + artifact, "content", expirationTime, /* materializationExecPath= */ null); entry.addOutputFile(artifact, metadata, /* saveFileMetadata= */ true); cache.put(key, entry); entry = cache.get(key); - assertThat(entry.getOutputFile(artifact).getExpireAtEpochMilli()).isEqualTo(expireAtEpochMilli); + assertThat(entry.getOutputFile(artifact).getExpirationTime()).isEqualTo(expirationTime); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/remote/ActionInputPrefetcherTestBase.java b/src/test/java/com/google/devtools/build/lib/remote/ActionInputPrefetcherTestBase.java index e78e1bf9099c39..dab0fca3971014 100644 --- a/src/test/java/com/google/devtools/build/lib/remote/ActionInputPrefetcherTestBase.java +++ b/src/test/java/com/google/devtools/build/lib/remote/ActionInputPrefetcherTestBase.java @@ -159,7 +159,7 @@ protected Artifact createRemoteArtifact( hashCode.asBytes(), contentsBytes.length, /* locationIndex= */ 1, - /* expireAtEpochMilli= */ -1, + /* expirationTime= */ null, materializationExecPath); metadata.put(a, f); if (cas != null) { @@ -217,7 +217,7 @@ protected Pair> createRemoteTre hashCode.asBytes(), contents.length, /* locationIndex= */ 1, - /* expireAtEpochMilli= */ -1, + /* expirationTime= */ null, /* materializationExecPath= */ null); treeBuilder.putChild(child, childValue); metadata.put(child, childValue); diff --git a/src/test/java/com/google/devtools/build/lib/remote/RemoteActionFileSystemTest.java b/src/test/java/com/google/devtools/build/lib/remote/RemoteActionFileSystemTest.java index 0926ec62071187..3bebd59c7b4f66 100644 --- a/src/test/java/com/google/devtools/build/lib/remote/RemoteActionFileSystemTest.java +++ b/src/test/java/com/google/devtools/build/lib/remote/RemoteActionFileSystemTest.java @@ -1324,12 +1324,12 @@ protected FileArtifactValue injectRemoteFile( byte[] digest = getDigest(content); int size = Utf8.encodedLength(content); ((RemoteActionFileSystem) actionFs) - .injectRemoteFile(path, digest, size, /* expireAtEpochMilli= */ -1); + .injectRemoteFile(path, digest, size, /* expirationTime= */ null); return RemoteFileArtifactValue.createWithMaterializationData( digest, size, /* locationIndex= */ 1, - /* expireAtEpochMilli= */ -1, + /* expirationTime= */ null, /* materializationExecPath= */ null); } @@ -1350,7 +1350,7 @@ private Artifact createRemoteArtifact( getDigest(content), Utf8.encodedLength(content), /* locationIndex= */ 1, - /* expireAtEpochMilli= */ -1, + /* expirationTime= */ null, /* materializationExecPath= */ null); inputs.putWithNoDepOwner(a, f); return a; @@ -1376,7 +1376,7 @@ private TreeArtifactValue createRemoteTreeArtifactValue( getDigest(content), Utf8.encodedLength(content), /* locationIndex= */ 0, - /* expireAtEpochMilli= */ -1, + /* expirationTime= */ null, /* materializationExecPath= */ null); builder.putChild(child, childMeta); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStoreTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStoreTest.java index 5cea162f2332ff..ab3d8afc4e2ab9 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStoreTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStoreTest.java @@ -446,7 +446,7 @@ private static FileArtifactValue createFileMetadataForSymlinkTest( return FileArtifactValue.createForNormalFile(new byte[] {1, 2, 3}, /* proxy= */ null, 10); case REMOTE: return RemoteFileArtifactValue.createWithMaterializationData( - new byte[] {1, 2, 3}, 10, 1, -1, materializationExecPath); + new byte[] {1, 2, 3}, 10, 1, null, materializationExecPath); } throw new AssertionError(); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java index 06f6de95b5c22d..3f6bf646c9cb12 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; import java.io.IOException; +import java.time.Instant; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -91,15 +92,15 @@ public void testEqualsAndHashCode() { // expireAtEpochMilli doesn't contribute to the equality RemoteFileArtifactValue.createWithMaterializationData( toBytes("00112233445566778899AABBCCDDEEFF"), - 1, - 1, - 1, + /* size= */ 1, + /* locationIndex= */ 1, + /* expirationTime= */ Instant.ofEpochMilli(1), /* materializationExecPath= */ null), RemoteFileArtifactValue.createWithMaterializationData( toBytes("00112233445566778899AABBCCDDEEFF"), - 1, - 1, - 2, + /* size= */ 1, + /* locationIndex= */ 1, + /* expirationTime= */ Instant.ofEpochMilli(2), /* materializationExecPath= */ null)) .addEqualityGroup(FileArtifactValue.MISSING_FILE_MARKER) .addEqualityGroup(FileArtifactValue.RUNFILES_TREE_MARKER) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java index 90426b36838a49..fdd0cd12a12094 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java @@ -1395,16 +1395,16 @@ private static Delta actionValueWithRemoteArtifact( private RemoteFileArtifactValueWithMaterializationData createRemoteFileArtifactValue( String contents) { - return createRemoteFileArtifactValue(contents, /* expireAtEpochMilli= */ -1); + return createRemoteFileArtifactValue(contents, /* expirationTime= */ null); } private RemoteFileArtifactValueWithMaterializationData createRemoteFileArtifactValue( - String contents, long expireAtEpochMilli) { + String contents, Instant expirationTime) { byte[] data = contents.getBytes(); DigestHashFunction hashFn = fs.getDigestFunction(); HashCode hash = hashFn.getHashFunction().hashBytes(data); return RemoteFileArtifactValue.createWithMaterializationData( - hash.asBytes(), data.length, -1, expireAtEpochMilli, /* materializationExecPath= */ null); + hash.asBytes(), data.length, -1, expirationTime, /* materializationExecPath= */ null); } @Test @@ -1557,7 +1557,7 @@ public void testRemoteArtifactsExpired() throws Exception { metadataToInject.put( actionKey2, actionValueWithRemoteArtifact( - out2, createRemoteFileArtifactValue("bar-content", /* expireAtEpochMilli= */ 0))); + out2, createRemoteFileArtifactValue("bar-content", Instant.ofEpochMilli(1)))); differencer.inject(metadataToInject); EvaluationContext evaluationContext = @@ -1797,7 +1797,7 @@ public void testRemoteTreeArtifactsExpired() throws Exception { createRemoteFileArtifactValue("foo-content")) .putChild( TreeFileArtifact.createTreeOutput(treeArtifact, "bar"), - createRemoteFileArtifactValue("bar-content", /* expireAtEpochMilli= */ 0)) + createRemoteFileArtifactValue("bar-content", Instant.ofEpochMilli(1))) .build(); differencer.inject(ImmutableMap.of(actionKey, actionValueWithTreeArtifact(treeArtifact, tree))); @@ -1843,7 +1843,7 @@ public void testRemoteTreeArtifacts_archivedRepresentationExpired() throws Excep createRemoteFileArtifactValue("bar-content")) .setArchivedRepresentation( createArchivedTreeArtifactWithContent(treeArtifact), - createRemoteFileArtifactValue("archived", /* expireAtEpochMilli= */ 0)) + createRemoteFileArtifactValue("archived", Instant.ofEpochMilli(1))) .build(); differencer.inject(ImmutableMap.of(actionKey, actionValueWithTreeArtifact(treeArtifact, tree)));