Skip to content

Commit 6d2581d

Browse files
authored
fix: Minimize initialize at buildtime (#1465)
1 parent 8658684 commit 6d2581d

4 files changed

Lines changed: 37 additions & 63 deletions

File tree

java-storage-nio/google-cloud-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageConfiguration.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,27 @@ public abstract class CloudStorageConfiguration {
3434

3535
public static final CloudStorageConfiguration DEFAULT = builder().build();
3636

37+
// Users can change this: then this affects every filesystem object created
38+
// later, including via SPI. This is meant to be done only once, at the beginning
39+
// of some main program, in order to force all libraries to use some settings we like.
40+
// Libraries should never call this. It'll cause surprise to the writers of the main
41+
// program and they'll be unhappy. Instead, create your own filesystem object with the
42+
// right configuration and pass it along.
43+
private static CloudStorageConfiguration userSpecifiedDefault = CloudStorageConfiguration.DEFAULT;
44+
45+
// Don't call this one, call the one in CloudStorageFileSystemProvider.
46+
static void setUserSpecifiedDefault(@Nullable CloudStorageConfiguration config) {
47+
if (null == config) {
48+
userSpecifiedDefault = CloudStorageConfiguration.DEFAULT;
49+
} else {
50+
userSpecifiedDefault = config;
51+
}
52+
}
53+
54+
static CloudStorageConfiguration getUserSpecifiedDefault() {
55+
return userSpecifiedDefault;
56+
}
57+
3758
/** Returns path of current working directory. This defaults to the root directory. */
3859
public abstract String workingDirectory();
3960

java-storage-nio/google-cloud-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageFileSystem.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,13 @@ public CloudStorageFileSystemProvider load(ProviderCacheKey key) {
8888
}
8989
});
9090

91-
// Users can change this: then this affects every filesystem object created
92-
// later, including via SPI. This is meant to be done only once, at the beginning
93-
// of some main program, in order to force all libraries to use some settings we like.
94-
// Libraries should never call this. It'll cause surprise to the writers of the main
95-
// program and they'll be unhappy. Instead, create your own filesystem object with the
96-
// right configuration and pass it along.
97-
private static CloudStorageConfiguration userSpecifiedDefault = CloudStorageConfiguration.DEFAULT;
98-
9991
// Don't call this one, call the one in CloudStorageFileSystemProvider.
10092
static void setDefaultCloudStorageConfiguration(CloudStorageConfiguration config) {
101-
if (null == config) {
102-
userSpecifiedDefault = CloudStorageConfiguration.DEFAULT;
103-
} else {
104-
userSpecifiedDefault = config;
105-
}
93+
CloudStorageConfiguration.setUserSpecifiedDefault(config);
10694
}
10795

10896
static CloudStorageConfiguration getDefaultCloudStorageConfiguration() {
109-
return userSpecifiedDefault;
97+
return CloudStorageConfiguration.getUserSpecifiedDefault();
11098
}
11199

112100
/**
@@ -153,7 +141,7 @@ public static Page<Bucket> listBuckets(
153141
*/
154142
@CheckReturnValue
155143
public static CloudStorageFileSystem forBucket(String bucket) {
156-
return forBucket(bucket, userSpecifiedDefault);
144+
return forBucket(bucket, CloudStorageConfiguration.getUserSpecifiedDefault());
157145
}
158146

159147
/**

java-storage-nio/google-cloud-nio/src/main/java/com/google/cloud/storage/contrib/nio/CloudStorageFileSystemProvider.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,13 @@
9999
public final class CloudStorageFileSystemProvider extends FileSystemProvider {
100100

101101
private Storage storage;
102-
private final StorageOptions storageOptions;
102+
// if null, use StorageOptionsUtil.getDefaultInstance()
103+
private final @Nullable StorageOptions storageOptions;
103104
// if non-null, we pay via this project.
104105
private final @Nullable String userProject;
105106

106107
// used only when we create a new instance of CloudStorageFileSystemProvider.
107-
private static StorageOptions futureStorageOptions = StorageOptionsUtil.getDefaultInstance();
108+
private static StorageOptions futureStorageOptions = null;
108109

109110
private static class LazyPathIterator extends AbstractIterator<Path> {
110111
private final Iterator<Blob> blobIterator;
@@ -181,7 +182,7 @@ public static void setStorageOptions(@Nullable StorageOptions newStorageOptions)
181182
*/
182183
public static void setDefaultCloudStorageConfiguration(
183184
@Nullable CloudStorageConfiguration newDefault) {
184-
CloudStorageFileSystem.setDefaultCloudStorageConfiguration(newDefault);
185+
CloudStorageConfiguration.setUserSpecifiedDefault(newDefault);
185186
}
186187

187188
/**
@@ -191,9 +192,7 @@ public static void setDefaultCloudStorageConfiguration(
191192
* @see CloudStorageFileSystem#forBucket(String)
192193
*/
193194
public CloudStorageFileSystemProvider() {
194-
this(
195-
CloudStorageFileSystem.getDefaultCloudStorageConfiguration().userProject(),
196-
futureStorageOptions);
195+
this(CloudStorageConfiguration.getUserSpecifiedDefault().userProject(), futureStorageOptions);
197196
}
198197

199198
/**
@@ -212,7 +211,7 @@ public CloudStorageFileSystemProvider() {
212211
this.storageOptions =
213212
gcsStorageOptions != null
214213
? StorageOptionsUtil.mergeOptionsWithUserAgent(gcsStorageOptions)
215-
: StorageOptionsUtil.getDefaultInstance();
214+
: null;
216215
this.userProject = userProject;
217216
}
218217

@@ -1227,6 +1226,9 @@ private IOException asIoException(StorageException oops, boolean operationWasCop
12271226

12281227
@VisibleForTesting
12291228
void doInitStorage() {
1230-
this.storage = storageOptions.getService();
1229+
this.storage =
1230+
storageOptions != null
1231+
? storageOptions.getService()
1232+
: StorageOptionsUtil.getDefaultInstance().getService();
12311233
}
12321234
}
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,8 @@
11
# Using META-INF/services with Native Image compilation results in
22
# FileSystemProvider being initialized at build time. This results
33
# CloudStorageFileSystemProvider and some classes referenced by
4-
# this class (for example, StorageOptions, StorageOptionsUtil,
5-
# DefaultStorageRetryStrategy) being unexpectedly and recursively initialized at
4+
# this class (for example, CloudStorageConfiguration)
5+
# being unexpectedly and recursively initialized at
66
# build time.
77
Args = --initialize-at-build-time=com.google.cloud.storage.contrib.nio.CloudStorageFileSystemProvider,\
8-
com.google.cloud.storage.contrib.nio.CloudStorageConfiguration,\
9-
com.google.cloud.storage.contrib.nio.CloudStorageFileSystem,\
10-
com.google.cloud.storage.contrib.nio.StorageOptionsUtil,\
11-
com.google.cloud.storage.StorageException,\
12-
com.google.cloud.storage.StorageOptions,\
13-
com.google.cloud.storage.DefaultStorageRetryStrategy,\
14-
com.google.api.client.http.OpenCensusUtils,\
15-
com.google.api.client.http.GenericUrl,\
16-
com.google.api.client.http.HttpRequest,\
17-
com.google.api.client.http.HttpMediaType,\
18-
com.google.api.client.http.javanet.NetHttpTransport,\
19-
com.google.api.client.util.Base64,\
20-
com.google.api.client.util.Data,\
21-
com.google.api.client.util.DateTime,\
22-
com.google.auth.oauth2,\
23-
io.opencensus.trace,\
24-
com.google.api.client.util.escape.CharEscapers,\
25-
com.google.api.client.util.escape.PercentEscaper,\
26-
io.opencensus.contrib.http.util.CloudTraceFormat,\
27-
io.grpc.Context,\
28-
io.grpc.Context$LazyStorage,\
29-
io.grpc.ThreadLocalContextStorage,\
30-
com.google.common.cache.LocalCache,\
31-
com.google.common.cache.CacheBuilder,\
32-
com.google.common.math.IntMath$1,\
33-
com.google.common.collect.RegularImmutableMap,\
34-
com.google.gson.stream.JsonReader,\
35-
com.google.api.client.json.gson.GsonParser$1,\
36-
com.google.api.client.json.JsonParser$1,\
37-
com.google.cloud.PlatformInformation,\
38-
com.google.cloud.ExceptionHandler,\
39-
org.threeten.bp.Duration,\
40-
com.google.common.io.BaseEncoding$Base16Encoding,\
41-
com.google.common.io.BaseEncoding$Base64Encoding,\
42-
com.google.common.io.BaseEncoding,\
43-
com.google.common.io.BaseEncoding$StandardBaseEncoding,\
44-
com.google.api.client.util.PemReader,\
45-
com.google.common.base.Charsets
8+
com.google.cloud.storage.contrib.nio.CloudStorageConfiguration

0 commit comments

Comments
 (0)