Skip to content

Commit 60638af

Browse files
Set oldest_content_accepted for remote downloader requests without the checksum
This PR address the #23932 issue with remote downloader. Closes #23970. PiperOrigin-RevId: 686180819 Change-Id: Ia36c5793622bd1ac1fdaa9ef1326ddc385a5a01f
1 parent 986150a commit 60638af

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

src/main/java/com/google/devtools/build/lib/remote/downloader/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ java_library(
1616
srcs = glob(["*.java"]),
1717
deps = [
1818
"//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
19+
"//src/main/java/com/google/devtools/build/lib/clock",
1920
"//src/main/java/com/google/devtools/build/lib/events",
2021
"//src/main/java/com/google/devtools/build/lib/remote:ReferenceCountedChannel",
2122
"//src/main/java/com/google/devtools/build/lib/remote:Retrier",
@@ -27,6 +28,7 @@ java_library(
2728
"//third_party:guava",
2829
"//third_party:jsr305",
2930
"//third_party/grpc-java:grpc-jar",
31+
"@protobuf//:protobuf_java_util",
3032
"@remoteapis//:build_bazel_remote_asset_v1_remote_asset_java_grpc",
3133
"@remoteapis//:build_bazel_remote_asset_v1_remote_asset_java_proto",
3234
"@remoteapis//:build_bazel_remote_execution_v2_remote_execution_java_proto",

src/main/java/com/google/devtools/build/lib/remote/downloader/GrpcRemoteDownloader.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.devtools.build.lib.bazel.repository.downloader.Checksum;
2929
import com.google.devtools.build.lib.bazel.repository.downloader.Downloader;
3030
import com.google.devtools.build.lib.bazel.repository.downloader.HashOutputStream;
31+
import com.google.devtools.build.lib.clock.BlazeClock;
3132
import com.google.devtools.build.lib.events.Event;
3233
import com.google.devtools.build.lib.events.ExtendedEventHandler;
3334
import com.google.devtools.build.lib.remote.ReferenceCountedChannel;
@@ -38,13 +39,15 @@
3839
import com.google.devtools.build.lib.remote.util.TracingMetadataUtils;
3940
import com.google.devtools.build.lib.remote.util.Utils;
4041
import com.google.devtools.build.lib.vfs.Path;
42+
import com.google.protobuf.util.Timestamps;
4143
import io.grpc.CallCredentials;
4244
import io.grpc.Channel;
4345
import io.grpc.StatusRuntimeException;
4446
import java.io.IOException;
4547
import java.io.OutputStream;
4648
import java.net.URISyntaxException;
4749
import java.net.URL;
50+
import java.time.Duration;
4851
import java.util.List;
4952
import java.util.Map;
5053
import java.util.Optional;
@@ -235,6 +238,12 @@ static FetchBlobRequest newFetchBlobRequest(
235238
.setName(QUALIFIER_CHECKSUM_SRI)
236239
.setValue(checksum.get().toSubresourceIntegrity())
237240
.build());
241+
} else {
242+
// If no checksum is provided, never accept cached content.
243+
// Timestamp is offset by an hour to account for clock skew.
244+
requestBuilder.setOldestContentAccepted(
245+
Timestamps.fromMillis(
246+
BlazeClock.instance().now().plus(Duration.ofHours(1)).toEpochMilli()));
238247
}
239248

240249
if (!Strings.isNullOrEmpty(canonicalId)) {

src/test/java/com/google/devtools/build/lib/remote/downloader/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ java_library(
2424
"//src/main/java/com/google/devtools/build/lib/authandtls",
2525
"//src/main/java/com/google/devtools/build/lib/bazel/repository/cache",
2626
"//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
27+
"//src/main/java/com/google/devtools/build/lib/clock",
2728
"//src/main/java/com/google/devtools/build/lib/events",
2829
"//src/main/java/com/google/devtools/build/lib/remote",
2930
"//src/main/java/com/google/devtools/build/lib/remote/common",
@@ -44,6 +45,7 @@ java_library(
4445
"//third_party:truth",
4546
"//third_party/grpc-java:grpc-jar",
4647
"@protobuf//:protobuf_java",
48+
"@protobuf//:protobuf_java_util",
4749
"@remoteapis//:build_bazel_remote_asset_v1_remote_asset_java_grpc",
4850
"@remoteapis//:build_bazel_remote_asset_v1_remote_asset_java_proto",
4951
"@remoteapis//:build_bazel_remote_execution_v2_remote_execution_java_proto",

src/test/java/com/google/devtools/build/lib/remote/downloader/GrpcRemoteDownloaderTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.google.devtools.build.lib.bazel.repository.downloader.Checksum;
4343
import com.google.devtools.build.lib.bazel.repository.downloader.Downloader;
4444
import com.google.devtools.build.lib.bazel.repository.downloader.UnrecoverableHttpException;
45+
import com.google.devtools.build.lib.clock.BlazeClock;
4546
import com.google.devtools.build.lib.events.ExtendedEventHandler;
4647
import com.google.devtools.build.lib.remote.ChannelConnectionWithServerCapabilitiesFactory;
4748
import com.google.devtools.build.lib.remote.ReferenceCountedChannel;
@@ -54,13 +55,15 @@
5455
import com.google.devtools.build.lib.remote.util.InMemoryCacheClient;
5556
import com.google.devtools.build.lib.remote.util.TestUtils;
5657
import com.google.devtools.build.lib.remote.util.TracingMetadataUtils;
58+
import com.google.devtools.build.lib.testutil.ManualClock;
5759
import com.google.devtools.build.lib.testutil.Scratch;
5860
import com.google.devtools.build.lib.vfs.DigestHashFunction;
5961
import com.google.devtools.build.lib.vfs.FileSystemUtils;
6062
import com.google.devtools.build.lib.vfs.Path;
6163
import com.google.devtools.build.lib.vfs.SyscallCache;
6264
import com.google.devtools.common.options.Options;
6365
import com.google.protobuf.ByteString;
66+
import com.google.protobuf.util.Timestamps;
6467
import io.grpc.CallCredentials;
6568
import io.grpc.ManagedChannel;
6669
import io.grpc.Server;
@@ -73,6 +76,7 @@
7376
import java.io.InputStream;
7477
import java.net.URI;
7578
import java.net.URL;
79+
import java.time.Duration;
7680
import java.util.HashMap;
7781
import java.util.List;
7882
import java.util.Map;
@@ -90,6 +94,8 @@
9094
@RunWith(JUnit4.class)
9195
public class GrpcRemoteDownloaderTest {
9296

97+
private static final ManualClock clock = new ManualClock();
98+
9399
private static final DigestUtil DIGEST_UTIL =
94100
new DigestUtil(SyscallCache.NO_CACHE, DigestHashFunction.SHA256);
95101

@@ -117,6 +123,8 @@ public final void setUp() throws Exception {
117123
context = RemoteActionExecutionContext.create(metadata);
118124

119125
retryService = MoreExecutors.listeningDecorator(Executors.newScheduledThreadPool(1));
126+
127+
BlazeClock.setClock(clock);
120128
}
121129

122130
@After
@@ -212,6 +220,8 @@ public void fetchBlob(
212220
.isEqualTo(
213221
FetchBlobRequest.newBuilder()
214222
.setDigestFunction(DIGEST_UTIL.getDigestFunction())
223+
.setOldestContentAccepted(
224+
Timestamps.fromMillis(clock.advance(Duration.ofHours(1))))
215225
.addUris("http://example.com/content.txt")
216226
.build());
217227
responseObserver.onNext(
@@ -474,4 +484,29 @@ public void testFetchBlobRequest_withoutCredentialsPropagation() throws Exceptio
474484
Qualifier.newBuilder().setName("bazel.canonical_id").setValue("canonical ID"))
475485
.build());
476486
}
487+
488+
@Test
489+
public void testFetchBlobRequest_withoutChecksum() throws Exception {
490+
FetchBlobRequest request =
491+
GrpcRemoteDownloader.newFetchBlobRequest(
492+
"instance name",
493+
false,
494+
ImmutableList.of(new URI("http://example.com/").toURL()),
495+
Optional.<Checksum>empty(),
496+
"canonical ID",
497+
DIGEST_UTIL.getDigestFunction(),
498+
ImmutableMap.of(),
499+
StaticCredentials.EMPTY);
500+
501+
assertThat(request)
502+
.isEqualTo(
503+
FetchBlobRequest.newBuilder()
504+
.setInstanceName("instance name")
505+
.setDigestFunction(DIGEST_UTIL.getDigestFunction())
506+
.setOldestContentAccepted(Timestamps.fromMillis(clock.advance(Duration.ofHours(1))))
507+
.addUris("http://example.com/")
508+
.addQualifiers(
509+
Qualifier.newBuilder().setName("bazel.canonical_id").setValue("canonical ID"))
510+
.build());
511+
}
477512
}

0 commit comments

Comments
 (0)