blob: 2719bc76d927e740002603db6810cb7420d48341 [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.ignite.internal.processors.performancestatistics;
import java.io.File;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.internal.processors.cache.persistence.file.FileIO;
import org.apache.ignite.internal.processors.cache.persistence.file.RandomAccessFileIOFactory;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteUuid;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static com.google.common.collect.Collections2.permutations;
import static com.google.common.collect.Lists.cartesianProduct;
import static java.util.Collections.singletonList;
import static java.util.UUID.randomUUID;
import static org.apache.ignite.internal.processors.performancestatistics.FilePerformanceStatisticsWriter.PERF_STAT_DIR;
import static org.apache.ignite.internal.processors.performancestatistics.FilePerformanceStatisticsWriter.writeIgniteUuid;
import static org.apache.ignite.internal.processors.performancestatistics.FilePerformanceStatisticsWriter.writeString;
/**
* Tests strings caching.
*/
@RunWith(Parameterized.class)
public class ForwardReadTest extends AbstractPerformanceStatisticsTest {
/** Read buffer size. */
private static final int BUFFER_SIZE = 100;
/** {@code True} If test with strings that can't be found during forward read. */
@Parameterized.Parameter
public boolean unknownStrs;
/** @return Test parameters. */
@Parameterized.Parameters(name = "unknownStrs={0}")
public static Collection<?> parameters() {
return Arrays.asList(new Object[][] {{false}, {true}});
}
/** @throws Exception If failed. */
@Test
public void testStringForwardRead() throws Exception {
File dir = U.resolveWorkDirectory(U.defaultWorkDirectory(), PERF_STAT_DIR, false);
Map<String, Integer> expTasks = createStatistics(dir);
new FilePerformanceStatisticsReader(BUFFER_SIZE, new TestHandler() {
@Override public void task(UUID nodeId, IgniteUuid sesId, String taskName, long startTime, long duration,
int affPartId) {
assertNotNull(taskName);
assertTrue(expTasks.containsKey(taskName));
expTasks.computeIfPresent(taskName, (name, cnt) -> --cnt);
}
}).read(singletonList(dir));
assertTrue(expTasks.values().stream().allMatch(cnt -> cnt == 0));
}
/** Creates test performance statistics file. */
private Map<String, Integer> createStatistics(File dir) throws Exception {
Map<String, Integer> expTasks;
File file = new File(dir, "node-" + randomUUID() + ".prf");
try (FileIO fileIo = new RandomAccessFileIOFactory().create(file)) {
ByteBuffer buf = ByteBuffer.allocate(10 * 1024).order(ByteOrder.nativeOrder());
expTasks = writeData(buf);
buf.flip();
fileIo.write(buf);
fileIo.force();
}
return expTasks;
}
/** Generates task permutations and writes to buffer. */
private Map<String, Integer> writeData(ByteBuffer buf) {
Map<String, Integer> expTasks = new HashMap<>();
List<List<Object>> lists = cartesianProduct(F.asList("task1", "task2"), F.asList(false, true));
int setIdx = 0;
for (List<List<Object>> permute : permutations(lists)) {
for (List<Object> t2 : permute) {
String taskName = "dataSet-" + setIdx + "-" + t2.get(0);
Boolean cached = (Boolean)t2.get(1);
expTasks.compute(taskName, (name, cnt) -> cnt == null ? 1 : ++cnt);
writeTask(buf, taskName, cached);
}
if (unknownStrs) {
String unknownTask = "dataSet-" + setIdx + "-unknownTask";
expTasks.put(unknownTask, 0);
writeTask(buf, unknownTask, true);
}
setIdx++;
}
return expTasks;
}
/** Writes test task to buffer. */
private static void writeTask(ByteBuffer buf, String taskName, boolean cached) {
buf.put((byte)OperationType.TASK.ordinal());
writeString(buf, taskName, cached);
writeIgniteUuid(buf, IgniteUuid.randomUuid());
buf.putLong(0);
buf.putLong(0);
buf.putInt(0);
}
}