Skip to content

Commit ac6aeba

Browse files
markjschreiberstefanofornari
authored andcommitted
fix: use environment configuration when creating a byte channel (awslabs#405)
1 parent 7425100 commit ac6aeba

File tree

3 files changed

+46
-22
lines changed

3 files changed

+46
-22
lines changed

src/main/java/software/amazon/nio/spi/s3/S3ReadAheadByteChannel.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,12 @@ private CompletableFuture<ByteBuffer> computeFragmentFuture(int fragmentIndex) {
239239
Integer fragmentIndexForByteNumber(long byteNumber) {
240240
return Math.toIntExact(Math.floorDiv(byteNumber, (long) maxFragmentSize));
241241
}
242+
243+
public int getMaxFragmentSize() {
244+
return maxFragmentSize;
245+
}
246+
247+
public int getMaxNumberFragments() {
248+
return maxNumberFragments;
249+
}
242250
}

src/main/java/software/amazon/nio/spi/s3/S3SeekableByteChannel.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
2323
import software.amazon.awssdk.services.s3.S3AsyncClient;
24-
import software.amazon.nio.spi.s3.config.S3NioSpiConfiguration;
2524
import software.amazon.nio.spi.s3.util.TimeOutUtils;
2625

2726
class S3SeekableByteChannel implements SeekableByteChannel {
@@ -54,9 +53,7 @@ private S3SeekableByteChannel(S3Path s3Path, S3AsyncClient s3Client, long startA
5453
throw new IOException("The SYNC/DSYNC options is not supported");
5554
}
5655

57-
// later we will add a constructor that allows providing delegates for composition
58-
59-
var config = new S3NioSpiConfiguration();
56+
var config = s3Path.getFileSystem().configuration();
6057
if (options.contains(StandardOpenOption.WRITE)) {
6158
LOGGER.debug("using S3WritableByteChannel as write delegate for path '{}'", s3Path.toUri());
6259
readDelegate = null;

src/test/java/software/amazon/nio/spi/s3/S3SeekableByteChannelTest.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,46 @@
55

66
package software.amazon.nio.spi.s3;
77

8-
import java.time.Instant;
9-
import org.mockito.Mock;
10-
import software.amazon.awssdk.core.ResponseBytes;
11-
import software.amazon.awssdk.core.async.AsyncRequestBody;
12-
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
13-
import software.amazon.awssdk.services.s3.S3AsyncClient;
14-
import software.amazon.awssdk.services.s3.model.*;
8+
import static java.nio.file.StandardOpenOption.CREATE;
9+
import static java.nio.file.StandardOpenOption.READ;
10+
import static java.nio.file.StandardOpenOption.WRITE;
11+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
import static org.junit.jupiter.api.Assertions.assertFalse;
14+
import static org.junit.jupiter.api.Assertions.assertNotNull;
15+
import static org.junit.jupiter.api.Assertions.assertThrows;
16+
import static org.junit.jupiter.api.Assertions.assertTrue;
17+
import static org.mockito.Mockito.any;
18+
import static org.mockito.Mockito.lenient;
19+
import static org.mockito.Mockito.when;
20+
import static software.amazon.nio.spi.s3.S3Matchers.anyConsumer;
1521

1622
import java.io.IOException;
1723
import java.net.URI;
1824
import java.nio.ByteBuffer;
1925
import java.nio.charset.StandardCharsets;
2026
import java.nio.file.OpenOption;
27+
import java.time.Instant;
2128
import java.util.Collections;
2229
import java.util.Set;
2330
import java.util.concurrent.CompletableFuture;
2431
import org.junit.jupiter.api.AfterEach;
25-
26-
import static java.nio.file.StandardOpenOption.CREATE;
27-
import static java.nio.file.StandardOpenOption.READ;
28-
import static java.nio.file.StandardOpenOption.WRITE;
29-
import static org.junit.jupiter.api.Assertions.*;
3032
import org.junit.jupiter.api.BeforeEach;
3133
import org.junit.jupiter.api.Test;
3234
import org.junit.jupiter.api.extension.ExtendWith;
33-
34-
import static org.mockito.Mockito.any;
35-
import static org.mockito.Mockito.lenient;
36-
import static org.mockito.Mockito.when;
37-
import static software.amazon.nio.spi.s3.S3Matchers.anyConsumer;
38-
35+
import org.mockito.Mock;
3936
import org.mockito.junit.jupiter.MockitoExtension;
37+
import software.amazon.awssdk.core.ResponseBytes;
38+
import software.amazon.awssdk.core.async.AsyncRequestBody;
39+
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
40+
import software.amazon.awssdk.services.s3.S3AsyncClient;
41+
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
42+
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
43+
import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
44+
import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
45+
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
46+
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
47+
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
4048

4149
@ExtendWith(MockitoExtension.class)
4250
@SuppressWarnings("unchecked")
@@ -149,4 +157,15 @@ private S3SeekableByteChannel seekableByteChannelForRead() throws IOException {
149157
return new S3SeekableByteChannel(path, mockClient, Collections.singleton(READ));
150158
}
151159

160+
// test that the S3SeekableByteChannel uses the buffer size from the configuration set for the FileSystem
161+
@Test
162+
public void testBufferSize() throws IOException {
163+
fs.configuration().withMaxFragmentSize(10000);
164+
fs.configuration().withMaxFragmentNumber(10);
165+
try(var channel = (S3SeekableByteChannel) fs.provider().newByteChannel(path, Set.of(READ))) {
166+
assertEquals(10000, ((S3ReadAheadByteChannel) channel.getReadDelegate()).getMaxFragmentSize());
167+
assertEquals(10, ((S3ReadAheadByteChannel) channel.getReadDelegate()).getMaxNumberFragments());
168+
}
169+
}
170+
152171
}

0 commit comments

Comments
 (0)