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)));