Skip to content

Commit 19b61ef

Browse files
authored
Support per-project client for Azure repository (#132701)
This PR adds per project client support for Azure repository similar to #131899 (GCS) and #127631 (s3). Resolves: ES-11714
1 parent e03b894 commit 19b61ef

File tree

10 files changed

+784
-69
lines changed

10 files changed

+784
-69
lines changed

modules/repository-azure/src/internalClusterTest/java/org/elasticsearch/repositories/azure/AzureBlobStoreRepositoryTests.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import com.sun.net.httpserver.HttpHandler;
1818

1919
import org.elasticsearch.action.support.broadcast.BroadcastResponse;
20+
import org.elasticsearch.cluster.project.ProjectResolver;
21+
import org.elasticsearch.cluster.service.ClusterService;
2022
import org.elasticsearch.common.Randomness;
2123
import org.elasticsearch.common.UUIDs;
2224
import org.elasticsearch.common.blobstore.BlobContainer;
@@ -172,8 +174,13 @@ public TestAzureRepositoryPlugin(Settings settings) {
172174
}
173175

174176
@Override
175-
AzureStorageService createAzureStorageService(Settings settingsToUse, AzureClientProvider azureClientProvider) {
176-
return new AzureStorageService(settingsToUse, azureClientProvider) {
177+
AzureStorageService createAzureStorageService(
178+
Settings settingsToUse,
179+
AzureClientProvider azureClientProvider,
180+
ClusterService clusterService,
181+
ProjectResolver projectResolver
182+
) {
183+
return new AzureStorageService(settingsToUse, azureClientProvider, clusterService, projectResolver) {
177184
@Override
178185
RequestRetryOptions getRetryOptions(LocationMode locationMode, AzureStorageSettings azureStorageSettings) {
179186
return new RequestRetryOptions(

modules/repository-azure/src/internalClusterTest/java/org/elasticsearch/repositories/azure/AzureStorageCleanupThirdPartyTests.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import org.elasticsearch.action.ActionRunnable;
2222
import org.elasticsearch.action.support.PlainActionFuture;
2323
import org.elasticsearch.action.support.master.AcknowledgedResponse;
24+
import org.elasticsearch.cluster.metadata.ProjectId;
25+
import org.elasticsearch.cluster.project.ProjectResolver;
26+
import org.elasticsearch.cluster.service.ClusterService;
2427
import org.elasticsearch.common.Strings;
2528
import org.elasticsearch.common.UUIDs;
2629
import org.elasticsearch.common.blobstore.BlobContainer;
@@ -76,9 +79,14 @@ public TestAzureRepositoryPlugin(Settings settings) {
7679
}
7780

7881
@Override
79-
AzureStorageService createAzureStorageService(Settings settings, AzureClientProvider azureClientProvider) {
82+
AzureStorageService createAzureStorageService(
83+
Settings settings,
84+
AzureClientProvider azureClientProvider,
85+
ClusterService clusterService,
86+
ProjectResolver projectResolver
87+
) {
8088
final long blockSize = ByteSizeValue.ofKb(64L).getBytes() * randomIntBetween(1, 15);
81-
return new AzureStorageService(settings, azureClientProvider) {
89+
return new AzureStorageService(settings, azureClientProvider, clusterService, projectResolver) {
8290
@Override
8391
long getUploadBlockSize() {
8492
return blockSize;
@@ -163,7 +171,7 @@ private void ensureSasTokenPermissions() {
163171
repository.threadPool().generic().execute(ActionRunnable.wrap(future, l -> {
164172
final AzureBlobStore blobStore = (AzureBlobStore) repository.blobStore();
165173
final AzureBlobServiceClient azureBlobServiceClient = blobStore.getService()
166-
.client("default", LocationMode.PRIMARY_ONLY, randomFrom(OperationPurpose.values()));
174+
.client(ProjectId.DEFAULT, "default", LocationMode.PRIMARY_ONLY, randomFrom(OperationPurpose.values()));
167175
final BlobServiceClient client = azureBlobServiceClient.getSyncClient();
168176
try {
169177
final BlobContainerClient blobContainer = client.getBlobContainerClient(blobStore.toString());

modules/repository-azure/src/main/java/org/elasticsearch/repositories/azure/AzureBlobStore.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.apache.logging.log4j.LogManager;
5050
import org.apache.logging.log4j.Logger;
5151
import org.apache.logging.log4j.core.util.Throwables;
52+
import org.elasticsearch.cluster.metadata.ProjectId;
5253
import org.elasticsearch.cluster.metadata.RepositoryMetadata;
5354
import org.elasticsearch.common.UUIDs;
5455
import org.elasticsearch.common.blobstore.BlobContainer;
@@ -117,6 +118,8 @@ public class AzureBlobStore implements BlobStore {
117118
private static final long DEFAULT_READ_CHUNK_SIZE = ByteSizeValue.of(32, ByteSizeUnit.MB).getBytes();
118119
private static final int DEFAULT_UPLOAD_BUFFERS_SIZE = (int) ByteSizeValue.of(64, ByteSizeUnit.KB).getBytes();
119120

121+
@Nullable // for cluster level object store in MP
122+
private final ProjectId projectId;
120123
private final AzureStorageService service;
121124
private final BigArrays bigArrays;
122125
private final RepositoryMetadata repositoryMetadata;
@@ -133,11 +136,13 @@ public class AzureBlobStore implements BlobStore {
133136
private final AzureClientProvider.RequestMetricsHandler requestMetricsHandler;
134137

135138
public AzureBlobStore(
139+
@Nullable ProjectId projectId,
136140
RepositoryMetadata metadata,
137141
AzureStorageService service,
138142
BigArrays bigArrays,
139143
RepositoriesMetrics repositoriesMetrics
140144
) {
145+
this.projectId = projectId;
141146
this.container = Repository.CONTAINER_SETTING.get(metadata.settings());
142147
this.clientName = Repository.CLIENT_NAME.get(metadata.settings());
143148
this.service = service;
@@ -355,7 +360,7 @@ public InputStream getInputStream(OperationPurpose purpose, String blob, long po
355360
totalSize = position + length;
356361
}
357362
BlobAsyncClient blobAsyncClient = asyncClient.getBlobContainerAsyncClient(container).getBlobAsyncClient(blob);
358-
int maxReadRetries = service.getMaxReadRetries(clientName);
363+
int maxReadRetries = service.getMaxReadRetries(projectId, clientName);
359364
try {
360365
return new AzureInputStream(
361366
blobAsyncClient,
@@ -941,7 +946,7 @@ private BlobServiceAsyncClient asyncClient(OperationPurpose purpose) {
941946
}
942947

943948
private AzureBlobServiceClient getAzureBlobServiceClientClient(OperationPurpose purpose) {
944-
return service.client(clientName, locationMode, purpose, requestMetricsHandler);
949+
return service.client(projectId, clientName, locationMode, purpose, requestMetricsHandler);
945950
}
946951

947952
@Override

modules/repository-azure/src/main/java/org/elasticsearch/repositories/azure/AzureRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ protected BlobStore getBlobStore() {
178178

179179
@Override
180180
protected AzureBlobStore createBlobStore() {
181-
final AzureBlobStore blobStore = new AzureBlobStore(metadata, storageService, bigArrays, repositoriesMetrics);
181+
final AzureBlobStore blobStore = new AzureBlobStore(getProjectId(), metadata, storageService, bigArrays, repositoriesMetrics);
182182

183183
logger.debug(
184184
() -> format(
@@ -204,6 +204,6 @@ public boolean isReadOnly() {
204204

205205
@Override
206206
protected Set<String> getExtraUsageFeatures() {
207-
return storageService.getExtraUsageFeatures(Repository.CLIENT_NAME.get(getMetadata().settings()));
207+
return storageService.getExtraUsageFeatures(getProjectId(), Repository.CLIENT_NAME.get(getMetadata().settings()));
208208
}
209209
}

modules/repository-azure/src/main/java/org/elasticsearch/repositories/azure/AzureRepositoryPlugin.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.apache.lucene.util.SetOnce;
1313
import org.elasticsearch.cluster.node.DiscoveryNode;
14+
import org.elasticsearch.cluster.project.ProjectResolver;
1415
import org.elasticsearch.cluster.service.ClusterService;
1516
import org.elasticsearch.common.settings.Setting;
1617
import org.elasticsearch.common.settings.Settings;
@@ -84,13 +85,20 @@ public Map<String, Repository.Factory> getRepositories(
8485
@Override
8586
public Collection<?> createComponents(PluginServices services) {
8687
AzureClientProvider azureClientProvider = AzureClientProvider.create(services.threadPool(), settings);
87-
azureStoreService.set(createAzureStorageService(settings, azureClientProvider));
88+
azureStoreService.set(
89+
createAzureStorageService(settings, azureClientProvider, services.clusterService(), services.projectResolver())
90+
);
8891
assert assertRepositoryAzureMaxThreads(settings, services.threadPool());
8992
return List.of(azureClientProvider);
9093
}
9194

92-
AzureStorageService createAzureStorageService(Settings settingsToUse, AzureClientProvider azureClientProvider) {
93-
return new AzureStorageService(settingsToUse, azureClientProvider);
95+
AzureStorageService createAzureStorageService(
96+
Settings settingsToUse,
97+
AzureClientProvider azureClientProvider,
98+
ClusterService clusterService,
99+
ProjectResolver projectResolver
100+
) {
101+
return new AzureStorageService(settingsToUse, azureClientProvider, clusterService, projectResolver);
94102
}
95103

96104
@Override
@@ -140,7 +148,7 @@ public void reload(Settings settingsToLoad) {
140148
final Map<String, AzureStorageSettings> clientsSettings = AzureStorageSettings.load(settingsToLoad);
141149
AzureStorageService storageService = azureStoreService.get();
142150
assert storageService != null;
143-
storageService.refreshSettings(clientsSettings);
151+
storageService.refreshClusterClientSettings(clientsSettings);
144152
}
145153

146154
private static boolean assertRepositoryAzureMaxThreads(Settings settings, ThreadPool threadPool) {

0 commit comments

Comments
 (0)