/**
* Copyright (C) 2009-2013 FoundationDB, LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.foundationdb.server.test.mt;
import com.foundationdb.server.service.is.BasicInfoSchemaTablesService;
import com.foundationdb.server.service.is.BasicInfoSchemaTablesServiceImpl;
import com.foundationdb.server.service.servicemanager.GuicedServiceManager;
import com.foundationdb.server.test.mt.util.ThreadHelper;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class NonOverlappingDMLAndDDLMT extends PostgresMTBase
{
@Override
protected GuicedServiceManager.BindingsConfigurationProvider serviceBindingsProvider() {
return super.serviceBindingsProvider()
.bindAndRequire(BasicInfoSchemaTablesService.class, BasicInfoSchemaTablesServiceImpl.class);
}
@Override
protected Map<String, String> startupConfigProperties() {
return uniqueStartupConfigProperties(getClass());
}
private static class SelectThread extends QueryThread
{
private final String schema;
private final String table;
public SelectThread(Connection conn, String schema, String table) throws SQLException {
super("Select", schema, conn);
this.schema = schema;
this.table = table;
}
@Override
protected int getLoopCount() {
return 50;
}
@Override
protected String[] getQueries() {
return new String[] {
"SELECT COUNT(*) FROM "+schema+"."+table,
"SELECT * FROM "+schema+"."+table,
};
}
}
private static class DMLThread extends QueryThread
{
private final String schema;
private final String table;
public DMLThread(Connection conn, String schema, String table) throws SQLException {
super("DML", schema, conn);
this.schema = schema;
this.table = table;
}
@Override
protected int getLoopCount() {
return 25;
}
@Override
protected String[] getQueries() {
return new String[] {
"INSERT INTO "+schema+"."+table+" VALUES (10, 'ten')",
"UPDATE "+schema+"."+table+" SET v='net' WHERE id=10",
"DELETE FROM "+schema+"."+table+" WHERE id=10",
};
}
}
private static class DDLThread extends QueryThread
{
public DDLThread(Connection conn) throws SQLException {
super("DDL", "test", conn);
}
@Override
protected int getLoopCount() {
return 25;
}
@Override
protected String[] getQueries() {
return new String[] {
"CREATE TABLE t(ID INT NOT NULL PRIMARY KEY)",
"DROP TABLE t"
};
}
}
private static class onlineDDLThread extends QueryThread
{
public onlineDDLThread (Connection conn) throws SQLException {
super ("onlineDDL", "a_schema", conn);
}
@Override
protected int getLoopCount() {
return 25;
}
@Override
protected String[] getQueries() {
return new String[] {
"ALTER TABLE a_schema.t ADD COLUMN x INT",
"ALTER TABLE a_schema.t DROP COLUMN x"
};
}
}
@Test
public void selectInfoSchema() throws SQLException {
List<QueryThread> threads = Arrays.asList(
new SelectThread(createConnection(), "information_schema", "tables"),
new DDLThread(createConnection())
);
ThreadHelper.runAndCheck(30000, threads);
}
@Test
public void selectRealTable() throws SQLException {
String schema = "a_schema";
String table = "t";
int tid = createTable(schema, table, "id INT NOT NULL PRIMARY KEY, v VARCHAR(32)");
for(int i = 1; i <= 5; ++i) {
writeRow(tid, i, Integer.toString(i));
}
List<QueryThread> threads = Arrays.asList(
new SelectThread(createConnection(), schema, table),
new DDLThread(createConnection())
);
ThreadHelper.runAndCheck(30000, threads);
}
@Test
public void dmlRealTable() throws SQLException {
String schema = "a_schema";
String table = "t";
int tid = createTable(schema, table, "id INT NOT NULL PRIMARY KEY, v VARCHAR(32)");
for(int i = 1; i <= 5; ++i) {
writeRow(tid, i, Integer.toString(i));
}
List<QueryThread> threads = Arrays.asList(
new DMLThread(createConnection(), schema, table),
new DDLThread(createConnection())
);
ThreadHelper.runAndCheck(30000, threads);
}
@Test
public void ddlOnlineTable() throws SQLException {
int tid = createTable("a_schema", "t", "id INT NOT NULL PRIMARY KEY, v VARCHAR(32)");
for (int i = 1; i <= 5; i++) {
writeRow(tid, i, Integer.toString(i));
}
List<QueryThread> threads = Arrays.asList(
new SelectThread (createConnection(), "information_schema", "tables"),
new onlineDDLThread(createConnection())
);
ThreadHelper.runAndCheck(30000, threads);
}
@Test
public void ddlOnlineSelectTable() throws SQLException {
int tid = createTable("a_schema", "t", "id INT NOT NULL PRIMARY KEY, v VARCHAR(32)");
for (int i = 1; i <= 5; i++) {
writeRow(tid, i, Integer.toString(i));
}
List<QueryThread> threads = Arrays.asList(
new SelectThread (createConnection(), "a_schema", "t"),
new onlineDDLThread(createConnection())
);
ThreadHelper.runAndCheck(30000, threads);
}
}