1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
|
/*
*
* Derby - Class ShutDownDBWhenNSShutsDownTest
*
* 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.derbyTesting.functionTests.tests.derbynet;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.Test;
import org.apache.derby.drda.NetworkServerControl;
import org.apache.derbyTesting.functionTests.util.PrivilegedFileOpsForTests;
import org.apache.derbyTesting.junit.BaseJDBCTestCase;
import org.apache.derbyTesting.junit.BaseTestSuite;
import org.apache.derbyTesting.junit.NetworkServerTestSetup;
import org.apache.derbyTesting.junit.TestConfiguration;
/**
* Derby-1274 - Network Server should shutdown the databases it has booted when
* started from the command line.
*
* Tests that the network server will shutdown the databases it has booted when
* started from the command line and that it will not shut down the databases
* when started from the API.
*/
public class ShutDownDBWhenNSShutsDownTest extends BaseJDBCTestCase {
/**
* Only run the fixtures in network server mode as that's what they are testing.
*/
public static Test suite() {
BaseTestSuite suite =
new BaseTestSuite("ShutDownDBWhenNSShutsDownTest");
suite.addTest(TestConfiguration.clientServerDecorator(
new ShutDownDBWhenNSShutsDownTest(
"testEngineShutdownDoesNotTakeDownNSManualReload")));
/* DERBY-2066
suite.addTest(TestConfiguration.clientServerDecorator(
new ShutDownDBWhenNSShutsDownTest(
"testEngineShutdownDoesNotTakeDownNSAutoReload")));
*/
suite.addTest(TestConfiguration.clientServerDecorator(
new ShutDownDBWhenNSShutsDownTest(
"testDatabasesShutDownWhenNSShutdownAPI")));
return suite;
}
/**
* Creates a new instance of ShutDownDBWhenNSShutsDownTest
*/
public ShutDownDBWhenNSShutsDownTest(String name) {
super(name);
}
/**
* Test the scenario from scenarioEngineShutdownDoesNotTakeDownNS
* reloading the embedded driver after the network server has shutdown.
* @throws Exception
*/
public void testEngineShutdownDoesNotTakeDownNSManualReload() throws Exception
{
scenarioEngineShutdownDoesNotTakeDownNS(true);
}
/**
* Test the scenario from scenarioEngineShutdownDoesNotTakeDownNS
* relying on the network server to reloading the embedded driver
* after the network server has shutdown.
* @throws Exception
*/
public void testEngineShutdownDoesNotTakeDownNSAutoReload() throws Exception
{
scenarioEngineShutdownDoesNotTakeDownNS(false);
}
/**
* Test that a shutdown of the engine does not take down the network
* server. Before DERBY-1326 was fixed, shutting down the engine would
* leave the network server in an inconsistent state which could make
* clients hang infinitely.
*/
private void scenarioEngineShutdownDoesNotTakeDownNS(
boolean loadEmbeddedDriver) throws Exception {
Connection[] conns = new Connection[20];
// first make sure there are 20 active worker threads on the server
for (int i = 0; i < conns.length; i++) {
conns[i] = openDefaultConnection();
}
// then close them, leaving 20 free worker threads ready to pick up new
// sessions
for (int i = 0; i < conns.length; i++) {
conns[i].close();
conns[i] = null;
}
// Give the free threads a little time to close their sessions. This is
// done to ensure that there are free threads waiting for new sessions,
// which makes the DERBY-1326 hang more reliably reproducible.
Thread.sleep(500);
// shut down the engine
TestConfiguration.getCurrent().shutdownEngine();
Class<?> clazz;
if (loadEmbeddedDriver)
{
clazz = Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
clazz.getConstructor().newInstance();
}
// see if it is still possible to connect to the server (before
// DERBY-1326, this would hang)
for (int i = 0; i < 20; i++) {
openDefaultConnection().close();
}
}
/**
* Test that the NetworkServer does not shut down the
* databases it has booted when started from the API.
* This fixture must be run with a clientServerDecorator().
*/
public void testDatabasesShutDownWhenNSShutdownAPI()
throws Exception
{
// Check that the databases will not be shutdown when the server is
// shut down.
shutdownServerCheckDBShutDown(false);
}
/**
* Test that the NetworkServer shuts down the databases it has booted when
* started from the command line, and that it does not shut down the
* databases it has booted when started from the API.
*/
public void XXtestDatabasesShutDownWhenNSShutdown()
throws Exception
{
// The server was started from the command line when the test was
// started. Check that the database will be shut down when the server
// is shut down.
shutdownServerCheckDBShutDown(true);
}
/**
* Checks whether the server shuts down causes the databases it has booted
* to be shut down.
*
* Creates a database and shuts down the server. If the server was started
* from the command line the database should be shut down. If the server
* was started from the api the database should not be shut down.
*
* If the database has been shut down the db.lck file should not exist.
*
* @param dbShutDown Indicates whether the database should have been shut
* down.
*/
private void shutdownServerCheckDBShutDown(boolean dbShutDown)
throws Exception
{
// connect to database
createDatabase();
NetworkServerControl server = NetworkServerTestSetup.getNetworkServerControl();
// shut down the server
server.shutdown();
// check if db.lck exists
String fileName = getSystemProperty("derby.system.home") +
java.io.File.separator +
TestConfiguration.getCurrent().getDefaultDatabaseName() +
java.io.File.separator + "db.lck";
File lockFile = new File(fileName);
boolean fileNotFound = false;
int i = 0;
do {
Thread.sleep(500);
fileNotFound = !PrivilegedFileOpsForTests.exists(lockFile);
i ++;
} while (fileNotFound != dbShutDown && i < 120);
assertEquals("Database is shut down", dbShutDown, fileNotFound);
}
private void createDatabase() throws SQLException {
Connection conn = getConnection();
conn.setAutoCommit(false);
Statement st = conn.createStatement();
st.execute("CREATE TABLE T1 (a int)");
st.execute("INSERT INTO T1 VALUES (1), (2), (3), (4), (5)");
st.execute("DROP TABLE T1");
conn.commit();
conn.close();
}
}
|