blob: 6938f17ad10fbca182bba0ee09fd30164f78a8e0 [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.jackrabbit.oak.plugins.document;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore;
import org.junit.Test;
import junitx.util.PrivateAccessor;
public class ClusterViewDocumentTest {
@Test
public void testSetToCsv() throws Throwable {
// test null and empty first
assertNull(callSetToCsv(null));
assertNull(callSetToCsv(new HashSet<Integer>()));
// test one element
Set<Integer> input = new TreeSet<Integer>();
StringBuffer sb = new StringBuffer();
for (int i = 100; i < 199; i++) {
input.add(i);
if (sb.length() != 0) {
sb.append(",");
}
sb.append(String.valueOf(i));
assertEquals(sb.toString(), callSetToCsv(input));
}
}
private String callSetToCsv(Set<Integer> input) throws Throwable {
return (String) PrivateAccessor.invoke(ClusterViewDocument.class, "setToCsv", new Class[] { Set.class },
new Object[] { input });
}
@Test
public void testArrayToCsv() throws Throwable {
// nulls first
assertNull(callArrayToCsv(null));
assertNull(callArrayToCsv(new Integer[0]));
// one element only
assertEquals("101", callArrayToCsv(new Integer[] { 101 }));
assertEquals("101,102", callArrayToCsv(new Integer[] { 101, 102 }));
assertEquals("101,102,103", callArrayToCsv(new Integer[] { 101, 102, 103 }));
assertEquals("101,102,103,104", callArrayToCsv(new Integer[] { 101, 102, 103, 104 }));
}
private String callArrayToCsv(Integer[] input) throws Throwable {
return (String) PrivateAccessor.invoke(ClusterViewDocument.class, "arrayToCsv", new Class[] { Integer[].class },
new Object[] { input });
}
@Test
public void testConstructor() {
ClusterViewDocument doc = new ClusterViewBuilder(1, 3).active(3, 4).asDoc();
assertNotNull(doc);
assertEquals(0, doc.getRecoveringIds().size());
assertEquals(0, doc.getInactiveIds().size());
assertEquals(2, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(3));
assertTrue(doc.getActiveIds().contains(4));
doc = new ClusterViewBuilder(1, 3).active(3, 4).backlogs(5).inactive(5, 6).asDoc();
assertNotNull(doc);
assertEquals(0, doc.getRecoveringIds().size());
assertEquals(2, doc.getInactiveIds().size());
assertEquals(2, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(3));
assertTrue(doc.getActiveIds().contains(4));
assertTrue(doc.getInactiveIds().contains(5));
assertTrue(doc.getInactiveIds().contains(6));
doc = new ClusterViewBuilder(11, 4).active(3, 4, 5).recovering(6).inactive(7, 8).asDoc();
assertNotNull(doc);
assertEquals(11, doc.getViewSeqNum());
assertEquals(1, doc.getRecoveringIds().size());
assertEquals(2, doc.getInactiveIds().size());
assertEquals(3, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(3));
assertTrue(doc.getActiveIds().contains(4));
assertTrue(doc.getActiveIds().contains(5));
assertTrue(doc.getRecoveringIds().contains(6));
assertTrue(doc.getInactiveIds().contains(7));
assertTrue(doc.getInactiveIds().contains(8));
}
@Test
public void testHistory() throws Exception {
final int localClusterId = 1;
final DocumentNodeStore ns = createMK(localClusterId).nodeStore;
// initial setting of the view
final Set<Integer> activeIds = new HashSet<Integer>();
activeIds.add(localClusterId);
ClusterViewDocument.readOrUpdate(ns, activeIds, null, null);
final int LOOP_CNT = 100;
for (int i = 0; i < LOOP_CNT; i++) {
// create a new instance
activeIds.add(i + 2);
ClusterViewDocument result = ClusterViewDocument.readOrUpdate(ns, activeIds, null, null);
assertNotNull(result);
assertEquals(i+2, result.getActiveIds().size());
if (i<10) {
assertEquals(i+1, result.getHistory().size());
} else {
assertTrue(result.getHistory().size()<=ClusterViewDocument.HISTORY_LIMIT);
}
}
}
@Test
public void testReadUpdate() throws Exception {
final int localClusterId = 11;
final DocumentNodeStore ns = createMK(localClusterId).nodeStore;
try {
ClusterViewDocument.readOrUpdate(ns, null, null, null);
fail("should complain");
} catch (Exception ok) {
// ok
}
try {
ClusterViewDocument.readOrUpdate(ns, new HashSet<Integer>(), null, null);
fail("should complain");
} catch (Exception ok) {
// ok
}
Set<Integer> activeIds = new HashSet<Integer>();
activeIds.add(2);
Set<Integer> recoveringIds = null;
Set<Integer> inactiveIds = null;
// first ever view:
ClusterViewDocument doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
String createdAt = doc.getCreatedAt();
assertTrue(createdAt != null && createdAt.length() > 0);
long createdBy = doc.getCreatedBy();
assertEquals(localClusterId, createdBy);
assertEquals(1, doc.getViewSeqNum());
assertEquals(1, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(2));
assertEquals(0, doc.getRecoveringIds().size());
assertEquals(0, doc.getInactiveIds().size());
// now let's check if it doesn't change anything when we're not doing
// any update
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
assertEquals(1, doc.getViewSeqNum());
// and now add a new active id
activeIds.add(3);
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
createdAt = doc.getCreatedAt();
assertTrue(createdAt != null && createdAt.length() > 0);
createdBy = doc.getCreatedBy();
assertEquals(localClusterId, createdBy);
assertEquals(2, doc.getViewSeqNum());
assertEquals(2, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(2));
assertTrue(doc.getActiveIds().contains(3));
assertEquals(0, doc.getRecoveringIds().size());
assertEquals(0, doc.getInactiveIds().size());
// now let's check if it doesn't change anything when we're not doing
// any update
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
assertEquals(2, doc.getViewSeqNum());
// and now add a new recovering id
recoveringIds = new HashSet<Integer>();
recoveringIds.add(4);
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
createdAt = doc.getCreatedAt();
assertTrue(createdAt != null && createdAt.length() > 0);
createdBy = doc.getCreatedBy();
assertEquals(localClusterId, createdBy);
assertEquals(3, doc.getViewSeqNum());
assertEquals(2, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(2));
assertTrue(doc.getActiveIds().contains(3));
assertEquals(1, doc.getRecoveringIds().size());
assertTrue(doc.getRecoveringIds().contains(4));
assertEquals(0, doc.getInactiveIds().size());
// now let's check if it doesn't change anything when we're not doing
// any update
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
assertEquals(3, doc.getViewSeqNum());
// and now move that one to inactive
recoveringIds = new HashSet<Integer>();
inactiveIds = new HashSet<Integer>();
inactiveIds.add(4);
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
createdAt = doc.getCreatedAt();
assertTrue(createdAt != null && createdAt.length() > 0);
createdBy = doc.getCreatedBy();
assertEquals(localClusterId, createdBy);
assertEquals(4, doc.getViewSeqNum());
assertEquals(2, doc.getActiveIds().size());
assertTrue(doc.getActiveIds().contains(2));
assertTrue(doc.getActiveIds().contains(3));
assertEquals(0, doc.getRecoveringIds().size());
assertEquals(1, doc.getInactiveIds().size());
assertTrue(doc.getInactiveIds().contains(4));
// now let's check if it doesn't change anything when we're not doing
// any update
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
assertEquals(4, doc.getViewSeqNum());
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
assertEquals(4, doc.getViewSeqNum());
doc = ClusterViewDocument.readOrUpdate(ns, activeIds, recoveringIds, inactiveIds);
assertEquals(4, doc.getViewSeqNum());
}
private static DocumentMK createMK(int clusterId) {
return create(new MemoryDocumentStore(), clusterId);
}
private static DocumentMK create(DocumentStore ds, int clusterId) {
return new DocumentMK.Builder().setAsyncDelay(0).setDocumentStore(ds).setClusterId(clusterId)
.setPersistentCache("target/persistentCache,time").open();
}
}