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

TASK-6722 - Variant Walker to enable user defined variant analysis #2522

Merged
merged 68 commits into from
Dec 20, 2024
Merged
Changes from 1 commit
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
4b8dad2
storage: Add variant-walker tool #TASK-6722
j-coll Oct 8, 2024
9ea00eb
storage: Add STDERR to exception thrown. Fix max_bytes_per_map. #TASK…
j-coll Oct 10, 2024
7558a26
storage: Add satus details when throwing exceptions. #TASK-6722
j-coll Oct 10, 2024
bc7c6ae
storage: Fix walker output file name #TASK-6722
j-coll Oct 11, 2024
ab4dff5
storage: Properly configure task java heap #TASK-6722
j-coll Oct 15, 2024
7af8020
storage: Run docker image prune on cleanup. #TASK-6722
j-coll Oct 16, 2024
c5375ea
storage: Ensure walker output is sorted. #TASK-6722
j-coll Oct 24, 2024
663c03a
storage: Extract walker STDERR file from MR execution. #TASK-6722
j-coll Oct 25, 2024
154befa
storage: Do not write multiple headers. #TASK-6722
j-coll Oct 25, 2024
85aac6d
storage: Fix NoSuchMethodError creating StopWatch. #TASK-6722
j-coll Oct 25, 2024
697b08b
storage: Ensure stderr file is moved from scratch dir. #TASK-6722
j-coll Oct 25, 2024
356567e
storage: Fix stderr sorting. #TASK-6722
j-coll Oct 25, 2024
6253da3
storage: Write `\n` after the json header #TASK-6722
j-coll Oct 25, 2024
5789628
storage: Do not interrupt header with empty records. #TASK-6722
j-coll Oct 29, 2024
4ff0655
storage: Add a custom Partitioner to ensure sorted data with multiple…
j-coll Oct 29, 2024
8268266
storage: Fix partitioner. #TASK-6722
j-coll Oct 29, 2024
4147d01
storage: Restart process when changing chromosome to ensure correct s…
j-coll Oct 29, 2024
7fd439a
storage: Fix GenomeHellper generateBootPreSplits. #TASK-6722
j-coll Oct 29, 2024
e6128b0
storage: Do not interrupt header with empty lines while concat. #TASK…
j-coll Oct 30, 2024
100fecf
storage: Replace ImmutableBytesWritable with VariantLocusKey as map o…
j-coll Oct 31, 2024
0df69dc
storage: Use VariantLocusKey and VariantLocusPartitioner in VariantEx…
j-coll Oct 31, 2024
f6fd3d4
storage: Fix VariantLocusKey serialization. #TASK-6722
j-coll Nov 1, 2024
fa3c9f2
storage: Fix "Request body si too large" #TASK-6722
j-coll Nov 4, 2024
b528c03
analysis: Do not try to close twice the same ERM. #TASK-6722
j-coll Nov 4, 2024
96e5679
storage: Do not use flush on outputstream. HADOOP-16548 #TASK-6722
j-coll Nov 7, 2024
bcd8185
storage: Add VariantExporterDirectMultipleOutputsMapper to ensure sor…
j-coll Nov 7, 2024
c4c3d3b
storage: Do not use reduce step on variant-walker. #TASK-6722
j-coll Nov 7, 2024
0100097
storage: Fix VariantRecordWriter bytes_written counter. #TASK-6722
j-coll Nov 7, 2024
b52ca27
storage: Reduce number of intermediate mapper files. #TASK-6722
j-coll Nov 8, 2024
ad3521e
storage: Use SNAPPY as intermediate compression algorithm. #TASK-6722
j-coll Nov 8, 2024
ab50d6e
storage: Disable flush on AbfsOutputStream. HADOOP-16548 #TASK-6722
j-coll Nov 11, 2024
212f8ce
storage: Centralize variantMapperJob initialitation. #TASK-6722
j-coll Nov 11, 2024
2a39303
storage: Fix NoClassDefFoundError tephra. #TASK-7194 #TASK-6722
j-coll Nov 12, 2024
ae26598
storage: Fix NPE exporting from sampleindex. #TASK-6722
j-coll Nov 12, 2024
b000ec7
storage: Ensure variant-exports are sorted even from Phoenix. #TASK-6722
j-coll Nov 18, 2024
0a741d5
storage: Use HDFS to store intermediate MapReduce files. Concat local…
j-coll Nov 25, 2024
cd50a3c
storage: Improve MapReduceOutputFile concatMrOutputToLocal. #TASK-6722
j-coll Nov 25, 2024
d430391
storage: Increase mapreduce.task.timeout to 30min #TASK-6722
j-coll Nov 25, 2024
e35ee83
storage: Fix temporary mapreduce outdir. #TASK-6722
j-coll Nov 25, 2024
0c48603
storage: Do not double copy hdfs files #TASK-6722
j-coll Nov 26, 2024
ccf7438
storage: Use reducer to concat binary files #TASK-6722
j-coll Nov 26, 2024
f87686e
storage: Do not fail vairant-walker if no output is produced. #TASK-6722
j-coll Nov 27, 2024
a389e10
storage: Split PhoenixInputSplits into smaller splits. #TASK-6722
j-coll Nov 27, 2024
f453090
storage: Improve log message. #TASK-6722
j-coll Nov 27, 2024
47535c1
storage: Add HadoopVariantWalkerTest. #TASK-6722
j-coll Nov 28, 2024
003e467
storage: Rename some variant-walker params. Add descriptions #TASK-6722
j-coll Nov 28, 2024
48e1592
storage: Fix NPE running SampleVariantStats #TASK-6722
j-coll Nov 28, 2024
1d86756
storage: Fix CustomPhoenixInputFormat generateSplit for first and las…
j-coll Nov 29, 2024
5141031
analysis: Fix NPE at relatedness tool. #TASK-6722
j-coll Nov 29, 2024
c48ce0a
Merge branch 'release-3.x.x' into TASK-6722
j-coll Nov 29, 2024
f2bc782
cicd: Upload tests logs as artifacts. Reduce action log size. #TASK-6722
j-coll Nov 29, 2024
dd684aa
storage: Fix NPE at CohortVariantStatsDriver. #TASK-6722
j-coll Nov 29, 2024
9795c6a
cicd: Fix NPE. #TASK-6722
j-coll Nov 29, 2024
923651c
storage: Fix AIOOBE SampleVariantStatsDriver #TASK-6722
j-coll Nov 29, 2024
90010ac
storage: Do not produce a .crc checksum file copying from hdfs. #TASK…
j-coll Nov 29, 2024
9f326d9
storage: Improve docker process failure. Do not close the stdin twice…
j-coll Nov 29, 2024
627e56a
storage: Fix AIOOBE SampleVariantStatsDriver #TASK-6722
j-coll Nov 29, 2024
98ce6f8
storage: Do not produce a .crc checksum file copying from hdfs. #TASK…
j-coll Nov 29, 2024
14c07d9
analysis: Do not use the scratchDir as intermediate folder for export…
j-coll Nov 29, 2024
050c1ee
storage: Improve collections usage in SampleVariantStatsDriver. #TASK…
j-coll Nov 29, 2024
a0c2a5f
analysis: Fix VariantAnalysisTest. #TASK-6722
j-coll Dec 2, 2024
3853c63
app: Regenerate cli. #TASK-6722
j-coll Dec 3, 2024
eb61609
storage: Fix junit tests. #TASK-6722
j-coll Dec 3, 2024
54acc28
cicd: Increase "Publish Test Report on GitHub" memory #TASK-6722
j-coll Dec 4, 2024
4e96492
core: Fix NumberFormatException from IOUtils. #TASK-6722
j-coll Dec 4, 2024
0851ea9
Merge branch 'release-3.x.x' into TASK-6722
j-coll Dec 19, 2024
852ffca
core: Remove unused method. #TASK-6722
j-coll Dec 19, 2024
005855f
storage: Do not add new abstract methods to VariantStorageEngine. #TA…
j-coll Dec 19, 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
Prev Previous commit
Next Next commit
storage: Add STDERR to exception thrown. Fix max_bytes_per_map. #TASK…
…-6722
  • Loading branch information
j-coll committed Oct 10, 2024
commit 9ea00ebc21068fed1f919e1e975161e65b43c25b
Original file line number Diff line number Diff line change
@@ -26,7 +26,6 @@
import org.opencb.opencga.core.models.variant.VariantWalkerParams;
import org.opencb.opencga.core.tools.annotations.Tool;
import org.opencb.opencga.core.tools.annotations.ToolParams;
import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam;
import org.opencb.opencga.storage.core.variant.io.VariantWriterFactory;

import java.net.URI;
@@ -55,6 +54,15 @@ protected void check() throws Exception {
}

format = VariantWriterFactory.toOutputFormat(toolParams.getOutputFileName(), toolParams.getOutputFileName());
if (!format.isPlain()) {
format = format.inPlain();
}

if (StringUtils.isEmpty(toolParams.getOutputFileName())) {
toolParams.setOutputFileName("output." + format.toString().toLowerCase() + ".gz");
} else if (!toolParams.getOutputFileName().endsWith(".gz")) {
toolParams.setOutputFileName(toolParams.getOutputFileName() + ".gz");
}
}

@Override
@@ -70,15 +78,11 @@ protected void run() throws Exception {
// The scratch directory is expected to be faster than the final directory
// This also avoids moving files to final directory if the tool fails
Path outDir = getScratchDir();
String outputFile = StringUtils.isEmpty(toolParams.getOutputFileName())
? outDir.toString()
: outDir.resolve(toolParams.getOutputFileName()).toString();
String outputFile = outDir.resolve(toolParams.getOutputFileName()).toString();
Query query = toolParams.toQuery();
QueryOptions queryOptions = new QueryOptions(params);
for (VariantQueryParam param : VariantQueryParam.values()) {
queryOptions.remove(param.key());
}
uris.addAll(variantStorageManager.walkData(outputFile,
QueryOptions queryOptions = new QueryOptions().append(QueryOptions.INCLUDE, toolParams.getInclude())
.append(QueryOptions.EXCLUDE, toolParams.getExclude());
uris.add(variantStorageManager.walkData(outputFile,
format, query, queryOptions, toolParams.getDockerImage(), toolParams.getCommandLine(), token));
});
step("move-files", () -> {
Original file line number Diff line number Diff line change
@@ -88,6 +88,7 @@
import org.opencb.opencga.storage.core.variant.VariantStorageOptions;
import org.opencb.opencga.storage.core.variant.adaptors.*;
import org.opencb.opencga.storage.core.variant.adaptors.iterators.VariantDBIterator;
import org.opencb.opencga.storage.core.variant.io.VariantWriterFactory;
import org.opencb.opencga.storage.core.variant.io.VariantWriterFactory.VariantOutputFormat;
import org.opencb.opencga.storage.core.variant.query.ParsedQuery;
import org.opencb.opencga.storage.core.variant.query.VariantQueryResult;
@@ -98,6 +99,7 @@

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.TimeUnit;
@@ -202,14 +204,19 @@ public List<URI> exportData(String outputFile, VariantOutputFormat outputFormat,
* @throws StorageEngineException If there is any error exporting variants
* @return generated files
*/
public List<URI> walkData(String outputFile, VariantOutputFormat format,
public URI walkData(String outputFile, VariantOutputFormat format,
Query query, QueryOptions queryOptions, String dockerImage, String commandLine, String token)
throws CatalogException, StorageEngineException {
String anyStudy = catalogUtils.getAnyStudy(query, token);
return secureAnalysis(VariantWalkerTool.ID, anyStudy, queryOptions, token, engine -> {
Query finalQuery = catalogUtils.parseQuery(query, queryOptions, engine.getCellBaseUtils(), token);
checkSamplesPermissions(finalQuery, queryOptions, token);
URI outputUri = new VariantExportOperationManager(this, engine).getOutputUri(outputFile, format, finalQuery, token);
URI outputUri;
try {
outputUri = UriUtils.createUri(outputFile);
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e);
}
return engine.walkData(outputUri, format, finalQuery, queryOptions, dockerImage, commandLine);
});
}
@@ -533,7 +540,7 @@ public boolean hasVariantSetup(String studyStr, String token) throws CatalogExce

public ObjectMap configureProject(String projectStr, ObjectMap params, String token) throws CatalogException, StorageEngineException {
return secureOperationByProject("configure", projectStr, params, token, engine -> {
validateNewConfiguration(engine, params);
validateNewConfiguration(engine, params, token);

DataStore dataStore = getDataStoreByProjectId(projectStr, token);

@@ -546,7 +553,7 @@ public ObjectMap configureProject(String projectStr, ObjectMap params, String to

public ObjectMap configureStudy(String studyStr, ObjectMap params, String token) throws CatalogException, StorageEngineException {
return secureOperation("configure", studyStr, params, token, engine -> {
validateNewConfiguration(engine, params);
validateNewConfiguration(engine, params, token);
Study study = catalogManager.getStudyManager()
.get(studyStr,
new QueryOptions(INCLUDE, StudyDBAdaptor.QueryParams.INTERNAL_CONFIGURATION_VARIANT_ENGINE_OPTIONS.key()),
@@ -570,12 +577,13 @@ public ObjectMap configureStudy(String studyStr, ObjectMap params, String token)
});
}

private void validateNewConfiguration(VariantStorageEngine engine, ObjectMap params) throws StorageEngineException {
for (VariantStorageOptions option : VariantStorageOptions.values()) {
if (option.isProtected() && params.get(option.key()) != null) {
throw new StorageEngineException("Unable to update protected option '" + option.key() + "'");
}
private void validateNewConfiguration(VariantStorageEngine engine, ObjectMap params, String token)
throws StorageEngineException, CatalogException {
if (catalogManager.getAuthorizationManager().isOpencgaAdministrator(catalogManager.getUserManager().validateToken(token))) {
logger.info("Skip configuration validation. User is an admin.");
return;
}
engine.validateNewConfiguration(params);
}

/**
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@
import org.opencb.opencga.core.testclassification.duration.MediumTests;
import org.opencb.opencga.storage.core.exceptions.StorageEngineException;
import org.opencb.opencga.storage.core.variant.VariantStorageEngine;
import org.opencb.opencga.storage.core.variant.VariantStorageOptions;

import java.util.Collections;
import java.util.HashSet;
@@ -101,6 +102,21 @@ public void testConfigure() throws CatalogException, StorageEngineException {
assertNotNull(vse2.getOptions().get("KeyFromTheSecondStudy"));
}

@Test
public void testConfigureProtectedValues() throws Exception {
VariantStorageOptions key = VariantStorageOptions.WALKER_DOCKER_MEMORY;
assertTrue(key.isProtected());
ObjectMap conf = new ObjectMap(key.key(), "30g");

String fqn = catalogManager.getProjectManager().get(projectId, null, sessionId).first().getFqn();

variantManager.configureProject(fqn, new ObjectMap(conf), opencga.getAdminToken());

thrown.expect(StorageEngineException.class);
thrown.expectMessage("Unable to update protected option '" + key.key() + "'");
variantManager.configureProject(projectId, new ObjectMap(conf), sessionId);
}

@Test
public void testConfigureSampleIndex() throws Exception {
SampleIndexConfiguration conf = getRandomConf();
Original file line number Diff line number Diff line change
@@ -285,7 +285,7 @@ public List<URI> exportData(URI outputFile, VariantOutputFormat outputFormat, UR
return exporter.export(outputFile, outputFormat, variantsFile, parsedVariantQuery);
}

public List<URI> walkData(URI outputFile, VariantWriterFactory.VariantOutputFormat format, Query query, QueryOptions queryOptions,
public URI walkData(URI outputFile, VariantWriterFactory.VariantOutputFormat format, Query query, QueryOptions queryOptions,
String dockerImage, String commandLine)
throws IOException, StorageEngineException {
if (format == VariantWriterFactory.VariantOutputFormat.VCF || format == VariantWriterFactory.VariantOutputFormat.VCF_GZ) {
@@ -304,8 +304,11 @@ public List<URI> walkData(URI outputFile, VariantWriterFactory.VariantOutputForm

String dockerCommandLine = "docker run --rm -i "
+ "--memory " + memory + " "
+ "--cpus " + cpu + " "
+ "--user " + user + " ";
+ "--cpus " + cpu + " ";

if (StringUtils.isNotEmpty(user)) {
dockerCommandLine += "--user " + user + " ";
}

if (StringUtils.isNotEmpty(volume)) {
dockerCommandLine += "-v " + volume + ":/data ";
@@ -323,7 +326,7 @@ public List<URI> walkData(URI outputFile, VariantWriterFactory.VariantOutputForm
}


public abstract List<URI> walkData(URI outputFile, VariantOutputFormat format, Query query, QueryOptions queryOptions,
public abstract URI walkData(URI outputFile, VariantOutputFormat format, Query query, QueryOptions queryOptions,
String commandLine)
throws StorageEngineException;

@@ -1202,6 +1205,14 @@ public abstract void loadVariantScore(URI scoreFile, String study, String scoreN
@Override
public abstract void testConnection() throws StorageEngineException;

public void validateNewConfiguration(ObjectMap params) throws StorageEngineException {
for (VariantStorageOptions option : VariantStorageOptions.values()) {
if (option.isProtected() && params.get(option.key()) != null) {
throw new StorageEngineException("Unable to update protected option '" + option.key() + "'");
}
}
}

public void reloadCellbaseConfiguration() {
cellBaseUtils = null;
}
Original file line number Diff line number Diff line change
@@ -102,7 +102,7 @@ public enum VariantStorageOptions implements ConfigurationOption {

WALKER_DOCKER_MEMORY("walker.docker.memory", "512m", true),
WALKER_DOCKER_CPU("walker.docker.cpu", "1", true),
WALKER_DOCKER_USER("walker.docker.user", "root", true),
WALKER_DOCKER_USER("walker.docker.user", "", true),
WALKER_DOCKER_ENV("walker.docker.env", "", true),
WALKER_DOCKER_MOUNT("walker.docker.mount", "", true),
WALKER_DOCKER_OPTS("walker.docker.opts", "", true),
Original file line number Diff line number Diff line change
@@ -122,7 +122,7 @@ public boolean isSnappy() {
return extension.endsWith(".snappy");
}

public VariantOutputFormat inPlan() {
public VariantOutputFormat inPlain() {
if (!isPlain()) {
return VariantOutputFormat.valueOf(name().replace("_GZ", "").replace("_SNAPPY", ""));
} else {
Original file line number Diff line number Diff line change
@@ -128,6 +128,13 @@ variant:
search.intersect.always: false # Force intersect queries
search.intersect.params.threshold: 3 # Minimum number of QueryParams in the query to intersect

walker.docker.memory: "512m" # Memory limit for the docker executor
walker.docker.cpu: "1" # CPU limit for the docker executor
walker.docker.user: "" # User to run the docker executor
walker.docker.env: "" # Environment variables to be passed to the docker executor. e.g. key=value,key2=value2
walker.docker.mount: "" # Volumes to be mounted in the docker executor
walker.docker.opts: "" # Additional docker options

## The following section defines all available storage engine plugins installed
engines:
## Hadoop Storage Engine
@@ -177,6 +184,9 @@ variant:
# See opencb/opencga#352 for more info.
storage.hadoop.mr.scanner.timeout: 300000

# DOCKER_HOST environment variable to be used by the docker executor inside the MapReduce job
storage.hadoop.mr.stream.docker.host: ""

mapreduce.map.memory.mb: 2048
DeleteHBaseColumnDriver:
storage.hadoop.write.mappers.limit.factor: 4
Original file line number Diff line number Diff line change
@@ -143,7 +143,7 @@ public void importData(URI input, VariantMetadata metadata, List<StudyConfigurat
}

@Override
public List<URI> walkData(URI outputFile, VariantWriterFactory.VariantOutputFormat format, Query query, QueryOptions queryOptions, String commandLine) throws StorageEngineException {
public URI walkData(URI outputFile, VariantWriterFactory.VariantOutputFormat format, Query query, QueryOptions queryOptions, String commandLine) throws StorageEngineException {
throw new UnsupportedOperationException("Unable to walk data in " + getStorageEngineId());
}

Original file line number Diff line number Diff line change
@@ -317,20 +317,38 @@ protected VariantExporter newVariantExporter(VariantMetadataFactory metadataFact
}

@Override
public List<URI> walkData(URI outputFile, VariantWriterFactory.VariantOutputFormat format,
public URI walkData(URI outputFile, VariantWriterFactory.VariantOutputFormat format,
Query query, QueryOptions queryOptions, String commandLine) throws StorageEngineException {
ParsedVariantQuery variantQuery = parseQuery(query, queryOptions);
int studyId = variantQuery.getStudyQuery().getDefaultStudy().getId();
ObjectMap params = new ObjectMap(getOptions()).appendAll(variantQuery.getQuery()).appendAll(variantQuery.getInputOptions());
params.remove(StreamVariantDriver.COMMAND_LINE_PARAM);

String memory = getOptions().getString(WALKER_DOCKER_MEMORY.key(), WALKER_DOCKER_MEMORY.defaultValue());
int memoryBytes;
if (memory.endsWith("M") || memory.endsWith("m")) {
memoryBytes = Integer.parseInt(memory.substring(0, memory.length() - 1)) * 1024 * 1024;
} else if (memory.endsWith("G") || memory.endsWith("g")) {
memoryBytes = Integer.parseInt(memory.substring(0, memory.length() - 1)) * 1024 * 1024 * 1024;
} else {
memoryBytes = Integer.parseInt(memory);
}

String dockerHost = getOptions().getString(MR_STREAM_DOCKER_HOST.key(), MR_STREAM_DOCKER_HOST.defaultValue());
if (StringUtils.isNotEmpty(dockerHost)) {
params.put(StreamVariantDriver.ENVIRONMENT_VARIABLES, "DOCKER_HOST=" + dockerHost);
}

getMRExecutor().run(StreamVariantDriver.class, StreamVariantDriver.buildArgs(
null,
getVariantTableName(), studyId, null,
new ObjectMap().appendAll(variantQuery.getQuery()).appendAll(variantQuery.getInputOptions())
.append(StreamVariantDriver.MAX_BYTES_PER_MAP_PARAM, 1024 * 10)
params
.append(StreamVariantDriver.MAX_BYTES_PER_MAP_PARAM, memoryBytes / 2)
.append(StreamVariantDriver.COMMAND_LINE_BASE64_PARAM, Base64.getEncoder().encodeToString(commandLine.getBytes()))
.append(StreamVariantDriver.INPUT_FORMAT_PARAM, format.toString())
.append(StreamVariantDriver.OUTPUT_PARAM, outputFile)
), "");
return null;
), "Walk data");
return outputFile;
}

@Override
@@ -1335,4 +1353,15 @@ public void testConnection() throws StorageEngineException {
}
}

@Override
public void validateNewConfiguration(ObjectMap params) throws StorageEngineException {
super.validateNewConfiguration(params);

for (HadoopVariantStorageOptions option : HadoopVariantStorageOptions.values()) {
if (option.isProtected() && params.get(option.key()) != null) {
throw new StorageEngineException("Unable to update protected option '" + option.key() + "'");
}
}
}

}
Original file line number Diff line number Diff line change
@@ -60,6 +60,8 @@ public enum HadoopVariantStorageOptions implements ConfigurationOption {
MR_EXECUTOR_SSH_HADOOP_SCP_BIN("storage.hadoop.mr.executor.ssh.hadoop-scp.bin", "misc/scripts/hadoop-scp.sh"),
MR_EXECUTOR_SSH_HADOOP_TERMINATION_GRACE_PERIOD_SECONDS("storage.hadoop.mr.executor.ssh.terminationGracePeriodSeconds", 120),

MR_STREAM_DOCKER_HOST("storage.hadoop.mr.stream.docker.host", "", true),

/////////////////////////
// Variant table configuration
/////////////////////////
@@ -134,6 +136,7 @@ public enum HadoopVariantStorageOptions implements ConfigurationOption {

private final String key;
private final Object value;
private final boolean isProtected;

HadoopVariantStorageOptions(String key) {
this(key, null);
@@ -142,6 +145,13 @@ public enum HadoopVariantStorageOptions implements ConfigurationOption {
HadoopVariantStorageOptions(String key, Object value) {
this.key = key;
this.value = value;
this.isProtected = false;
}

HadoopVariantStorageOptions(String key, Object value, boolean isProtected) {
this.key = key;
this.value = value;
this.isProtected = isProtected;
}

@Override
@@ -157,4 +167,11 @@ public String key() {
public <T> T defaultValue() {
return (T) value;
}

@Override
public boolean isProtected() {
return isProtected;
}


}
Loading