blob: 4946db8de2fd2f7cda3645d6f2bc533c3f603182 [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.testing.performance.tests;
import java.util.Arrays;
import java.util.Collections;
import org.apache.accumulo.core.client.AccumuloClient;
import org.apache.accumulo.core.client.BatchWriter;
import org.apache.accumulo.core.client.admin.NewTableConfiguration;
import org.apache.accumulo.core.client.admin.TableOperations;
import org.apache.accumulo.core.data.Mutation;
import org.apache.accumulo.testing.performance.Environment;
import org.apache.accumulo.testing.performance.PerformanceTest;
import org.apache.accumulo.testing.performance.Report;
import org.apache.accumulo.testing.performance.SystemConfiguration;
public class DurabilityWriteSpeedPT implements PerformanceTest {
static final long N = 100000;
@Override
public SystemConfiguration getSystemConfig() {
return new SystemConfiguration();
}
private void createTable(AccumuloClient c, String table, String durability) throws Exception {
NewTableConfiguration ntc = new NewTableConfiguration();
ntc.setProperties(Collections.singletonMap("table.durability", durability));
c.tableOperations().create(table, ntc);
}
@Override
public Report runTest(Environment env) throws Exception {
Report.Builder reportBuilder = Report.builder();
reportBuilder.id("durability");
reportBuilder.description("Compares writes speeds at different durability levels");
try (AccumuloClient client = env.getClient()) {
TableOperations tableOps = client.tableOperations();
for (String durability : new String[] {"sync", "flush", "log", "none"}) {
String tableName = durability + "T";
createTable(client, tableName, durability);
long median = writeSome(reportBuilder, client, tableName, N, durability);
tableOps.delete(tableName);
reportBuilder.result(durability + " Median", median,
"Median time result for " + durability);
}
}
reportBuilder.parameter("rows", N, "Number of random rows written.");
return reportBuilder.build();
}
private long writeSome(Report.Builder reportBuilder, AccumuloClient c, String table, long count,
String durabilityLevel) throws Exception {
int iterations = 5;
long[] attempts = new long[iterations];
for (int attempt = 0; attempt < iterations; attempt++) {
long now = System.currentTimeMillis();
try (BatchWriter bw = c.createBatchWriter(table)) {
for (int i = 1; i < count + 1; i++) {
Mutation m = new Mutation("" + i);
m.put("", "", "");
bw.addMutation(m);
if (i % (Math.max(1, count / 100)) == 0) {
bw.flush();
}
}
}
attempts[attempt] = System.currentTimeMillis() - now;
reportBuilder.info(durabilityLevel + " attempt " + attempt, System.currentTimeMillis() - now,
"Times for each attempt in ms");
}
Arrays.sort(attempts);
// Return the median duration
return attempts[2];
}
}