/* * 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.core.integration.daily; import org.apache.jackrabbit.core.AbstractConcurrencyTest; import org.apache.jackrabbit.core.integration.random.task.VersionOperationsTask; import org.apache.jackrabbit.core.integration.random.task.ContentOperationsTask; import javax.jcr.RepositoryException; /** * <code>RandomOperationTest</code> executes randomly chosen operations using * multiple threads. Each thread operates on its own subtree to avoid * conflicting changes. */ public class RandomOperationTest extends AbstractConcurrencyTest { /** * Each task is executed with this number of threads. */ private static final int NUM_THREADS = 1; /** * Tasks are advised to run for this amount of time. */ private static final int RUN_NUM_SECONDS = 60; /** * Number of seconds to wait at most for the tasks to finish their work. */ private static final int MAX_WAIT_SECONDS = 60; /** * Number of levels of test data to create per thread */ private static final int NUM_LEVELS = 4; /** * Number of nodes per level */ private static final int NODES_PER_LEVEL = 3; /** * While creating nodes, save whenever 1000 nodes have been created. */ private static final int SAVE_INTERVAL = 1000; private long end; protected void setUp() throws Exception { super.setUp(); end = System.currentTimeMillis() + RUN_NUM_SECONDS * 1000; } public void testRandomContentOperations() throws RepositoryException { runTask(new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end), NUM_THREADS); } public void testRandomContentOperationsXA() throws RepositoryException { ContentOperationsTask task = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); task.setUseXA(true); runTask(task, NUM_THREADS); } public void testRandomVersionOperations() throws RepositoryException { runTask(new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end), NUM_THREADS); } public void testRandomVersionOperationsXA() throws RepositoryException { VersionOperationsTask task = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); task.setUseXA(true); runTask(task, NUM_THREADS); } public void testContentAndVersionOperations() throws RepositoryException { runTasks(new Task[]{ new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end), new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end) }, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000); } public void testContentAndVersionOperationsXA() throws RepositoryException { ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); task1.setUseXA(true); VersionOperationsTask task2 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); task2.setUseXA(true); runTasks(new Task[]{task1, task2}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000); } /** * Test disabled since it violates the "Don't mix concurrent transactional * and non-transactional writes to a single workspace" guideline formed * during the concurrency review. * * @see <a href="http://jackrabbit.apache.org/concurrency-control.html">Concurrency control</a> * @see <a href="https://issues.apache.org/jira/browse/JCR-2000">JCR-2000</a> */ public void disabledTestContentAndVersionOperationsXAMixed() throws RepositoryException { ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); task2.setUseXA(true); VersionOperationsTask task3 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); VersionOperationsTask task4 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, SAVE_INTERVAL, end); task4.setUseXA(true); runTasks(new Task[]{task1, task2, task3, task4}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000); } /** * Test disabled since it violates the "Don't mix concurrent transactional * and non-transactional writes to a single workspace" guideline formed * during the concurrency review. * * @see <a href="http://jackrabbit.apache.org/concurrency-control.html">Concurrency control</a> * @see <a href="https://issues.apache.org/jira/browse/JCR-2000">JCR-2000</a> */ public void disabledTestContentAndVersionOperationsXAMixedShortSaveInterval() throws RepositoryException { ContentOperationsTask task1 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end); ContentOperationsTask task2 = new ContentOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end); task2.setUseXA(true); VersionOperationsTask task3 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end); VersionOperationsTask task4 = new VersionOperationsTask(NUM_LEVELS, NODES_PER_LEVEL, 1, end); task4.setUseXA(true); runTasks(new Task[]{task1, task2, task3, task4}, NUM_THREADS, end + MAX_WAIT_SECONDS * 1000); } }