[
https://issues.apache.org/jira/browse/HADOOP-18242?focusedWorklogId=782304&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-782304
]
ASF GitHub Bot logged work on HADOOP-18242:
-------------------------------------------
Author: ASF GitHub Bot
Created on: 17/Jun/22 08:35
Start Date: 17/Jun/22 08:35
Worklog Time Spent: 10m
Work Description: mehakmeet commented on code in PR #4331:
URL: https://github.com/apache/hadoop/pull/4331#discussion_r899899329
##########
hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/TestAbfsRenameRetryRecovery.java:
##########
@@ -0,0 +1,159 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.fs.azurebfs;
+
+import java.lang.reflect.Field;
+
+import org.assertj.core.api.Assertions;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import
org.apache.hadoop.fs.azurebfs.contracts.exceptions.AbfsRestOperationException;
+import
org.apache.hadoop.fs.azurebfs.contracts.exceptions.AzureBlobFileSystemException;
+import org.apache.hadoop.fs.azurebfs.services.AbfsClient;
+import org.apache.hadoop.fs.azurebfs.services.AbfsClientResult;
+import org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation;
+import org.apache.hadoop.fs.azurebfs.services.TestAbfsClient;
+import org.apache.hadoop.fs.statistics.IOStatistics;
+
+import static
org.apache.hadoop.fs.azurebfs.contracts.services.AzureServiceErrorCode.RENAME_DESTINATION_PARENT_PATH_NOT_FOUND;
+import static org.apache.hadoop.fs.statistics.StoreStatisticNames.OP_RENAME;
+import static org.apache.hadoop.test.LambdaTestUtils.intercept;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class TestAbfsRenameRetryRecovery extends AbstractAbfsIntegrationTest {
+
+ private static final Logger LOG =
+ LoggerFactory.getLogger(TestAbfsRenameRetryRecovery.class);
+
+ public TestAbfsRenameRetryRecovery() throws Exception {
+ }
+
+ /**
+ * Mock the AbfsClient to run a metadata incomplete scenario with recovery
+ * rename.
+ */
+ @Test
+ public void testRenameFailuresDueToIncompleteMetadata() throws Exception {
+ String sourcePath = getMethodName() + "Source";
+ String destNoParentPath = "/NoParent/Dest";
+ boolean doesDestParentDirExist = false;
+ AzureBlobFileSystem fs = getFileSystem();
+
+ AbfsClient mockClient = TestAbfsClient.getMockAbfsClient(
+ fs.getAbfsStore().getClient(),
+ fs.getAbfsStore().getAbfsConfiguration());
+
+ AzureBlobFileSystemStore abfsStore = fs.getAbfsStore();
+ abfsStore = setAzureBlobSystemStoreField(abfsStore, "client", mockClient);
+
+ // SuccessFul Result.
+ AbfsRestOperation successOp = mock(AbfsRestOperation.class);
+ AbfsClientResult successResult = mock(AbfsClientResult.class);
+ when(successResult.getOp()).thenReturn(successOp);
+ when(successResult.isIncompleteMetadataState()).thenReturn(false);
+
+ // Failed Result.
+ AbfsRestOperation failedOp = mock(AbfsRestOperation.class);
+ AbfsClientResult recoveredMetaDataIncompleteResult =
mock(AbfsClientResult.class);
+ when(recoveredMetaDataIncompleteResult.getOp()).thenReturn(failedOp);
+
when(recoveredMetaDataIncompleteResult.isIncompleteMetadataState()).thenReturn(true);
+
+ // No destination Parent dir exception.
+ AzureBlobFileSystemException destParentNotFound
+ = getMockAbfsRestOperationException(
+ RENAME_DESTINATION_PARENT_PATH_NOT_FOUND.getStatusCode(),
+ RENAME_DESTINATION_PARENT_PATH_NOT_FOUND.getErrorCode());
+
+ // We need to throw an exception once a rename is triggered with
+ // destination having no parent, but after a retry it needs to succeed.
+ when(mockClient.renamePath(sourcePath, destNoParentPath, null, null,
+ null)).thenAnswer(
+
+ new Answer<AbfsClientResult>() {
+ @Override
+ public AbfsClientResult answer(InvocationOnMock invocationOnMock)
+ throws Throwable {
+ IOStatistics ioStatistics = fs.getIOStatistics();
+ long renameCalls = ioStatistics.counters().get(OP_RENAME);
+ LOG.info("Rename Calls from IOstatistics: {}", renameCalls);
+ if (renameCalls == 0) {
+ throw destParentNotFound;
+ }
+ return recoveredMetaDataIncompleteResult;
+ }
+ }).thenReturn(recoveredMetaDataIncompleteResult);
+
+ // Dest parent not found exc. to be raised.
+ intercept(AzureBlobFileSystemException.class,
+ () -> mockClient.renamePath(sourcePath,
+ destNoParentPath, null, null,
+ null));
+
+ AbfsClientResult resultOfSecondRenameCall =
+ mockClient.renamePath(sourcePath,
+ destNoParentPath, null, null,
+ null);
+
+ // the second rename call should be the recoveredResult due to
+ // metaDataIncomplete
+ Assertions.assertThat(resultOfSecondRenameCall)
+ .describedAs("This result should be recovered result due to MetaData "
+ + "being in incomplete state")
+ .isEqualTo(recoveredMetaDataIncompleteResult);
Review Comment:
ooh, just saw the differences
>isSameAs - checks if objects are same (e.g. checking if objects point to
same reference)
isEqualTo - checks if objects are equal (e.g. checking if objects are equal
based on value)
I'll use isSameAs
Issue Time Tracking
-------------------
Worklog Id: (was: 782304)
Time Spent: 2h 20m (was: 2h 10m)
> ABFS Rename Failure when tracking metadata is in incomplete state
> -----------------------------------------------------------------
>
> Key: HADOOP-18242
> URL: https://issues.apache.org/jira/browse/HADOOP-18242
> Project: Hadoop Common
> Issue Type: Bug
> Components: fs/azure
> Reporter: Mehakmeet Singh
> Assignee: Mehakmeet Singh
> Priority: Major
> Labels: pull-request-available
> Time Spent: 2h 20m
> Remaining Estimate: 0h
>
> If a node in the datacenter crashes while processing an operation,
> occasionally it can leave the Storage-internal blob tracking metadata in an
> incomplete state. We expect this to happen occasionally, and so all API’s
> are designed in such a way that if this incomplete state is observed on a
> blob, the situation is resolved before the current operation proceeds.
> However, this incident has exposed a bug specifically with the Rename API,
> where the incomplete state fails to resolve, leading to this incorrect
> failure. As a temporary mitigation, if any other operation is performed on
> this blob – GetBlobProperties, GetBlob, GetFileProperties, SetFileProperties,
> etc – it should resolve the incomplete state, and rename will no longer hit
> this issue.
> StackTrace:
> {code:java}
> 2022-03-22 17:52:19,789 DEBUG [regionserver/euwukwlss-hg50:16020.logRoller]
> services.AbfsClient: HttpRequest:
> 404,RenameDestinationParentPathNotFound,cid=ef5cbf0f-5d4a-4630-8a59-3d559077fc24,rid=35fef164-101f-000b-1b15-3ed818000000,sent=0,recv=212,PUT,https://euwqdaotdfdls03.dfs.core.windows.net/eykbssc/apps/hbase/data/oldWALs/euwukwlss-hg50.tdf.qa%252C16020%252C1647949929877.1647967939315?timeout=90
> {code}
--
This message was sent by Atlassian Jira
(v8.20.7#820007)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]