File: ShutDownDBWhenNSShutsDownTest.java

package info (click to toggle)
derby 10.14.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 78,896 kB
  • sloc: java: 691,930; sql: 42,686; xml: 20,511; sh: 3,373; sed: 96; makefile: 60
file content (224 lines) | stat: -rw-r--r-- 8,052 bytes parent folder | download | duplicates (4)
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();
    }
}