/* * Copyright (C) 2005-2010 Alfresco Software Limited. * * This file is part of Alfresco * * Alfresco is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Alfresco is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ package org.alfresco.repo.node.index; import java.util.List; import javax.transaction.UserTransaction; import junit.framework.TestCase; import org.alfresco.model.ContentModel; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.node.Transaction; import org.alfresco.repo.node.index.AbstractReindexComponent.InIndex; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.ApplicationContextHelper; import org.springframework.context.ApplicationContext; /** * Checks that full index recovery is possible * * @author Derek Hulley */ public class FullIndexRecoveryComponentTest extends TestCase { private static ApplicationContext ctx = ApplicationContextHelper.getApplicationContext(); private FullIndexRecoveryComponent indexRecoverer; private AVMFullIndexRecoveryComponent avmIndexRecoveryComponent; private NodeService nodeService; private NodeRef rootNodeRef; private TransactionService transactionService; private AuthenticationComponent authenticationComponent; private UserTransaction testTX; private NodeDAO nodeDAO; public void setUp() throws Exception { indexRecoverer = (FullIndexRecoveryComponent) ctx.getBean("indexRecoveryComponent"); avmIndexRecoveryComponent = (AVMFullIndexRecoveryComponent) ctx.getBean("avmIndexRecoveryComponent"); nodeService = (NodeService) ctx.getBean("nodeService"); transactionService = (TransactionService) ctx.getBean("transactionComponent"); authenticationComponent = (AuthenticationComponent) ctx.getBean("authenticationComponent"); nodeDAO = (NodeDAO) ctx.getBean("nodeDAO"); testTX = transactionService.getUserTransaction(); testTX.begin(); this.authenticationComponent.setSystemUserAsCurrentUser(); } public void testSetup() throws Exception { } public void XtestDeletionReporting() throws Exception { StoreRef storeRef = nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE, "Test_" + System.currentTimeMillis()); rootNodeRef = nodeService.getRootNode(storeRef); NodeRef folder = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, QName.createQName("{namespace}folder"), ContentModel.TYPE_FOLDER).getChildRef(); testTX.commit(); testTX = transactionService.getUserTransaction(); testTX.begin(); NodeRef[] refs = new NodeRef[20]; for(int i = 0; i < refs.length; i++) { refs[i] = nodeService.createNode(folder, ContentModel.ASSOC_CONTAINS, QName.createQName("{namespace}file"+i), ContentModel.TYPE_CONTENT).getChildRef(); } testTX.commit(); testTX = transactionService.getUserTransaction(); testTX.begin(); this.authenticationComponent.setSystemUserAsCurrentUser(); for(int i = 0; i < refs.length; i++) { nodeService.deleteNode(refs[i]); testTX.commit(); testTX = transactionService.getUserTransaction(); testTX.begin(); } // The following test are important but take too long .... // List startTxns = nodeDaoService.getTxnsByCommitTimeAscending( // Long.MIN_VALUE, Long.MAX_VALUE, 1, null, false); // InIndex startAllPresent = indexRecoverer.areTxnsInStartSample(startTxns); // assertEquals(InIndex.YES, startAllPresent); // Long maxId = nodeDaoService.getMaxTxnIdByCommitTime(Long.MAX_VALUE); // startTxns = nodeDaoService.getTxnsByCommitTimeAscending( // Long.MIN_VALUE, Long.MAX_VALUE, maxId.intValue(), null, false); // startAllPresent = indexRecoverer.areTxnsInStartSample(startTxns); // assertEquals(InIndex.INDETERMINATE, startAllPresent); // for(int i = 0; i <= maxId.intValue(); i++) // { // System.out.println("TX "+i+" is "+indexRecoverer.isTxnPresentInIndex(nodeDaoService.getTxnById(i))); // } // startTxns = nodeDaoService.getTxnsByCommitTimeAscending( // Long.MIN_VALUE, Long.MAX_VALUE, startTxns.size() - 20, null, false); // startAllPresent = indexRecoverer.areTxnsInStartSample(startTxns); // assertEquals(InIndex.YES, startAllPresent); // List endTxns = nodeDAO.getTxnsByCommitTimeDescending( Long.MIN_VALUE, Long.MAX_VALUE, 20, null, false); InIndex endAllPresent = indexRecoverer.areAllTxnsInEndSample(endTxns); assertEquals(InIndex.INDETERMINATE, endAllPresent); endTxns = nodeDAO.getTxnsByCommitTimeDescending( Long.MIN_VALUE, Long.MAX_VALUE, 21, null, false); endAllPresent = indexRecoverer.areAllTxnsInEndSample(endTxns); assertEquals(InIndex.INDETERMINATE, endAllPresent); endTxns = nodeDAO.getTxnsByCommitTimeDescending( Long.MIN_VALUE, Long.MAX_VALUE, 22, null, false); endAllPresent = indexRecoverer.areAllTxnsInEndSample(endTxns); assertEquals(InIndex.YES, endAllPresent); } public synchronized void testReindexing() throws Exception { indexRecoverer.setRecoveryMode(FullIndexRecoveryComponent.RecoveryMode.FULL.name()); avmIndexRecoveryComponent.setRecoveryMode(FullIndexRecoveryComponent.RecoveryMode.FULL.name()); // reindex Thread reindexThread = new Thread() { public void run() { indexRecoverer.reindex(); } }; Thread avmReindexThread = new Thread() { public void run() { avmIndexRecoveryComponent.reindex(); } }; //reindexThread.setDaemon(true); //avmReindexThread.setDaemon(true); reindexThread.start(); avmReindexThread.start(); // must allow the rebuild to complete or the test after this one will fail to validate their indexes // - as they now will be deleted. reindexThread.join(); avmReindexThread.join(); // wait a bit and then terminate wait(20000); indexRecoverer.setShutdown(true); avmIndexRecoveryComponent.setShutdown(true); wait(20000); } }