blob: 549733fd4edae2638dc31482562aa02f814b7a60 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.accumulo.examples.cli;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import org.apache.accumulo.core.client.BatchWriterConfig;
import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.Parameter;
public class BatchWriterOpts {
private static final BatchWriterConfig BWDEFAULTS = new BatchWriterConfig();
public static class TimeConverter implements IStringConverter<Long> {
@Override
public Long convert(String value) {
if (value.matches("[0-9]+"))
value = "PT" + value + "S"; // if only numbers then assume seconds
return Duration.parse(value).toMillis();
}
}
public static class MemoryConverter implements IStringConverter<Long> {
@Override
public Long convert(String str) {
try {
char lastChar = str.charAt(str.length() - 1);
int multiplier = 0;
switch (Character.toUpperCase(lastChar)) {
case 'G':
multiplier += 10;
case 'M':
multiplier += 10;
case 'K':
multiplier += 10;
case 'B':
break;
default:
return Long.parseLong(str);
}
return Long.parseLong(str.substring(0, str.length() - 1)) << multiplier;
} catch (Exception ex) {
throw new IllegalArgumentException(
"The value '" + str + "' is not a valid memory setting. A valid value would a number "
+ "possibily followed by an optional 'G', 'M', 'K', or 'B'.");
}
}
}
@Parameter(names = "--batchThreads",
description = "Number of threads to use when writing large batches")
public Integer batchThreads = BWDEFAULTS.getMaxWriteThreads();
@Parameter(names = "--batchLatency", converter = TimeConverter.class,
description = "The maximum time to wait before flushing data to servers when writing")
public Long batchLatency = BWDEFAULTS.getMaxLatency(TimeUnit.MILLISECONDS);
@Parameter(names = "--batchMemory", converter = MemoryConverter.class,
description = "memory used to batch data when writing")
public Long batchMemory = BWDEFAULTS.getMaxMemory();
@Parameter(names = "--batchTimeout", converter = TimeConverter.class,
description = "timeout used to fail a batch write")
public Long batchTimeout = BWDEFAULTS.getTimeout(TimeUnit.MILLISECONDS);
public BatchWriterConfig getBatchWriterConfig() {
BatchWriterConfig config = new BatchWriterConfig();
config.setMaxWriteThreads(this.batchThreads);
config.setMaxLatency(this.batchLatency, TimeUnit.MILLISECONDS);
config.setMaxMemory(this.batchMemory);
config.setTimeout(this.batchTimeout, TimeUnit.MILLISECONDS);
return config;
}
}