Skip to content

Commit e524ec2

Browse files
bilaharithzhangxiping1
authored andcommitted
HADOOP-16922. ABFS: Change User-Agent header (apache#1938)
Contributed by Bilahari T H.
1 parent eac975b commit e524ec2

File tree

6 files changed

+261
-61
lines changed

6 files changed

+261
-61
lines changed

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AbfsConfiguration.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,17 @@ public class AbfsConfiguration{
168168
private boolean enableAutoThrottling;
169169

170170
@StringConfigurationValidatorAnnotation(ConfigurationKey = FS_AZURE_USER_AGENT_PREFIX_KEY,
171-
DefaultValue = "")
171+
DefaultValue = DEFAULT_FS_AZURE_USER_AGENT_PREFIX)
172172
private String userAgentId;
173173

174+
@StringConfigurationValidatorAnnotation(ConfigurationKey = FS_AZURE_CLUSTER_NAME,
175+
DefaultValue = DEFAULT_VALUE_UNKNOWN)
176+
private String clusterName;
177+
178+
@StringConfigurationValidatorAnnotation(ConfigurationKey = FS_AZURE_CLUSTER_TYPE,
179+
DefaultValue = DEFAULT_VALUE_UNKNOWN)
180+
private String clusterType;
181+
174182
@BooleanConfigurationValidatorAnnotation(ConfigurationKey = FS_AZURE_ENABLE_DELEGATION_TOKEN,
175183
DefaultValue = DEFAULT_ENABLE_DELEGATION_TOKEN)
176184
private boolean enableDelegationToken;
@@ -479,6 +487,14 @@ public String getCustomUserAgentPrefix() {
479487
return this.userAgentId;
480488
}
481489

490+
public String getClusterName() {
491+
return this.clusterName;
492+
}
493+
494+
public String getClusterType() {
495+
return this.clusterType;
496+
}
497+
482498
public DelegatingSSLSocketFactory.SSLChannelMode getPreferredSSLFactoryOption() {
483499
return getEnum(FS_AZURE_SSL_CHANNEL_MODE_KEY, DEFAULT_FS_AZURE_SSL_CHANNEL_MODE);
484500
}

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/AbfsHttpConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,13 @@ public final class AbfsHttpConstants {
4242
public static final String DEFAULT_TIMEOUT = "90";
4343
public static final String TOKEN_VERSION = "2";
4444

45+
public static final String JAVA_VENDOR = "java.vendor";
4546
public static final String JAVA_VERSION = "java.version";
4647
public static final String OS_NAME = "os.name";
4748
public static final String OS_VERSION = "os.version";
49+
public static final String OS_ARCH = "os.arch";
4850

51+
public static final String APN_VERSION = "APN/1.0";
4952
public static final String CLIENT_VERSION = "Azure Blob FS/" + VersionInfo.getVersion();
5053

5154
// Abfs Http Verb

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/ConfigurationKeys.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public final class ConfigurationKeys {
6262
* Default value of this config is true. **/
6363
public static final String FS_AZURE_DISABLE_OUTPUTSTREAM_FLUSH = "fs.azure.disable.outputstream.flush";
6464
public static final String FS_AZURE_USER_AGENT_PREFIX_KEY = "fs.azure.user.agent.prefix";
65+
public static final String FS_AZURE_CLUSTER_NAME = "fs.azure.cluster.name";
66+
public static final String FS_AZURE_CLUSTER_TYPE = "fs.azure.cluster.type";
6567
public static final String FS_AZURE_SSL_CHANNEL_MODE_KEY = "fs.azure.ssl.channel.mode";
6668
/** Provides a config to enable/disable the checkAccess API.
6769
* By default this will be

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/FileSystemConfigurations.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.apache.hadoop.classification.InterfaceStability;
2323
import org.apache.hadoop.security.ssl.DelegatingSSLSocketFactory;
2424

25+
import static org.apache.hadoop.fs.azurebfs.constants.AbfsHttpConstants.EMPTY_STRING;
26+
2527
/**
2628
* Responsible to keep all the Azure Blob File System related configurations.
2729
*/
@@ -71,5 +73,8 @@ public final class FileSystemConfigurations {
7173
public static final boolean DEFAULT_ENABLE_CHECK_ACCESS = false;
7274
public static final boolean DEFAULT_ABFS_LATENCY_TRACK = false;
7375

76+
public static final String DEFAULT_FS_AZURE_USER_AGENT_PREFIX = EMPTY_STRING;
77+
public static final String DEFAULT_VALUE_UNKNOWN = "UNKNOWN";
78+
7479
private FileSystemConfigurations() {}
7580
}

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsClient.java

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -679,32 +679,60 @@ public AuthType getAuthType() {
679679

680680
@VisibleForTesting
681681
String initializeUserAgent(final AbfsConfiguration abfsConfiguration,
682-
final String sslProviderName) {
682+
final String sslProviderName) {
683+
683684
StringBuilder sb = new StringBuilder();
684-
sb.append("(JavaJRE ");
685+
686+
sb.append(APN_VERSION);
687+
sb.append(SINGLE_WHITE_SPACE);
688+
sb.append(CLIENT_VERSION);
689+
sb.append(SINGLE_WHITE_SPACE);
690+
691+
sb.append("(");
692+
693+
sb.append(System.getProperty(JAVA_VENDOR)
694+
.replaceAll(SINGLE_WHITE_SPACE, EMPTY_STRING));
695+
sb.append(SINGLE_WHITE_SPACE);
696+
sb.append("JavaJRE");
697+
sb.append(SINGLE_WHITE_SPACE);
685698
sb.append(System.getProperty(JAVA_VERSION));
686-
sb.append("; ");
687-
sb.append(
688-
System.getProperty(OS_NAME).replaceAll(SINGLE_WHITE_SPACE, EMPTY_STRING));
689-
sb.append(" ");
699+
sb.append(SEMICOLON);
700+
sb.append(SINGLE_WHITE_SPACE);
701+
702+
sb.append(System.getProperty(OS_NAME)
703+
.replaceAll(SINGLE_WHITE_SPACE, EMPTY_STRING));
704+
sb.append(SINGLE_WHITE_SPACE);
690705
sb.append(System.getProperty(OS_VERSION));
691-
if (sslProviderName != null && !sslProviderName.isEmpty()) {
692-
sb.append("; ");
693-
sb.append(sslProviderName);
694-
}
695-
String tokenProviderField =
696-
ExtensionHelper.getUserAgentSuffix(tokenProvider, "");
697-
if (!tokenProviderField.isEmpty()) {
698-
sb.append("; ").append(tokenProviderField);
699-
}
706+
sb.append(FORWARD_SLASH);
707+
sb.append(System.getProperty(OS_ARCH));
708+
sb.append(SEMICOLON);
709+
710+
appendIfNotEmpty(sb, sslProviderName, true);
711+
appendIfNotEmpty(sb,
712+
ExtensionHelper.getUserAgentSuffix(tokenProvider, EMPTY_STRING), true);
713+
714+
sb.append(SINGLE_WHITE_SPACE);
715+
sb.append(abfsConfiguration.getClusterName());
716+
sb.append(FORWARD_SLASH);
717+
sb.append(abfsConfiguration.getClusterType());
718+
700719
sb.append(")");
701-
final String userAgentComment = sb.toString();
702-
String customUserAgentId = abfsConfiguration.getCustomUserAgentPrefix();
703-
if (customUserAgentId != null && !customUserAgentId.isEmpty()) {
704-
return String.format(Locale.ROOT, CLIENT_VERSION + " %s %s",
705-
userAgentComment, customUserAgentId);
720+
721+
appendIfNotEmpty(sb, abfsConfiguration.getCustomUserAgentPrefix(), false);
722+
723+
return String.format(Locale.ROOT, sb.toString());
724+
}
725+
726+
private void appendIfNotEmpty(StringBuilder sb, String regEx,
727+
boolean shouldAppendSemiColon) {
728+
if (regEx == null || regEx.trim().isEmpty()) {
729+
return;
730+
}
731+
sb.append(SINGLE_WHITE_SPACE);
732+
sb.append(regEx);
733+
if (shouldAppendSemiColon) {
734+
sb.append(SEMICOLON);
706735
}
707-
return String.format(Locale.ROOT, CLIENT_VERSION + " %s", userAgentComment);
708736
}
709737

710738
@VisibleForTesting

0 commit comments

Comments
 (0)