Skip to content

Commit 3d99040

Browse files
committed
driver: shortcut zero-byte files
1 parent d9dea09 commit 3d99040

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

src/main/java/org/dcache/nearline/cta/CtaNearlineStorage.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,13 @@ public void onCompleted() {
426426
public void remove(Iterable<RemoveRequest> requests) {
427427

428428
for (var r : requests) {
429+
430+
// short-circuit zero-byte files
431+
if (r.getUri().getQuery().contains("archiveid=*")) {
432+
r.completed(null);
433+
continue;
434+
}
435+
429436
var deleteRequest = ctaRequestFactory.valueOf(r);
430437
cta.withDeadline(getRequestDeadline()).delete(deleteRequest, new StreamObserver<>() {
431438
@Override

src/test/java/org/dcache/nearline/cta/CtaNearlineStorageTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static org.mockito.ArgumentMatchers.anyInt;
1616
import static org.mockito.Mockito.doAnswer;
1717
import static org.mockito.Mockito.mock;
18+
import static org.mockito.Mockito.never;
1819
import static org.mockito.Mockito.times;
1920
import static org.mockito.Mockito.verify;
2021
import static org.mockito.Mockito.when;
@@ -358,6 +359,25 @@ public void testSuccessOnRemove() {
358359
verify(request).completed(any());
359360
}
360361

362+
@Test
363+
public void testRemoveZeroByteFiles() {
364+
365+
var request = mockedRemoveRequest();
366+
when(request.getUri()).thenReturn(
367+
URI.create("cta://cta/0000C9B4E3768770452E8B1B8E0232584872?archiveid=*"));
368+
369+
driver = new CtaNearlineStorage("foo", "bar");
370+
driver.configure(drvConfig);
371+
driver.start();
372+
373+
driver.remove(Set.of(request));
374+
waitToComplete();
375+
376+
verify(request).completed(any());
377+
// ensure that shortcut is used
378+
verify(cta.ctaSvc(), never()).delete(any(), any());
379+
}
380+
361381
@Test
362382
public void testRemoveRequestOnRpcError() {
363383

src/test/java/org/dcache/nearline/cta/DummyCta.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.dcache.nearline.cta;
22

3+
import static org.mockito.Mockito.spy;
34
import ch.cern.cta.rpc.ArchiveResponse;
45
import ch.cern.cta.rpc.CreateResponse;
56
import ch.cern.cta.rpc.CtaRpcGrpc;
@@ -29,7 +30,12 @@ public class DummyCta {
2930

3031
private volatile boolean drop;
3132

33+
private final CtaRpcGrpc.CtaRpcImplBase ctaSvc;
34+
3235
public DummyCta(File cert, File key) throws Exception {
36+
37+
ctaSvc = spy(new CtaSvc());
38+
3339
server = NettyServerBuilder.forPort(0)
3440
.sslContext(GrpcSslContexts.forServer(cert, key)
3541
.clientAuth(ClientAuth.NONE)
@@ -39,7 +45,7 @@ public DummyCta(File cert, File key) throws Exception {
3945
.bossEventLoopGroup( new NioEventLoopGroup(2, new ThreadFactoryBuilder().setNameFormat("dummy-cta-server-accept-%d").build()))
4046
.workerEventLoopGroup(new NioEventLoopGroup(2, new ThreadFactoryBuilder().setNameFormat("dummy-cta-server-worker-%d").build()))
4147
.channelType(NioServerSocketChannel.class)
42-
.addService(new CtaSvc())
48+
.addService(ctaSvc)
4349
.directExecutor()
4450
.build();
4551
}
@@ -55,6 +61,10 @@ public void shutdown() throws InterruptedException {
5561
}
5662
}
5763

64+
public CtaRpcGrpc.CtaRpcImplBase ctaSvc() {
65+
return ctaSvc;
66+
}
67+
5868
public String getConnectString() {
5969
return "localhost:" + server.getPort();
6070
}

0 commit comments

Comments
 (0)