/** 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 */ /* * Created on Mar 7, 2011 */ package com.bigdata.rdf.sail; import java.io.IOException; import java.util.Properties; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicReference; import org.openrdf.sail.SailException; import com.bigdata.rdf.axioms.NoAxioms; import com.bigdata.rdf.sail.BigdataSail.BigdataSailConnection; import com.bigdata.rdf.store.AbstractTripleStore; import com.bigdata.rdf.vocab.NoVocabulary; /** * Test suite for BLZG-2056 BigdataSailConnections not always closed by * BigdataSail.shutdown() * * @see https://jira.blazegraph.com/browse/BLZG-2056 * * @author <a href="mailto:thompsonbry@users.sourceforge.net">Bryan Thompson</a> */ public class TestCnxnCreate extends ProxyBigdataSailTestCase { /** * */ public TestCnxnCreate() { } /** * @param name */ public TestCnxnCreate(String name) { super(name); } /** * Test whether connections are auto closed when the Sail is shutdown * * @throws SailException * @throws InterruptedException * @throws IOException */ public void test_manageConnections() throws SailException, InterruptedException, IOException { final Properties properties = getProperties(); // truth maintenance is not compatible with full transactions. properties.setProperty(BigdataSail.Options.TRUTH_MAINTENANCE, "false"); properties.setProperty(AbstractTripleStore.Options.AXIOMS_CLASS, NoAxioms.class.getName()); properties.setProperty(AbstractTripleStore.Options.VOCABULARY_CLASS, NoVocabulary.class.getName()); properties.setProperty(BigdataSail.Options.ISOLATABLE_INDICES, "true"); properties.setProperty(AbstractTripleStore.Options.JUSTIFY, "false"); properties.setProperty(AbstractTripleStore.Options.INLINE_DATE_TIMES, "false"); final BigdataSail sail = new BigdataSail(properties); try { sail.initialize(); log.info("Sail is initialized."); final BigdataSailConnection uicnxn = sail.getUnisolatedConnection(); assertTrue(uicnxn.isOpen()); final BigdataSailConnection rocnxn = sail.getReadOnlyConnection(); assertTrue(rocnxn.isOpen()); sail.shutDown(); log.info("done - sail.shutDown()"); assertTrue(!uicnxn.isOpen()); assertTrue(!rocnxn.isOpen()); } finally { log.info("__tearDownUnitTest"); sail.__tearDownUnitTest(); log.info("done - __tearDownUnitTest"); } } /** * Test whether connections are auto closed when the Sail is shutdown * * @throws SailException * @throws InterruptedException * @throws IOException */ public void test_manageDefaultConnection() throws SailException, InterruptedException, IOException { final Properties properties = getProperties(); // truth maintenance is not compatible with full transactions. properties.setProperty(BigdataSail.Options.TRUTH_MAINTENANCE, "false"); properties.setProperty(AbstractTripleStore.Options.AXIOMS_CLASS, NoAxioms.class.getName()); properties.setProperty(AbstractTripleStore.Options.VOCABULARY_CLASS, NoVocabulary.class.getName()); properties.setProperty(BigdataSail.Options.ISOLATABLE_INDICES, "true"); properties.setProperty(AbstractTripleStore.Options.JUSTIFY, "false"); properties.setProperty(AbstractTripleStore.Options.INLINE_DATE_TIMES, "false"); final BigdataSail sail = new BigdataSail(properties); try { sail.initialize(); log.info("Sail is initialized."); final BigdataSailConnection cnxn = sail.getConnection(); assertTrue(cnxn.isOpen()); sail.shutDown(); log.info("done - sail.shutDown()"); assertTrue(!cnxn.isOpen()); } finally { log.info("__tearDownUnitTest"); sail.__tearDownUnitTest(); log.info("done - __tearDownUnitTest"); } } public void test_manageThreadConnections() throws SailException, InterruptedException, IOException { final Properties properties = getProperties(); // truth maintenance is not compatible with full transactions. properties.setProperty(BigdataSail.Options.TRUTH_MAINTENANCE, "false"); properties.setProperty(AbstractTripleStore.Options.AXIOMS_CLASS, NoAxioms.class.getName()); properties.setProperty(AbstractTripleStore.Options.VOCABULARY_CLASS, NoVocabulary.class.getName()); properties.setProperty(BigdataSail.Options.ISOLATABLE_INDICES, "true"); properties.setProperty(AbstractTripleStore.Options.JUSTIFY, "false"); properties.setProperty(AbstractTripleStore.Options.INLINE_DATE_TIMES, "false"); final BigdataSail sail = new BigdataSail(properties); try { sail.initialize(); log.info("Sail is initialized."); final AtomicReference<BigdataSailConnection> uicnxn = new AtomicReference<BigdataSailConnection>(); final Semaphore c1 = new Semaphore(0); final Thread t = new Thread() { public void run() { System.out.println("Running..."); try { uicnxn.set(sail.getUnisolatedConnection()); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Releasing permit"); c1.release(); } }; t.start(); c1.acquire(); assertTrue(uicnxn.get().isOpen()); final BigdataSailConnection rocnxn = sail.getReadOnlyConnection(); assertTrue(rocnxn.isOpen()); // final BigdataSailConnection rwcnxn = sail.getReadWriteConnection(); // // assertTrue(rwcnxn.isOpen()); // sail.shutDown(); log.warn("don - sail.shutDown()"); assertTrue(!uicnxn.get().isOpen()); assertTrue(!rocnxn.isOpen()); // assertTrue(!rwcnxn.isOpen()); } finally { log.warn("__tearDownUnitTest"); sail.__tearDownUnitTest(); log.warn("done - __tearDownUnitTest"); } } }