-
Notifications
You must be signed in to change notification settings - Fork 9.2k
HADOOP-18546. ABFS:disable purging list of in progress reads in abfs stream closed #5176
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 14 commits
54e706a
39c3403
8cad3d5
a8eb44b
11ff043
ddefd2e
6a1e0a6
02d39ca
2a6dcb6
fc833f2
11dd7bf
ac1e758
64546a5
4902598
c76f610
455a472
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -82,6 +82,12 @@ public class TestAbfsInputStream extends | |
| REDUCED_READ_BUFFER_AGE_THRESHOLD * 10; // 30 sec | ||
| private static final int ALWAYS_READ_BUFFER_SIZE_TEST_FILE_SIZE = 16 * ONE_MB; | ||
|
|
||
| @Override | ||
| public void teardown() throws Exception { | ||
| super.teardown(); | ||
| ReadBufferManager.getBufferManager().testResetReadBufferManager(); | ||
| } | ||
|
|
||
| private AbfsRestOperation getMockRestOp() { | ||
| AbfsRestOperation op = mock(AbfsRestOperation.class); | ||
| AbfsHttpOperation httpOp = mock(AbfsHttpOperation.class); | ||
|
|
@@ -106,7 +112,6 @@ private AbfsClient getMockAbfsClient() { | |
| private AbfsInputStream getAbfsInputStream(AbfsClient mockAbfsClient, | ||
| String fileName) throws IOException { | ||
| AbfsInputStreamContext inputStreamContext = new AbfsInputStreamContext(-1); | ||
| inputStreamContext.isReadAheadEnabled(true); | ||
| // Create AbfsInputStream with the client instance | ||
| AbfsInputStream inputStream = new AbfsInputStream( | ||
| mockAbfsClient, | ||
|
|
@@ -132,7 +137,6 @@ public AbfsInputStream getAbfsInputStream(AbfsClient abfsClient, | |
| boolean alwaysReadBufferSize, | ||
| int readAheadBlockSize) throws IOException { | ||
| AbfsInputStreamContext inputStreamContext = new AbfsInputStreamContext(-1); | ||
| inputStreamContext.isReadAheadEnabled(true); | ||
| // Create AbfsInputStream with the client instance | ||
| AbfsInputStream inputStream = new AbfsInputStream( | ||
| abfsClient, | ||
|
|
@@ -495,6 +499,63 @@ public void testSuccessfulReadAhead() throws Exception { | |
| checkEvictedStatus(inputStream, 0, true); | ||
| } | ||
|
|
||
| /** | ||
| * This test expects InProgressList is not purged by the inputStream close. | ||
| */ | ||
| @Test | ||
| public void testStreamPurgeDuringReadAheadCallExecuting() throws Exception { | ||
| AbfsClient client = getMockAbfsClient(); | ||
| AbfsRestOperation successOp = getMockRestOp(); | ||
| final Long serverCommunicationMockLatency = 3_000L; | ||
| final Long readBufferTransferToInProgressProbableTime = 1_000L; | ||
| final Integer readBufferQueuedCount = 3; | ||
|
|
||
| Mockito.doAnswer(invocationOnMock -> { | ||
| //sleeping thread to mock the network latency from client to backend. | ||
| Thread.sleep(serverCommunicationMockLatency); | ||
| return successOp; | ||
| }) | ||
| .when(client) | ||
|
||
| .read(any(String.class), any(Long.class), any(byte[].class), | ||
| any(Integer.class), any(Integer.class), any(String.class), | ||
| any(String.class), any(TracingContext.class)); | ||
|
|
||
| AbfsInputStream inputStream = getAbfsInputStream(client, | ||
| "testSuccessfulReadAhead.txt"); | ||
| queueReadAheads(inputStream); | ||
|
|
||
| final ReadBufferManager readBufferManager | ||
| = ReadBufferManager.getBufferManager(); | ||
|
|
||
| final int readBufferTotal = readBufferManager.getNumBuffers(); | ||
|
|
||
| //Sleeping to give ReadBufferWorker to pick the readBuffers for processing. | ||
| Thread.sleep(readBufferTransferToInProgressProbableTime); | ||
|
|
||
| Assertions.assertThat(readBufferManager.getInProgressCopiedList()) | ||
| .describedAs("InProgressList should have " + readBufferQueuedCount + " elements") | ||
| .hasSize(readBufferQueuedCount); | ||
| final int freeListBufferCount = readBufferTotal - readBufferQueuedCount; | ||
| Assertions.assertThat(readBufferManager.getFreeListCopy()) | ||
| .describedAs("FreeList should have " + freeListBufferCount + "elements") | ||
|
||
| .hasSize(freeListBufferCount); | ||
| Assertions.assertThat(readBufferManager.getCompletedReadListCopy()) | ||
| .describedAs("CompletedList should have 0 elements") | ||
| .hasSize(0); | ||
|
|
||
| inputStream.close(); | ||
|
||
|
|
||
| Assertions.assertThat(readBufferManager.getInProgressCopiedList()) | ||
| .describedAs("InProgressList should have " + readBufferQueuedCount + " elements") | ||
| .hasSize(readBufferQueuedCount); | ||
| Assertions.assertThat(readBufferManager.getCompletedReadListCopy()) | ||
| .describedAs("CompletedList should have 0 elements") | ||
| .hasSize(0); | ||
| Assertions.assertThat(readBufferManager.getFreeListCopy()) | ||
| .describedAs("FreeList should have " + freeListBufferCount + " elements") | ||
| .hasSize(freeListBufferCount); | ||
| } | ||
|
|
||
| /** | ||
| * This test expects ReadAheadManager to throw exception if the read ahead | ||
| * thread had failed within the last thresholdAgeMilliseconds. | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.