/** Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved. Contact: SYSTAP, LLC DBA Blazegraph 2501 Calvert ST NW #106 Washington, DC 20008 licenses@blazegraph.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.bigdata.rdf.sail.webapp; import java.util.Collections; import junit.framework.Test; import com.bigdata.journal.AbstractJournal; import com.bigdata.journal.BufferMode; import com.bigdata.journal.IIndexManager; import com.bigdata.journal.RWStrategy; import com.bigdata.rdf.sail.webapp.client.IPreparedSparqlUpdate; import com.bigdata.rwstore.RWStore; /** * Tests that are RWStore specific. * * @author bryan * * @param <S> */ public class TestRWStoreTxBehaviors<S extends IIndexManager> extends AbstractTestNanoSparqlClient<S> { public TestRWStoreTxBehaviors() { } public TestRWStoreTxBehaviors(final String name) { super(name); } static public Test suite() { return ProxySuiteHelper.suiteWhenStandalone(TestRWStoreTxBehaviors.class, "test.*", Collections.singleton(BufferMode.DiskRW), TestMode.triples ); } /** * Unit test verifies that the native journal transaction counter for the * RWStore is properly closed for SPARQL UPDATE. This bug was introduced when * addressing <a href="http://trac.blazegraph.com/ticket/1026> SPARQL UPDATE * with runtime errors causes problems with lexicon indices </a>. * <p> * Note: This test will fail if group commit is enabled and the servlet * commits the http response before the group commit. * * @see <a href="http://trac.blazegraph.com/ticket/1036"> Journal file growth * reported with 1.3.3 </a> */ public void test_SPARQL_UPDATE_Tx_Properly_Closed() throws Exception { RWStore rwstore = null; if (getIndexManager() instanceof AbstractJournal && ((AbstractJournal) getIndexManager()).getBufferStrategy() instanceof RWStrategy) { rwstore = ((RWStrategy) ((AbstractJournal) getIndexManager()) .getBufferStrategy()).getStore(); } else { fail("RWStore is not in use"); } final int activeTxBefore = rwstore.getActiveTxCount(); if (log.isInfoEnabled()) log.info("activeTxBefore=" + activeTxBefore); final IPreparedSparqlUpdate preparedUpdate = m_repo.prepareUpdate("PREFIX dc: <http://purl.org/dc/elements/1.1/>\n"// +"INSERT DATA\n"// +"{\n"// +" <http://example/book1> dc:title \"A new book\" ; \n"// +" dc:creator \"A.N.Other\" .\n"// +"}\n"// ); preparedUpdate.evaluate(); final int activeTxAfter = rwstore.getActiveTxCount(); if (log.isInfoEnabled()) log.info("activeTxAfter=" + activeTxAfter); /* * This value should be unchanged across the SPARQL UPDATE request (it * will be incremented during the processing of the request and then * decremented again during the commit or abort protocol). */ assertEquals(activeTxBefore, activeTxAfter); } }