Skip to content
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

Rename Delete on Blob endpoint. #117

Merged
merged 86 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
c036404
RenameHandler + DfsRenameHandler
saxenapranav May 6, 2024
ea2bef1
pathinformation; shorten prechecks for dfs case
saxenapranav May 7, 2024
870361b
prechecks for blob handler
saxenapranav May 7, 2024
c2bacc3
deleteHandler
saxenapranav May 7, 2024
0005ca9
new config: fs.azure.blob.implicit.check.enabled
saxenapranav May 7, 2024
c3372af
Merge branch 'implicitConfg' into renameDelete
saxenapranav May 7, 2024
75edc7b
Merge branch 'azureBlobClient' into renameDelete
saxenapranav May 7, 2024
f17b0b7
ListActionTaker
saxenapranav May 8, 2024
eb642bc
delete code done
saxenapranav May 8, 2024
798e23e
wip
saxenapranav May 8, 2024
8282cc4
copy progress
saxenapranav May 9, 2024
fe41cca
copy Blob impl
saxenapranav May 9, 2024
0ad1214
renameAtomicity
saxenapranav May 9, 2024
4d48fe8
listStatus and getPathStatus to do renameAtomic
saxenapranav May 9, 2024
0b9b032
test fixture
saxenapranav May 10, 2024
4ffef8f
Merge branch 'azureBlobClient' into renameDelete
saxenapranav May 13, 2024
d5acd2f
createPath, getBlobProperty in blob for meanwhile; to be removed later
saxenapranav May 13, 2024
710ca79
Merge branch 'azureBlobClient' into renameDelete
saxenapranav May 14, 2024
df84b40
no renameHandler abstract class; have blobRenameHandler from the blob…
saxenapranav May 14, 2024
2c67654
deleteHandler
saxenapranav May 14, 2024
e030dc7
rename and delete internal method
saxenapranav May 14, 2024
bab4bb8
remove unnecessary class
saxenapranav May 14, 2024
0fc7ca8
createCallback and readCallback in store
saxenapranav May 14, 2024
ceb2dc7
Revert "new config: fs.azure.blob.implicit.check.enabled"
saxenapranav May 14, 2024
5661eb2
important changes for renameatomicity
saxenapranav May 15, 2024
1b3ee3f
abfsbloblease in renamehandler
saxenapranav May 15, 2024
97b6b03
client forwards; tests additions;
saxenapranav May 15, 2024
ca6feac
all current delete tests: good.
saxenapranav May 15, 2024
f96afce
rename required changes to make test run
saxenapranav May 15, 2024
ce181de
call pathStatus on nonRoot path; is src path is not there, throw IOEx…
saxenapranav May 16, 2024
2fc652e
checkParentDestination metadata test refactor
saxenapranav May 16, 2024
71f8405
producer / consumer logic braught in.
saxenapranav May 16, 2024
a865e34
added new test for implicit / producer-consumer; src changes
saxenapranav May 16, 2024
32add3b
Assert that delete operation failure should stop List producer.
saxenapranav May 17, 2024
52c1822
etag check before starting rename
saxenapranav May 17, 2024
9359ae0
tests for liststatus and getPathStatus recovery
saxenapranav May 20, 2024
e8b48f1
tests wip
saxenapranav May 20, 2024
ed6ecdc
resue same method
saxenapranav May 20, 2024
7d574a5
Merge branch 'azureBlobClient' into renameDelete
saxenapranav May 21, 2024
896204d
blob copy idempotency check in src; added tests
saxenapranav May 21, 2024
6115a08
tests complete
saxenapranav May 21, 2024
328e097
Merge branch 'azureBlobClient' into renameDelete
saxenapranav May 21, 2024
ab31f75
new delete tests + contract working fine
saxenapranav May 21, 2024
e446e75
all tests working
saxenapranav May 22, 2024
a2cc587
tracing context of final blob operation to have op count for rename/d…
saxenapranav May 22, 2024
0f6db9d
test fixes
saxenapranav May 22, 2024
d22b99c
asf license on new src files
saxenapranav May 22, 2024
27cd964
leaseTimerTask class
saxenapranav May 27, 2024
5adb6f0
pr refactors
saxenapranav May 27, 2024
4d995a3
pr refactors
saxenapranav May 27, 2024
a50dab1
test fixed
saxenapranav May 27, 2024
91fb94a
fix test
saxenapranav May 27, 2024
747a51d
remove unwanted code for test
saxenapranav May 28, 2024
20155f3
callbacks to have tracingContext
saxenapranav May 28, 2024
07dfbdb
correction
saxenapranav May 28, 2024
8756887
added javadocs
saxenapranav May 28, 2024
3ec178b
remove unwanted code
saxenapranav May 28, 2024
7fda902
preRename to happen only on directory rename
saxenapranav May 28, 2024
21d0e4f
changes for new integeration
saxenapranav Jun 5, 2024
29c3c41
fix for unicode test
saxenapranav Jun 5, 2024
e134292
integ issue resovled
saxenapranav Jun 5, 2024
2e4fb2d
Merge branch 'wasbDeprecation_Dev' into renameDelete
saxenapranav Jun 10, 2024
aa9866b
assumption in testProducerStopOnRenameFailure
saxenapranav Jun 10, 2024
c7099db
queue public ops should be synced; minor refactors. (#114)
saxenapranav Jun 12, 2024
d0cb5b9
correction of test of testDeleteIdempotencyTriggerHttp404 -> not to r…
saxenapranav Jun 13, 2024
a961ab1
Merge branch 'azureBlobClient' into renameDelete
saxenapranav Jun 13, 2024
2792325
remove pathUtils
saxenapranav Jun 13, 2024
182967e
take action on renamePending json from client abstract method
saxenapranav Jun 13, 2024
a705138
getClient to get mocking correct in the test
saxenapranav Jun 13, 2024
736b32a
to return BLOB_PATH_NOT_FOUND is already added in the azureBlobClient…
saxenapranav Jun 13, 2024
652c15b
review comments
saxenapranav Jun 14, 2024
5303166
removed callbacks; test fixes;
saxenapranav Jun 17, 2024
ec869ee
added asf and javadocs on RenameAtomicityTestUtils
saxenapranav Jun 17, 2024
6f26b81
remove overwrite overload
saxenapranav Jun 17, 2024
8c5af2e
javadocs
saxenapranav Jun 18, 2024
ebde8d9
Merge branch 'azureBlobClient' into renameDelete
saxenapranav Jun 18, 2024
61da75d
Rename delete review comments. (#120)
saxenapranav Jun 21, 2024
5f92b37
Merge branch 'wasbDepCodeReview' into renameDelete
saxenapranav Jun 21, 2024
8cb4c6f
consume JsonProcessingException if json string is invalid
saxenapranav Jun 24, 2024
dd6f5dc
Merge branch 'renameDelete' of github.com:ABFSDriver/AbfsHadoop into …
saxenapranav Jun 24, 2024
5afeaef
import checks
saxenapranav Jun 24, 2024
e816e96
remove casting from ListActionTaker for client, it s going to be Abfs…
saxenapranav Jun 24, 2024
7b53575
nits refactors;
saxenapranav Jun 25, 2024
d6de0c4
Merge branch 'wasbDepCodeReview' into renameDelete
saxenapranav Jun 25, 2024
603caea
refactors
saxenapranav Jun 25, 2024
52bcd11
release the lease when the rename is not fully successful
saxenapranav Jun 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,26 @@ public class AbfsConfiguration{
FS_AZURE_ENABLE_PAGINATED_DELETE, DefaultValue = DEFAULT_ENABLE_PAGINATED_DELETE)
private boolean isPaginatedDeleteEnabled;

@LongConfigurationValidatorAnnotation(ConfigurationKey = FS_AZURE_BLOB_COPY_PROGRESS_WAIT_MILLIS,
DefaultValue = DEFAULT_AZURE_BLOB_COPY_PROGRESS_WAIT_MILLIS)
private long blobCopyProgressPollWaitMillis;

@LongConfigurationValidatorAnnotation(ConfigurationKey = FS_AZURE_BLOB_ATOMIC_RENAME_LEASE_REFRESH_DURATION,
DefaultValue = DEFAULT_AZURE_BLOB_ATOMIC_RENAME_LEASE_REFRESH_DURATION)
private long blobAtomicRenameLeaseRefreshDuration;

@IntegerConfigurationValidatorAnnotation(ConfigurationKey =
FS_AZURE_PRODUCER_QUEUE_MAX_SIZE, DefaultValue = DEFAULT_FS_AZURE_PRODUCER_QUEUE_MAX_SIZE)
private int producerQueueMaxSize;

@IntegerConfigurationValidatorAnnotation(ConfigurationKey =
FS_AZURE_BLOB_DIR_RENAME_MAX_THREAD, DefaultValue = DEFAULT_FS_AZURE_BLOB_RENAME_THREAD)
private int blobRenameDirConsumptionParallelism;

@IntegerConfigurationValidatorAnnotation(ConfigurationKey =
FS_AZURE_BLOB_DIR_DELETE_MAX_THREAD, DefaultValue = DEFAULT_FS_AZURE_BLOB_DELETE_THREAD)
private int blobDeleteDirConsumptionParallelism;

private String clientProvidedEncryptionKey;
private String clientProvidedEncryptionKeySHA;

Expand Down Expand Up @@ -1413,4 +1433,24 @@ public boolean getIsChecksumValidationEnabled() {
public void setIsChecksumValidationEnabled(boolean isChecksumValidationEnabled) {
this.isChecksumValidationEnabled = isChecksumValidationEnabled;
}

public long getBlobCopyProgressPollWaitMillis() {
return blobCopyProgressPollWaitMillis;
}

public long getAtomicRenameLeaseRefreshDuration() {
return blobAtomicRenameLeaseRefreshDuration;
}

public int getProducerQueueMaxSize() {
return producerQueueMaxSize;
}

public int getBlobRenameDirConsumptionParallelism() {
return blobRenameDirConsumptionParallelism;
}

public int getBlobDeleteDirConsumptionParallelism() {
return blobDeleteDirConsumptionParallelism;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -515,14 +515,18 @@ public boolean rename(final Path src, final Path dst) throws IOException {

qualifiedDstPath = makeQualified(adjustedDst);

abfsStore.rename(qualifiedSrcPath, qualifiedDstPath, tracingContext, null);
getAbfsStore().rename(qualifiedSrcPath, qualifiedDstPath, tracingContext,
null
);
return true;
} catch (AzureBlobFileSystemException ex) {
LOG.debug("Rename operation failed. ", ex);
checkException(
src,
ex,
AzureServiceErrorCode.PATH_ALREADY_EXISTS,
AzureServiceErrorCode.BLOB_ALREADY_EXISTS,
AzureServiceErrorCode.BLOB_PATH_NOT_FOUND,
AzureServiceErrorCode.INVALID_RENAME_SOURCE_PATH,
AzureServiceErrorCode.SOURCE_PATH_NOT_FOUND,
AzureServiceErrorCode.INVALID_SOURCE_OR_DESTINATION_RESOURCE_TYPE,
Expand Down Expand Up @@ -595,8 +599,9 @@ public Pair<Boolean, Duration> commitSingleFileByRename(
final Duration waitTime = rateLimiting.acquire(1);

try {
final boolean recovered = abfsStore.rename(qualifiedSrcPath,
qualifiedDstPath, tracingContext, sourceEtag);
final boolean recovered = getAbfsStore().rename(qualifiedSrcPath,
qualifiedDstPath, tracingContext, sourceEtag
);
return Pair.of(recovered, waitTime);
} catch (AzureBlobFileSystemException ex) {
LOG.debug("Rename operation failed. ", ex);
Expand Down Expand Up @@ -627,10 +632,11 @@ public boolean delete(final Path f, final boolean recursive) throws IOException
TracingContext tracingContext = new TracingContext(clientCorrelationId,
fileSystemId, FSOperationType.DELETE, tracingHeaderFormat,
listener);
abfsStore.delete(qualifiedPath, recursive, tracingContext);
getAbfsStore().delete(qualifiedPath, recursive, tracingContext);
return true;
} catch (AzureBlobFileSystemException ex) {
checkException(f, ex, AzureServiceErrorCode.PATH_NOT_FOUND);
checkException(f, ex, AzureServiceErrorCode.PATH_NOT_FOUND,
AzureServiceErrorCode.BLOB_PATH_NOT_FOUND);
return false;
}

Expand All @@ -647,7 +653,8 @@ public FileStatus[] listStatus(final Path f) throws IOException {
TracingContext tracingContext = new TracingContext(clientCorrelationId,
fileSystemId, FSOperationType.LISTSTATUS, true, tracingHeaderFormat,
listener);
FileStatus[] result = abfsStore.listStatus(qualifiedPath, tracingContext);
FileStatus[] result = getAbfsStore().listStatus(qualifiedPath,
tracingContext);
return result;
} catch (AzureBlobFileSystemException ex) {
checkException(f, ex);
Expand Down Expand Up @@ -777,7 +784,9 @@ private FileStatus getFileStatus(final Path path,
Path qualifiedPath = makeQualified(path);

try {
return abfsStore.getFileStatus(qualifiedPath, tracingContext);
FileStatus fileStatus = getAbfsStore().getFileStatus(qualifiedPath,
tracingContext);
return fileStatus;
} catch (AzureBlobFileSystemException ex) {
checkException(path, ex);
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.AZURE_FOOTER_READ_BUFFER_SIZE;
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_BUFFERED_PREAD_DISABLE;
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_IDENTITY_TRANSFORM_CLASS;
import static org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations.INFINITE_LEASE_DURATION;
import static org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes.ABFS_BLOB_DOMAIN_NAME;
import static org.apache.hadoop.fs.azurebfs.constants.HttpHeaderConfigurations.X_MS_ENCRYPTION_CONTEXT;

Expand All @@ -175,7 +176,6 @@ public class AzureBlobFileSystemStore implements Closeable, ListingSupport {
private final Map<AbfsLease, Object> leaseRefs;

private final AbfsConfiguration abfsConfiguration;
private final Set<String> azureAtomicRenameDirSet;
private Set<String> azureInfiniteLeaseDirSet;
private volatile Trilean isNamespaceEnabled;
private final AuthType authType;
Expand Down Expand Up @@ -243,8 +243,6 @@ public AzureBlobFileSystemStore(
}
LOG.trace("primaryUserGroup is {}", this.primaryUserGroup);

this.azureAtomicRenameDirSet = new HashSet<>(Arrays.asList(
abfsConfiguration.getAzureAtomicRenameDirs().split(AbfsHttpConstants.COMMA)));
updateInfiniteLeaseDirs();
this.authType = abfsConfiguration.getAuthType(accountName);
boolean usingOauth = (authType == AuthType.OAuth);
Expand Down Expand Up @@ -719,8 +717,7 @@ private AbfsRestOperation conditionalCreateOverwriteFile(final String relativePa
}
}

String eTag = op.getResult()
.getResponseHeader(HttpHeaderConfigurations.ETAG);
String eTag = extractEtagHeader(op.getResult());

try {
// overwrite only if eTag matches with the file properties fetched befpre
Expand Down Expand Up @@ -803,6 +800,16 @@ private AbfsOutputStreamContext populateAbfsOutputStreamContext(
.build();
}

/**
* Creates a directory.
*
* @param path Path of the directory to create.
* @param permission Permission of the directory.
* @param umask Umask of the directory.
* @param tracingContext tracing context
*
* @throws AzureBlobFileSystemException server error.
*/
public void createDirectory(final Path path, final FsPermission permission,
final FsPermission umask, TracingContext tracingContext)
throws IOException {
Expand All @@ -815,7 +822,6 @@ public void createDirectory(final Path path, final FsPermission permission,
permission,
umask,
isNamespaceEnabled);

boolean overwrite =
!isNamespaceEnabled || abfsConfiguration.isEnabledMkdirOverwrite();
Permissions permissions = new Permissions(isNamespaceEnabled,
Expand Down Expand Up @@ -1042,16 +1048,11 @@ public boolean rename(final Path source,
final Path destination,
final TracingContext tracingContext,
final String sourceEtag) throws
IOException {
IOException {
final Instant startAggregate = abfsPerfTracker.getLatencyInstant();
long countAggregate = 0;
boolean shouldContinue;

if (isAtomicRenameKey(source.getName())) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this removed from DFS flow?? Was this not doing anything there??

LOG.warn("The atomic rename feature is not supported by the ABFS scheme; however rename,"
+" create and delete operations are atomic if Namespace is enabled for your Azure Storage account.");
}

LOG.debug("renameAsync filesystem: {} source: {} destination: {}",
getClient().getFileSystem(),
source,
Expand All @@ -1070,11 +1071,21 @@ public boolean rename(final Path source,
final AbfsClientRenameResult abfsClientRenameResult =
getClient().renamePath(sourceRelativePath, destinationRelativePath,
continuation, tracingContext, sourceEtag, false,
isNamespaceEnabled);
isNamespaceEnabled);


AbfsRestOperation op = abfsClientRenameResult.getOp();
perfInfo.registerResult(op.getResult());
continuation = op.getResult().getResponseHeader(HttpHeaderConfigurations.X_MS_CONTINUATION);
/*
* Blob endpoint does not have a rename API. The AbfsBlobClient would
* perform the copy and delete operation for renaming a path.
* As it would not be one operation, hence, the client would not return
* AbfsRestOperation object.
*/
if (op != null) {
perfInfo.registerResult(op.getResult());
continuation = op.getResult()
.getResponseHeader(HttpHeaderConfigurations.X_MS_CONTINUATION);
}
perfInfo.registerSuccess(true);
countAggregate++;
shouldContinue = continuation != null && !continuation.isEmpty();
Expand All @@ -1090,7 +1101,7 @@ public boolean rename(final Path source,
}

public void delete(final Path path, final boolean recursive,
TracingContext tracingContext) throws AzureBlobFileSystemException {
TracingContext tracingContext) throws AzureBlobFileSystemException {
final Instant startAggregate = abfsPerfTracker.getLatencyInstant();
long countAggregate = 0;
boolean shouldContinue = true;
Expand All @@ -1108,8 +1119,16 @@ public void delete(final Path path, final boolean recursive,
try (AbfsPerfInfo perfInfo = startTracking("delete", "deletePath")) {
AbfsRestOperation op = getClient().deletePath(relativePath, recursive,
continuation, tracingContext, getIsNamespaceEnabled(tracingContext));
perfInfo.registerResult(op.getResult());
continuation = op.getResult().getResponseHeader(HttpHeaderConfigurations.X_MS_CONTINUATION);
/*
* Blob endpoint does not have a directory delete API. The AbfsBlobClient would
* perform multiple operation to delete a path, hence, the client would not return
* AbfsRestOperation object.
*/
if (op != null) {
perfInfo.registerResult(op.getResult());
continuation = op.getResult()
.getResponseHeader(HttpHeaderConfigurations.X_MS_CONTINUATION);
}
perfInfo.registerSuccess(true);
countAggregate++;
shouldContinue = continuation != null && !continuation.isEmpty();
Expand Down Expand Up @@ -1176,6 +1195,8 @@ public FileStatus getFileStatus(final Path path,

perfInfo.registerSuccess(true);

getClient().takeGetPathStatusAtomicRenameKeyAction(path, tracingContext);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function does not do any action for dfs, possible to move this also to blob endpoint ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is an expectation in blob that fs.getPathStatus and fs.listPath can resume a pending rename if the pending-json is found. True that there is no action required in dfs. As far as store is concerned, the implementation is abstracted out to client.

But, the reason why the invocation of the abstract method cannot be pushed down further in client.getFileStatus and client.listPath is that these functions get called in multiple place other than filesystem API call flows. But, as our expectation for resume to only happen is at filesystem api level, invoking the abstract method in store makes sense.

To push this behavior in the client, the client.getPathStatus and client.listPath would have to be overloaded to take a new arg which tells if the method is getting called from the API call flow or not, which I think would be antipattern, but open to your opinions on it.


return new VersionedFileStatus(
transformedOwner,
transformedGroup,
Expand All @@ -1196,6 +1217,7 @@ public FileStatus getFileStatus(final Path path,
/**
* @param path The list path.
* @param tracingContext Tracks identifiers for request header
*
* @return the entries in the path.
* */
@Override
Expand All @@ -1212,6 +1234,7 @@ public FileStatus[] listStatus(final Path path, TracingContext tracingContext) t
* all entries after this non-existent entry in lexical order:
* listStatus(Path("/folder"), "cfile") will return "/folder/hfile" and "/folder/ifile".
* @param tracingContext Tracks identifiers for request header
*
* @return the entries in the path start from "startFrom" in lexical order.
* */
@InterfaceStability.Unstable
Expand Down Expand Up @@ -1290,20 +1313,26 @@ public String listStatus(final Path path, final String startFrom,
Path entryPath = new Path(File.separator + entry.name());
entryPath = entryPath.makeQualified(this.uri, entryPath);

fileStatuses.add(
new VersionedFileStatus(
owner,
group,
fsPermission,
hasAcl,
contentLength,
isDirectory,
1,
blockSize,
lastModifiedMillis,
entryPath,
entry.eTag(),
encryptionContext));
final boolean actionTakenOnRenamePendingJson
= getClient().takeListPathAtomicRenameKeyAction(entryPath,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here

(int) contentLength,
tracingContext);
if (!actionTakenOnRenamePendingJson) {
fileStatuses.add(
new VersionedFileStatus(
owner,
group,
fsPermission,
hasAcl,
contentLength,
isDirectory,
1,
blockSize,
lastModifiedMillis,
entryPath,
entry.eTag(),
encryptionContext));
}
}

perfInfo.registerSuccess(true);
Expand Down Expand Up @@ -1706,10 +1735,6 @@ public void access(final Path path, final FsAction mode,
}
}

public boolean isAtomicRenameKey(String key) {
return isKeyForDirectorySet(key, azureAtomicRenameDirSet);
}

public boolean isInfiniteLeaseKey(String key) {
if (azureInfiniteLeaseDirSet.isEmpty()) {
return false;
Expand Down Expand Up @@ -1865,7 +1890,7 @@ private boolean parseIsDirectory(final String resourceType) {
&& resourceType.equalsIgnoreCase(AbfsHttpConstants.DIRECTORY);
}

private boolean isKeyForDirectorySet(String key, Set<String> dirSet) {
public static boolean isKeyForDirectorySet(String key, Set<String> dirSet) {
for (String dir : dirSet) {
if (dir.isEmpty() || key.startsWith(dir + AbfsHttpConstants.FORWARD_SLASH)) {
return true;
Expand Down Expand Up @@ -2142,7 +2167,8 @@ private AbfsLease maybeCreateLease(String relativePath, TracingContext tracingCo
if (!enableInfiniteLease) {
return null;
}
AbfsLease lease = new AbfsLease(getClient(), relativePath, tracingContext);
AbfsLease lease = new AbfsLease(getClient(), relativePath, true,
INFINITE_LEASE_DURATION, null, tracingContext);
leaseRefs.put(lease, null);
return lease;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,10 @@ public static ApiVersion getCurrentVersion() {
*/
public static final Integer HTTP_STATUS_CATEGORY_QUOTIENT = 100;

public static final String COPY_STATUS_SUCCESS = "success";
public static final String COPY_STATUS_PENDING = "pending";
public static final String COPY_STATUS_ABORTED = "aborted";
public static final String COPY_STATUS_FAILED = "failed";
public static final String XML_TAG_NAME = "Name";
public static final String XML_TAG_BLOB = "Blob";
public static final String XML_TAG_PREFIX = "Prefix";
Expand Down Expand Up @@ -249,5 +253,8 @@ public static ApiVersion getCurrentVersion() {
+ "non-hierarchical-namespace account:"
+ CPK_CONFIG_LIST;

public static final String ATOMIC_DIR_RENAME_RECOVERY_ON_GET_PATH_EXCEPTION =
"Path had to be recovered from atomic rename operation.";

private AbfsHttpConstants() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -346,5 +346,20 @@ public static String accountProperty(String property, String account) {
* @see FileSystem#openFile(org.apache.hadoop.fs.Path)
*/
public static final String FS_AZURE_BUFFERED_PREAD_DISABLE = "fs.azure.buffered.pread.disable";

/**
* Blob copy API is an async API, this configuration defines polling duration
* for checking copy status {@value}
*/
public static final String FS_AZURE_BLOB_COPY_PROGRESS_WAIT_MILLIS = "fs.azure.blob.copy.progress.wait.millis";
/**Blob rename lease refresh duration {@value}*/
public static final String FS_AZURE_BLOB_ATOMIC_RENAME_LEASE_REFRESH_DURATION
= "fs.azure.blob.atomic.rename.lease.refresh.duration";
/**Maximum number of blob information enqueued in memory for rename or delete orchestration {@value}*/
public static final String FS_AZURE_PRODUCER_QUEUE_MAX_SIZE = "fs.azure.blob.dir.list.producer.queue.max.size";
/**Maximum number of thread per blob-rename orchestration {@value}*/
public static final String FS_AZURE_BLOB_DIR_RENAME_MAX_THREAD = "fs.azure.blob.dir.rename.max.thread";
/**Maximum number of thread per blob-delete orchestration {@value}*/
public static final String FS_AZURE_BLOB_DIR_DELETE_MAX_THREAD = "fs.azure.blob.dir.delete.max.thread";
private ConfigurationKeys() {}
}
Loading
Loading