/* * 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.igfs; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.concurrent.Callable; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.testframework.GridTestUtils; import static org.apache.ignite.internal.processors.igfs.IgfsFileAffinityRange.RANGE_STATUS_INITIAL; import static org.apache.ignite.internal.processors.igfs.IgfsFileAffinityRange.RANGE_STATUS_MOVED; import static org.apache.ignite.internal.processors.igfs.IgfsFileAffinityRange.RANGE_STATUS_MOVING; /** * File map self test. */ public class IgfsFileMapSelfTest extends IgfsCommonAbstractTest { /** * @throws Exception If failed. */ public void testRanges() throws Exception { IgfsFileMap map = new IgfsFileMap(); IgniteUuid[] affKeys = new IgniteUuid[20]; for (int i = 0; i < affKeys.length; i++) affKeys[i] = IgniteUuid.randomUuid(); int numOfRanges = 0; do { for (int i = 0; i < 2 * numOfRanges + 1; i++) { long off1 = i * 10; long off2 = i * 10 + 5; long off3 = i * 10 + 8; IgniteUuid affKey = i % 2 == 0 ? null : affKeys[i / 2]; assertEquals("For i: " + i, affKey, map.affinityKey(off1, false)); assertEquals("For i: " + i, affKey, map.affinityKey(off2, false)); assertEquals("For i: " + i, affKey, map.affinityKey(off3, false)); } map.addRange(new IgfsFileAffinityRange(10 + 20 * numOfRanges, 19 + 20 * numOfRanges, affKeys[numOfRanges])); numOfRanges++; } while (numOfRanges < 20); } /** * @throws Exception If failed. */ public void testAddUpdateAdd() throws Exception { IgfsFileMap map = new IgfsFileMap(); IgniteUuid affKey = IgniteUuid.randomUuid(); map.addRange(new IgfsFileAffinityRange(0, 9, affKey)); map.updateRangeStatus(new IgfsFileAffinityRange(0, 9, affKey), RANGE_STATUS_MOVING); map.addRange(new IgfsFileAffinityRange(10, 19, affKey)); List<IgfsFileAffinityRange> ranges = map.ranges(); assertEquals(2, ranges.size()); assertEquals(RANGE_STATUS_MOVING, ranges.get(0).status()); assertTrue(ranges.get(0).regionEqual(new IgfsFileAffinityRange(0, 9, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(1).status()); assertTrue(ranges.get(1).regionEqual(new IgfsFileAffinityRange(10, 19, affKey))); } /** * @throws Exception If failed. */ public void testRangeUpdate1() throws Exception { IgfsFileMap map = new IgfsFileMap(); IgniteUuid affKey = IgniteUuid.randomUuid(); for (int i = 0; i < 4; i++) map.addRange(new IgfsFileAffinityRange(i * 20 + 10, i * 20 + 19, affKey)); // Middle, first, last. map.updateRangeStatus(new IgfsFileAffinityRange(30, 39, affKey), RANGE_STATUS_MOVING); map.updateRangeStatus(new IgfsFileAffinityRange(10, 19, affKey), RANGE_STATUS_MOVING); map.updateRangeStatus(new IgfsFileAffinityRange(70, 79, affKey), RANGE_STATUS_MOVING); List<IgfsFileAffinityRange> ranges = map.ranges(); assertEquals(RANGE_STATUS_MOVING, ranges.get(0).status()); assertEquals(RANGE_STATUS_MOVING, ranges.get(1).status()); assertEquals(RANGE_STATUS_INITIAL, ranges.get(2).status()); assertEquals(RANGE_STATUS_MOVING, ranges.get(3).status()); // Middle, first, last. map.updateRangeStatus(new IgfsFileAffinityRange(30, 39, affKey), RANGE_STATUS_MOVED); map.updateRangeStatus(new IgfsFileAffinityRange(10, 19, affKey), RANGE_STATUS_MOVED); map.updateRangeStatus(new IgfsFileAffinityRange(70, 79, affKey), RANGE_STATUS_MOVED); ranges = map.ranges(); assertEquals(RANGE_STATUS_MOVED, ranges.get(0).status()); assertEquals(RANGE_STATUS_MOVED, ranges.get(1).status()); assertEquals(RANGE_STATUS_INITIAL, ranges.get(2).status()); assertEquals(RANGE_STATUS_MOVED, ranges.get(3).status()); // Middle, first, last. map.deleteRange(new IgfsFileAffinityRange(30, 39, affKey)); map.deleteRange(new IgfsFileAffinityRange(10, 19, affKey)); map.deleteRange(new IgfsFileAffinityRange(70, 79, affKey)); ranges = map.ranges(); assertEquals(1, ranges.size()); assertEquals(RANGE_STATUS_INITIAL, ranges.get(0).status()); assertTrue(ranges.get(0).regionEqual(new IgfsFileAffinityRange(50, 59, affKey))); } /** * @throws Exception If failed. */ public void testRangeUpdate2() throws Exception { IgfsFileMap map = new IgfsFileMap(); IgniteUuid affKey = IgniteUuid.randomUuid(); for (int i = 0; i < 4; i++) map.addRange(new IgfsFileAffinityRange(i * 20 + 10, i * 20 + 19, affKey)); // Middle, first, last. map.updateRangeStatus(new IgfsFileAffinityRange(30, 35, affKey), RANGE_STATUS_MOVING); map.updateRangeStatus(new IgfsFileAffinityRange(10, 15, affKey), RANGE_STATUS_MOVING); map.updateRangeStatus(new IgfsFileAffinityRange(70, 75, affKey), RANGE_STATUS_MOVING); List<IgfsFileAffinityRange> ranges = map.ranges(); assertEquals(7, ranges.size()); int idx = 0; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(10, 15, affKey))); assertEquals(RANGE_STATUS_MOVING, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(16, 19, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(30, 35, affKey))); assertEquals(RANGE_STATUS_MOVING, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(36, 39, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(50, 59, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(70, 75, affKey))); assertEquals(RANGE_STATUS_MOVING, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(76, 79, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); // Middle, first, last. map.updateRangeStatus(new IgfsFileAffinityRange(30, 35, affKey), RANGE_STATUS_MOVED); map.updateRangeStatus(new IgfsFileAffinityRange(10, 15, affKey), RANGE_STATUS_MOVED); map.updateRangeStatus(new IgfsFileAffinityRange(70, 75, affKey), RANGE_STATUS_MOVED); idx = 0; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(10, 15, affKey))); assertEquals(RANGE_STATUS_MOVED, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(16, 19, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(30, 35, affKey))); assertEquals(RANGE_STATUS_MOVED, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(36, 39, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(50, 59, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(70, 75, affKey))); assertEquals(RANGE_STATUS_MOVED, ranges.get(idx).status()); idx++; assertTrue(ranges.get(idx).regionEqual(new IgfsFileAffinityRange(76, 79, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(idx).status()); // Middle, first, last. map.deleteRange(new IgfsFileAffinityRange(30, 35, affKey)); map.deleteRange(new IgfsFileAffinityRange(10, 15, affKey)); map.deleteRange(new IgfsFileAffinityRange(70, 75, affKey)); ranges = map.ranges(); assertEquals(4, ranges.size()); assertEquals(RANGE_STATUS_INITIAL, ranges.get(0).status()); assertTrue(ranges.get(0).regionEqual(new IgfsFileAffinityRange(16, 19, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(1).status()); assertTrue(ranges.get(1).regionEqual(new IgfsFileAffinityRange(36, 39, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(2).status()); assertTrue(ranges.get(2).regionEqual(new IgfsFileAffinityRange(50, 59, affKey))); assertEquals(RANGE_STATUS_INITIAL, ranges.get(3).status()); assertTrue(ranges.get(3).regionEqual(new IgfsFileAffinityRange(76, 79, affKey))); } /** * @throws Exception If failed. */ public void testInvalidRangeUpdates() throws Exception { final IgfsFileMap map = new IgfsFileMap(); final IgniteUuid affKey1 = IgniteUuid.randomUuid(); final IgniteUuid affKey2 = IgniteUuid.randomUuid(); map.addRange(new IgfsFileAffinityRange(10, 19, affKey1)); map.addRange(new IgfsFileAffinityRange(30, 39, affKey1)); GridTestUtils.assertThrows(log, new Callable<Object>() { @Override public Object call() throws Exception { map.updateRangeStatus(new IgfsFileAffinityRange(0, 5, affKey1), RANGE_STATUS_MOVING); return null; } }, IgfsInvalidRangeException.class, null); GridTestUtils.assertThrows(log, new Callable<Object>() { @Override public Object call() throws Exception { map.updateRangeStatus(new IgfsFileAffinityRange(15, 19, affKey1), RANGE_STATUS_MOVING); return null; } }, IgfsInvalidRangeException.class, null); GridTestUtils.assertThrows(log, new Callable<Object>() { @Override public Object call() throws Exception { map.updateRangeStatus(new IgfsFileAffinityRange(10, 19, affKey2), RANGE_STATUS_MOVING); return null; } }, AssertionError.class, null); GridTestUtils.assertThrows(log, new Callable<Object>() { @Override public Object call() throws Exception { map.updateRangeStatus(new IgfsFileAffinityRange(10, 22, affKey1), RANGE_STATUS_MOVING); return null; } }, AssertionError.class, null); assertEquals(2, map.ranges().size()); } /** * @throws Exception If failed. */ public void testRangeSplit() throws Exception { IgniteUuid affKey = IgniteUuid.randomUuid(); IgfsFileAffinityRange range = new IgfsFileAffinityRange(0, 9999, affKey); Collection<IgfsFileAffinityRange> split = range.split(10000); assertEquals(1, split.size()); assertTrue(range.regionEqual(F.first(split))); split = range.split(5000); assertEquals(2, split.size()); Iterator<IgfsFileAffinityRange> it = split.iterator(); IgfsFileAffinityRange part = it.next(); assertTrue(part.regionEqual(new IgfsFileAffinityRange(0, 4999, affKey))); part = it.next(); assertTrue(part.regionEqual(new IgfsFileAffinityRange(5000, 9999, affKey))); split = range.split(3000); assertEquals(4, split.size()); it = split.iterator(); part = it.next(); assertTrue(part.regionEqual(new IgfsFileAffinityRange(0, 2999, affKey))); part = it.next(); assertTrue(part.regionEqual(new IgfsFileAffinityRange(3000, 5999, affKey))); part = it.next(); assertTrue(part.regionEqual(new IgfsFileAffinityRange(6000, 8999, affKey))); part = it.next(); assertTrue(part.regionEqual(new IgfsFileAffinityRange(9000, 9999, affKey))); } }