diff options
Diffstat (limited to 'mdbc-internal-benchmark/src/main')
11 files changed, 1824 insertions, 0 deletions
diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricAddTxDigestBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricAddTxDigestBenchmark.java new file mode 100644 index 0000000..d15c3e6 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricAddTxDigestBenchmark.java @@ -0,0 +1,143 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.onap.music.mdbc.tables.MusicTxDigestId; +import org.onap.music.mdbc.tables.StagingTable; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricAddTxDigestBenchmark { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricAddTxDigestBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + @Benchmark + public void testMethod(MyState state, Blackhole blackhole) { + OwnUtils.addTransactionDigest(state.copy, state.copyTxDigestId, + (MusicMixin) state.getManager().getMusicInterface()); + } + + @State(Scope.Benchmark) + public static class MyState { + public MusicTxDigestId musicTxDigestId,copyTxDigestId; + public StagingTable copy,current; + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"127.0.0.1"}) + public String ip; + @Param({"1", "10", "50", "80", "100", "200", "300", "400"}) + public int rows; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + private void assignManager() { + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + OwnUtils.dropAll(ip); + setupServer(); + assignManager(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, rows,1,1); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + try { + Statement stmt = conn.createStatement(); + stmt.execute(OwnUtils.UPDATE); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + musicTxDigestId = OwnUtils.setupCommit(conn.getPartition(), conn.getTransactionDigest()); + final DatabasePartition partition = conn.getPartition(); + OwnUtils.appendToRedo((MusicMixin)getManager().getMusicInterface(),partition.getMRIIndex(),partition.getLockId(), + musicTxDigestId); + current=conn.getTransactionDigest(); + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + meta=null; + } + + @Setup(Level.Invocation) + public void doInvocationSetup(){ + try { + copy = new StagingTable(current); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + System.exit(1); + } + copyTxDigestId = new MusicTxDigestId(MDBCUtils.generateUniqueKey(), -1); + } + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricCommitBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricCommitBenchmark.java new file mode 100644 index 0000000..7461457 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricCommitBenchmark.java @@ -0,0 +1,137 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricCommitBenchmark { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricCommitBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + @Benchmark + public void testMethod(MyState state, Blackhole blackhole) { + try { + state.conn.commit(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + } + + @State(Scope.Benchmark) + public static class MyState { + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"104.209.240.219"}) + public String ip; + @Param({"1", "10", "50", "80", "100", "200", "300", "400"}) + public int rows; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + private void assignManager() { + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + OwnUtils.dropAll(ip); + setupServer(); + assignManager(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, rows,1,1); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + meta=null; + } + + @Setup(Level.Invocation) + public void doInvocationSetup(){ + Statement stmt = null; + try { + stmt = conn.createStatement(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + try { + stmt.execute(OwnUtils.UPDATE); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + } + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricIsolatedMixinCommBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricIsolatedMixinCommBenchmark.java new file mode 100644 index 0000000..c789ca7 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricIsolatedMixinCommBenchmark.java @@ -0,0 +1,151 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import org.onap.music.exceptions.MDBCServiceException; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.onap.music.mdbc.tables.MusicTxDigestId; +import org.onap.music.mdbc.tables.StagingTable; +import org.onap.music.mdbc.tables.TxCommitProgress; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricIsolatedMixinCommBenchmark { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricIsolatedMixinCommBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + @Benchmark + public void testMethod(MyState state, Blackhole blackhole) { + try { + state.musicMixin.commitLog(state.conn.getPartition(),null,state.copy, + state.copyTxDigestId.transactionId.toString(),state.progressKeeper); + } catch (MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + } + } + + @State(Scope.Benchmark) + public static class MyState { + public TxCommitProgress progressKeeper; + public MusicTxDigestId musicTxDigestId,copyTxDigestId; + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"104.209.240.219"}) + public String ip; + @Param({"1", "10", "50", "80", "100", "200", "300", "400"}) + public int rows; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + public StagingTable copy,current; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + private void assignManager() { + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + OwnUtils.dropAll(ip); + setupServer(); + assignManager(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, rows,1,1); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + Statement stmt = null; + try { + stmt = conn.createStatement(); + stmt.execute(OwnUtils.UPDATE); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + musicTxDigestId = OwnUtils.setupCommit(conn.getPartition(), conn.getTransactionDigest()); + current=conn.getTransactionDigest(); + progressKeeper = new TxCommitProgress(); + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + meta=null; + } + + @Setup(Level.Invocation) + public void doInvocationSetup(){ + try { + copy = new StagingTable(current); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + System.exit(1); + } + copyTxDigestId = new MusicTxDigestId(MDBCUtils.generateUniqueKey(), -1); + progressKeeper.createNewTransactionTracker(copyTxDigestId.transactionId.toString(),conn); + } + + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricOwnBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricOwnBenchmark.java new file mode 100644 index 0000000..42665b1 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricOwnBenchmark.java @@ -0,0 +1,142 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import java.sql.SQLException; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import org.onap.music.exceptions.MDBCServiceException; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricOwnBenchmark{ + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricOwnBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + @Benchmark + public void testMethod(MyState state, Blackhole blackhole) { + try { + state.conn.preStatementHook(state.update); + } catch (MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + } + } + + @State(Scope.Benchmark) + public static class MyState { + public String update="SELECT * FROM PERSONS;"; + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"104.209.240.219"}) + public String ip; + //Rows per transaction (e.g. size of each tx digest) + @Param({"1", "10", "50", "80", "100", "200", "300", "400"}) + public int rows; + //Transaction before each ownership transition (e.g. size of redo log) + @Param({"1","10","100"}) + public int updates; + //Number of ownership transitions before measurement (e.g. number of mri rows" + @Param({"1","10","100"}) + public int transitions; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + OwnUtils.dropAll(ip); + setupServer(); + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, rows, updates, transitions); + meta=null; + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + meta=null; + } + + @Setup(Level.Invocation) + public void doInvocationSetup(){ + setupServer(); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + try { + OwnUtils.dropAndCreateTable(conn.getDBInterface()); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + } + + @TearDown(Level.Invocation) + public void doInvocationTearDown(){ + OwnUtils.deleteLastMriRow((MusicMixin) musicMixin); + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + getManager().closeConnection(id); + } + + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricPeekLockBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricPeekLockBenchmark.java new file mode 100644 index 0000000..1b56c6b --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricPeekLockBenchmark.java @@ -0,0 +1,151 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import com.datastax.driver.core.ConsistencyLevel; +import com.datastax.driver.core.ExecutionInfo; +import com.datastax.driver.core.QueryTrace; +import com.datastax.driver.core.ResultSet; +import com.datastax.driver.core.SimpleStatement; +import org.onap.music.datastore.MusicDataStore; +import org.onap.music.datastore.MusicDataStoreHandle; +import org.onap.music.datastore.PreparedQueryObject; +import org.onap.music.exceptions.MusicQueryException; +import org.onap.music.exceptions.MusicServiceException; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.onap.music.mdbc.tables.MusicRangeInformationRow; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricPeekLockBenchmark { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricPeekLockBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + @Benchmark + public void testMethod(MyState state, Blackhole blackhole) { + String table = state.table_prepend_name+OwnUtils.MRI_TABLE_NAME; + String selectQuery = "select * from "+OwnUtils.KEYSPACE+"."+table+" where key='"+state.key+"' LIMIT 1;"; + PreparedQueryObject queryObject = new PreparedQueryObject(); + queryObject.appendQueryString(selectQuery); + ResultSet results=null; + SimpleStatement statement = new SimpleStatement(queryObject.getQuery(), queryObject.getValues().toArray()); + statement.setConsistencyLevel(ConsistencyLevel.ONE); + statement.enableTracing(); + results = state.dsHandle.getSession().execute(statement); + blackhole.consume(results); + } + + public void printInfo(ResultSet results){ + ExecutionInfo executionInfo = results.getExecutionInfo(); + System.out.println(executionInfo.getQueriedHost().getAddress()); + System.out.println(executionInfo.getQueriedHost().getDatacenter()); + System.out.println(executionInfo.getQueriedHost().getRack()); + final QueryTrace trace = executionInfo.getQueryTrace(); + System.out.printf( + "'%s' to %s took %dμs%n", + trace.getRequestType(), trace.getCoordinator(), trace.getDurationMicros()); + for (QueryTrace.Event event : trace.getEvents()) { + System.out.printf( + " %d - %s - %s%n", + event.getSourceElapsedMicros(), event.getSource(), event.getDescription()); + } + } + + @State(Scope.Benchmark) + public static class MyState { + public MusicDataStore dsHandle; + public String key; + private String table_prepend_name = "lockQ_"; + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"104.209.240.219"}) + public String ip; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + public MusicRangeInformationRow lastRow; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + private void assignManager() { + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + OwnUtils.dropAll(ip); + setupServer(); + try { + dsHandle=MusicDataStoreHandle.getDSHandle(); + } catch (MusicServiceException e) { + e.printStackTrace(); + System.exit(1); + } + assignManager(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, 1,1,1); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + lastRow = OwnUtils.getLastRow((MusicMixin) musicMixin); + key = lastRow.getPartitionIndex().toString(); + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + try { + conn.close(); + } catch (SQLException e) { + System.exit(1); + } + meta=null; + } + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricRedoLogBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricRedoLogBenchmark.java new file mode 100644 index 0000000..7e227fd --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricRedoLogBenchmark.java @@ -0,0 +1,130 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.onap.music.mdbc.tables.MusicTxDigestId; +import org.onap.music.mdbc.tables.StagingTable; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricRedoLogBenchmark { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricRedoLogBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + @Benchmark + public void testMethod(MyState state, Blackhole blackhole) { + final DatabasePartition partition = state.conn.getPartition(); + OwnUtils.appendToRedo((MusicMixin)state.getManager().getMusicInterface(),partition.getMRIIndex(), + partition.getLockId(),state.musicTxDigestId); + } + + @State(Scope.Benchmark) + public static class MyState { + public MusicTxDigestId musicTxDigestId; + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"104.209.240.219"}) + public String ip; + @Param({"1", "10", "50", "80", "100", "200", "300", "400"}) + public int rows; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + private void assignManager() { + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + OwnUtils.dropAll(ip); + setupServer(); + assignManager(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, rows,1,1); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + Statement stmt = null; + try { + stmt = conn.createStatement(); + stmt.execute(OwnUtils.UPDATE); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + musicTxDigestId = OwnUtils.setupCommit(conn.getPartition(), conn.getTransactionDigest()); + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + meta=null; + } + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricThreadJoinBenchmark.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricThreadJoinBenchmark.java new file mode 100644 index 0000000..70ba10a --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricThreadJoinBenchmark.java @@ -0,0 +1,197 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ + +package org.onap.music.mdbc; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.onap.music.exceptions.MDBCServiceException; +import org.onap.music.exceptions.MusicLockingException; +import org.onap.music.logging.EELFLoggerDelegate; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.onap.music.mdbc.tables.MusicTxDigestId; +import org.onap.music.mdbc.tables.StagingTable; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.infra.Blackhole; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode({Mode.AverageTime, Mode.SampleTime}) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class MetricThreadJoinBenchmark { + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(MetricThreadJoinBenchmark.class.getSimpleName()) + .threads(1) + .forks(1) + .build(); + new Runner(opt).run(); + } + + public void testMethod1(final MyState state) { + final String lockId = state.conn.getPartition().getLockId(); + final UUID MRIIndex = state.conn.getPartition().getMRIIndex(); + Thread t1=null; + Thread t2=null; + if(state.runTxDigest) { + final Runnable insertDigestCallable = new Runnable() { + @Override + public void run() { + OwnUtils.hardcodedAddtransaction(110); + } + }; + t1 = new Thread(insertDigestCallable); + t1.start(); + } + if(state.runRedo) { + final Runnable appendCallable = new Runnable() { + @Override + public void run() { + OwnUtils.hardcodedAppendToRedo(MRIIndex,lockId); + } + }; + t2 = new Thread(appendCallable); + t2.start(); + } + + try { + if(state.runTxDigest) { + t1.join(); + } + if(state.runRedo) { + t2.join(); + } + } catch (InterruptedException e) { + e.printStackTrace(); + System.exit(1); + } + } + + @Benchmark + public void testMethod2(final MyState state) { + final String lockId = state.conn.getPartition().getLockId(); + final UUID MRIIndex = state.conn.getPartition().getMRIIndex(); + OwnUtils.hardcodedAddtransaction(110); + OwnUtils.hardcodedAppendToRedo(MRIIndex,lockId); + } + + @State(Scope.Benchmark) + public static class MyState { + public MusicTxDigestId musicTxDigestId,copyTxDigestId; + public StagingTable copy,current; + final String user = OwnUtils.SQL_USER; + final String password = OwnUtils.SQL_PASSWORD; + public final Range range = new Range(OwnUtils.TABLE); + @Param({"127.0.0.1"}) + public String ip; + @Param({"1", "10", "50", "80", "100", "200", "300", "400"}) + public int rows; + @Param({"true","false"}) + public boolean runRedo; + @Param({"true","false"}) + public boolean runTxDigest; + private MusicInterface musicMixin = null; + private MdbcConnection conn; + private DBInterface dbMixin; + private MdbcServerLogic meta; + private String id; + public ExecutorService commitExecutorThreads; + + private void setupServer(){ + meta = OwnUtils.setupServer(user, password); + } + + private StateManager getManager(){ + return meta.getStateManager(); + } + + private void assignManager() { + StateManager manager = getManager(); + musicMixin=manager.getMusicInterface(); + } + + @Setup(Level.Trial) + public void doTrialSetup(){ + commitExecutorThreads = Executors.newFixedThreadPool(4); + OwnUtils.dropAll(ip); + setupServer(); + assignManager(); + OwnUtils.initMri((MusicMixin) musicMixin,range,meta, rows,0,0); + id = UUID.randomUUID().toString(); + conn = (MdbcConnection) getManager().getConnection(id); + try { + Statement stmt = conn.createStatement(); + stmt.execute(OwnUtils.UPDATE); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + musicTxDigestId = OwnUtils.setupCommit(conn.getPartition(), conn.getTransactionDigest()); + current=conn.getTransactionDigest(); + } + + @TearDown(Level.Trial) + public void doTrialTearDown(){ + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + meta=null; + commitExecutorThreads.shutdown(); + } + + @Setup(Level.Invocation) + public void doInvocationSetup(){ + try { + copy = new StagingTable(current); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + System.exit(1); + } + copyTxDigestId = new MusicTxDigestId(MDBCUtils.generateUniqueKey(), -1); + } + } +} diff --git a/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/OwnUtils.java b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/OwnUtils.java new file mode 100644 index 0000000..980408b --- /dev/null +++ b/mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/OwnUtils.java @@ -0,0 +1,383 @@ +/* + * ============LICENSE_START==================================================== + * org.onap.music.mdbc + * ============================================================================= + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ============================================================================= + * Licensed 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. + * ============LICENSE_END====================================================== + */ +package org.onap.music.mdbc; + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.Cluster.Builder; +import com.datastax.driver.core.Session; + +import java.nio.ByteBuffer; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Properties; +import java.util.UUID; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.datastax.driver.core.SocketOptions; +import org.onap.music.datastore.PreparedQueryObject; +import org.onap.music.exceptions.MDBCServiceException; +import org.onap.music.exceptions.MusicLockingException; +import org.onap.music.exceptions.MusicServiceException; +import org.onap.music.lockingservice.cassandra.MusicLockState; +import org.onap.music.main.MusicCore; +import org.onap.music.main.ResultType; +import org.onap.music.main.ReturnType; +import org.onap.music.mdbc.configurations.NodeConfiguration; +import org.onap.music.mdbc.mixins.DBInterface; +import org.onap.music.mdbc.mixins.MusicInterface; +import org.onap.music.mdbc.mixins.MusicMixin; +import org.onap.music.mdbc.tables.MriRowComparator; +import org.onap.music.mdbc.tables.MusicRangeInformationRow; +import org.onap.music.mdbc.tables.MusicTxDigestId; +import org.onap.music.mdbc.tables.StagingTable; + +public class OwnUtils { + + public static final int SQL_PORT= 3306; + + public static final String SQL_USER = "root"; + public static final String SQL_PASSWORD = "metriccluster"; + public static final String CASSANDRA_USER = "metric"; + public static final String CASSANDRA_PASSWORD = "metriccluster"; + public static final String KEYSPACE ="namespace"; + public static final String MRI_TABLE_NAME = "musicrangeinformation"; + public static final String MTD_TABLE_NAME = "musictxdigest"; + public static final String MDBC_SERVER_NAME = "name"; + public static final String DATABASE = "test"; + public static final String TABLE= "PERSONS"; + public static final int REPLICATION_FACTOR = 3; + public static final String SQL_URL="jdbc:mariadb://localhost:"+OwnUtils.SQL_PORT; + final static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "+TABLE+" (\n" + + " PersonID int,\n" + + " Counter int,\n" + + " LastName varchar(255),\n" + + " FirstName varchar(255),\n" + + " Address varchar(255),\n" + + " City varchar(255),\n" + + " PRIMARY KEY(PersonID)"+ + ");"; + + public static final String UPDATE = new StringBuilder() + .append("UPDATE PERSONS ") + .append("SET Counter = Counter + 1,") + .append("City = 'Sandy Springs'") + .append(";").toString(); + public static final String PURGE = "PURGE BINARY LOGS BEFORE '"; + public static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE + ";"; + private static Lock sessionLock = new ReentrantLock(); + private static Boolean sessionReady= false; + private static Cluster cluster; + private static Session session; + + private static String getPurgeCommand(){ + String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + return PURGE+timeStamp+"';"; + } + + public static Session getSession(String CASSANDRA_HOST){ + sessionLock.lock(); + try { + if(!sessionReady){ + SocketOptions options = new SocketOptions(); + options.setConnectTimeoutMillis(30000); + options.setReadTimeoutMillis(300000); + options.setTcpNoDelay(true); + final Builder builder = Cluster.builder(); + builder.addContactPoint(CASSANDRA_HOST); + builder.withCredentials(CASSANDRA_USER, CASSANDRA_PASSWORD); + builder.withSocketOptions(options); + cluster = builder.build(); + session=cluster.newSession(); + } + return session; + // access the resource protected by this lock + } finally { + sessionLock.unlock(); + } + } + + public static Connection getConnection() throws ClassNotFoundException, SQLException { + Class.forName("org.mariadb.jdbc.Driver"); + Properties connectionProps = new Properties(); + connectionProps.put("user", SQL_USER); + connectionProps.put("password", SQL_PASSWORD); + Connection connection = DriverManager.getConnection(SQL_URL+"/"+DATABASE, connectionProps); + connection.setAutoCommit(false); + return connection; + } + + public static void purgeBinLogs(Connection conn) throws SQLException{ + final Statement dropStatement = conn.createStatement(); + dropStatement.execute(getPurgeCommand()); + dropStatement.close(); + } + + public static void dropTable(Connection conn) throws SQLException { + final Statement dropStatement = conn.createStatement(); + dropStatement.execute(DROP_TABLE); + dropStatement.close(); + } + + private static void createTable(Connection conn) throws SQLException { + final Statement createStatement = conn.createStatement(); + createStatement.execute(CREATE_TABLE); + createStatement.close(); + } + + public static void dropAndCreateTable(DBInterface dbMixin) throws SQLException { + dbMixin.dropSQLTriggers(TABLE); + dropTable(dbMixin.getSQLConnection()); + createTable(dbMixin.getSQLConnection()); + dbMixin.createSQLTriggers(TABLE); + } + + public static void unlockRow(String keyspace, String mriTableName, DatabasePartition partition) + throws MusicLockingException { + String fullyQualifiedMriKey = keyspace+"."+ mriTableName+"."+partition.getMRIIndex().toString(); + MusicLockState musicLockState = MusicCore.voluntaryReleaseLock(fullyQualifiedMriKey, partition.getLockId()); + } + + public static DatabasePartition createBasicRow(Range range, MusicInterface mixin, String mdbcServerName) + throws MDBCServiceException { + List<Range> ranges = new ArrayList<>(); + ranges.add(range); + final UUID uuid = MDBCUtils.generateTimebasedUniqueKey(); + DatabasePartition dbPartition = new DatabasePartition(ranges,uuid,null); + MusicRangeInformationRow newRow = new MusicRangeInformationRow(uuid,dbPartition, new ArrayList<MusicTxDigestId>(), "", + mdbcServerName, true); + DatabasePartition partition=mixin.createMusicRangeInformation(newRow); + return partition; + } + + public static void initMriTable(MusicMixin musicMixin, Range range) + throws MDBCServiceException, SQLException, MusicLockingException { + final DatabasePartition partition = createBasicRow(range, musicMixin, MDBC_SERVER_NAME); + unlockRow(KEYSPACE,MRI_TABLE_NAME,partition); + } + + public static MusicRangeInformationRow getLastRow(MusicMixin musicMixin){ + List<MusicRangeInformationRow> allMriRows; + try { + allMriRows = musicMixin.getAllMriRows(); + } catch (MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + allMriRows=null;//Just to avoid IDE annoyance + } + Collections.sort(allMriRows, new MriRowComparator()); + MusicRangeInformationRow musicRangeInformationRow = allMriRows.get(allMriRows.size() - 1); + return musicRangeInformationRow; + } + + public static void deleteLastMriRow(MusicMixin musicMixin){ + MusicRangeInformationRow musicRangeInformationRow = getLastRow(musicMixin); + try { + musicMixin.deleteMriRow(musicRangeInformationRow); + } catch (MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + } + } + + private static void changeRows(Connection conn) throws SQLException { + Statement stmt = conn.createStatement(); + Boolean execute = stmt.execute(UPDATE); + conn.commit(); + stmt.close(); + } + + private static void addRowsToTable(int totalNumberOfRows, Connection testConnection) throws SQLException { + for (int i = 0; i < totalNumberOfRows; i++) { + final StringBuilder insertSQLBuilder = new StringBuilder() + .append("INSERT INTO PERSONS VALUES (") + .append(i) + .append(", ") + .append(0) + .append(", '") + .append("Last-") + .append(i) + .append("', '") + .append("First-") + .append(i) + .append("', 'KACB', 'ATLANTA');"); + Statement stmt = testConnection.createStatement(); + Boolean execute = stmt.execute(insertSQLBuilder.toString()); + stmt.close(); + } + testConnection.commit(); + } + + public static void createHistory(MdbcServerLogic meta,int rows, int updates,int transitions) + throws SQLException { + final StateManager stateManager = meta.getStateManager(); + String id = UUID.randomUUID().toString(); + Connection connection = stateManager.getConnection(id); + createTable(connection); + addRowsToTable(rows, connection); + connection.close(); + stateManager.closeConnection(id); + for(int mriRow=0;mriRow<transitions;mriRow++) { + final String finalId = UUID.randomUUID().toString(); + connection = stateManager.getConnection(finalId); + for(int depth=0;depth<updates;depth++){ + changeRows(connection); + } + connection.close(); + stateManager.closeConnection(finalId); + } + } + + public static MdbcServerLogic setupServer(String user, String password){ + MdbcServerLogic meta; + NodeConfiguration config = new NodeConfiguration("","",null,OwnUtils.DATABASE, + OwnUtils.MDBC_SERVER_NAME); + //\TODO Add configuration file with Server Info + Properties connectionProps = new Properties(); + connectionProps.setProperty("user", user); + connectionProps.setProperty("password", password); + connectionProps.setProperty(MusicMixin.KEY_MUSIC_RFACTOR,Integer.toString(OwnUtils.REPLICATION_FACTOR)); + connectionProps.setProperty(MusicMixin.KEY_MUSIC_NAMESPACE,OwnUtils.KEYSPACE); + try { + meta = new MdbcServerLogic(OwnUtils.SQL_URL,connectionProps,config); + } catch (SQLException e) { + e.printStackTrace(); + meta=null; + System.exit(1); + } catch (MDBCServiceException e) { + e.printStackTrace(); + meta=null; + System.exit(1); + } + return meta; + } + + public static void dropAll(String ip){ + Session session=OwnUtils.getSession(ip); + session.execute("DROP KEYSPACE IF EXISTS "+OwnUtils.KEYSPACE+";"); + try { + Connection connection = OwnUtils.getConnection(); + OwnUtils.dropTable(connection); + connection.close(); + } catch (SQLException|ClassNotFoundException e) { + e.printStackTrace(); + System.exit(1); + } + } + + public static void initMri(MusicMixin musicMixin,Range range,MdbcServerLogic meta, int rows, int updates, int transitions){ + try { + OwnUtils.initMriTable(musicMixin,range); + } catch (MusicLockingException|SQLException|MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + } + try { + OwnUtils.createHistory(meta, rows, updates, transitions); + } catch (SQLException e) { + e.printStackTrace(); + System.exit(1); + } + } + + public static void hardcodedAddtransaction(int size){ + final UUID uuid = MDBCUtils.generateTimebasedUniqueKey(); + ByteBuffer serializedTransactionDigest = ByteBuffer.allocate(size); + for(int i=0;i<size;i++){ + serializedTransactionDigest.put((byte)i); + } + PreparedQueryObject query = new PreparedQueryObject(); + String cql = String.format("INSERT INTO %s.%s (txid,transactiondigest,compressed ) VALUES (?,?,?);",KEYSPACE, + MTD_TABLE_NAME); + query.appendQueryString(cql); + query.addValue(uuid); + query.addValue(serializedTransactionDigest); + query.addValue(false); + //\TODO check if I am not shooting on my own foot + try { + MusicCore.nonKeyRelatedPut(query,"critical"); + } catch (MusicServiceException e) { + e.printStackTrace(); + System.exit(1); + } + } + + public static void hardcodedAppendToRedo(UUID mriId, String lockId){ + final UUID uuid = MDBCUtils.generateTimebasedUniqueKey(); + PreparedQueryObject query = new PreparedQueryObject(); + StringBuilder appendBuilder = new StringBuilder(); + appendBuilder.append("UPDATE ") + .append(KEYSPACE) + .append(".") + .append(MRI_TABLE_NAME) + .append(" SET txredolog = txredolog +[('") + .append(MTD_TABLE_NAME) + .append("',") + .append(uuid) + .append(")] WHERE rangeid = ") + .append(mriId) + .append(";"); + query.appendQueryString(appendBuilder.toString()); + ReturnType returnType = MusicCore.criticalPut(KEYSPACE, MRI_TABLE_NAME, mriId.toString(), + query, lockId, null); + //returnType.getExecutionInfo() + if (returnType.getResult().compareTo(ResultType.SUCCESS) != 0) { + System.exit(1); + } + } + + public static void addTransactionDigest(StagingTable transactionDigest, MusicTxDigestId digestId, MusicMixin music){ + try { + music.createAndAddTxDigest(transactionDigest, digestId.transactionId); + } catch (MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + } + } + + public static void appendToRedo(MusicMixin music, UUID MRIIndex, String lockId, MusicTxDigestId digestId){ + try { + music.appendToRedoLog(KEYSPACE,MRIIndex,digestId.transactionId,lockId,OwnUtils.MTD_TABLE_NAME, + OwnUtils.MRI_TABLE_NAME); + } catch (MDBCServiceException e) { + e.printStackTrace(); + System.exit(1); + } + } + + public static MusicTxDigestId setupCommit(DatabasePartition partition, StagingTable transactionDigest){ + UUID mriIndex = partition.getMRIIndex(); + + if(transactionDigest == null || transactionDigest.isEmpty()) { + System.err.println("Transaction digest is empty"); + System.exit(1); + } + + MusicTxDigestId digestId = new MusicTxDigestId(MDBCUtils.generateUniqueKey(), -1); + return digestId; + } +} diff --git a/mdbc-internal-benchmark/src/main/resources/logback.xml b/mdbc-internal-benchmark/src/main/resources/logback.xml new file mode 100755 index 0000000..4215681 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/resources/logback.xml @@ -0,0 +1,369 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START========================================== + mdbc + =================================================================== + Copyright © 2017 AT&T Intellectual Property. All rights reserved. + =================================================================== + + Unless otherwise specified, all software contained herein is licensed + under the Apache License, Version 2.0 (the “License”); + you may not use this software 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. + + Unless otherwise specified, all documentation contained herein is licensed + under the Creative Commons License, Attribution 4.0 Intl. (the “License”); + you may not use this documentation except in compliance with the License. + You may obtain a copy of the License at + + https://creativecommons.org/licenses/by/4.0/ + + Unless required by applicable law or agreed to in writing, documentation + 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. + + ============LICENSE_END============================================ + + + --> + +<configuration scan="false" scanPeriod="3 seconds" debug="true"> + <!-- + Logback files for the mdbc Driver "mdbc" + are created in directory ${catalina.base}/logs/mdbc; + e.g., apache-tomcat-8.0.35/logs/mdbc/application.log + --> + <!--<jmxConfigurator /> --> + + <!-- specify the component name --> + <property name="catalina.home" value="/var/log/metric/"/> + <property name="componentName" value="mdbc"></property> + + <!-- specify the base path of the log directory --> + <property name="logDirPrefix" value="${catalina.base}/logs"></property> + + <!-- The directories where logs are written --> + <property name="logDirectory" value="${logDirPrefix}/${componentName}"/> + <!-- Can easily relocate debug logs by modifying this path. --> + <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}"/> + + <!-- log file names --> + <property name="generalLogName" value="application"/> + <property name="errorLogName" value="error"/> + <property name="metricsLogName" value="metrics"/> + <property name="auditLogName" value="audit"/> + <property name="debugLogName" value="debug"/> + <!-- + These loggers are not used in code (yet). + <property name="securityLogName" value="security" /> + <property name="policyLogName" value="policy" /> + <property name="performanceLogName" value="performance" /> + <property name="serverLogName" value="server" /> + --> + + <!-- 1610 Logging Fields Format Revisions --> + <property name="auditLoggerPattern" + value="%X{AuditLogBeginTimestamp}|%X{AuditLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n"/> + + <property name="metricsLoggerPattern" + value="%X{MetricsLogBeginTimestamp}|%X{MetricsLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVisualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n"/> + + <property name="errorLoggerPattern" + value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ClassName}|%X{AlertSeverity}|%X{ErrorCode}|%X{ErrorDescription}| %msg%n"/> + + <property name="defaultLoggerPattern" + value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n"/> + + <!-- use %class so library logging calls yield their class name --> + <property name="applicationLoggerPattern" + value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n"/> + + <!-- Example evaluator filter applied against console appender --> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>${defaultLoggerPattern}</pattern> + </encoder> + </appender> + + <!-- ============================================================================ --> + <!-- EELF Appenders --> + <!-- ============================================================================ --> + + <!-- The EELFAppender is used to record events to the general application + log --> + + + <appender name="EELF" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${generalLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- daily rollover --> + <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> + + <!-- keep 30 days' worth of history capped at 3GB total size --> + <maxHistory>30</maxHistory> + <totalSizeCap>3GB</totalSizeCap> + + </rollingPolicy> + <encoder> + <pattern>${applicationLoggerPattern}</pattern> + </encoder> + </appender> + + <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <!-- Class name is part of caller data --> + <includeCallerData>true</includeCallerData> + <appender-ref ref="EELF"/> + </appender> + + <!-- EELF Security Appender. This appender is used to record security events + to the security log file. Security events are separate from other loggers + in EELF so that security log records can be captured and managed in a secure + way separate from the other logs. This appender is set to never discard any + events. --> + <!-- + <appender name="EELFSecurity" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${securityLogName}.log</file> + <rollingPolicy + class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> + <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip + </fileNamePattern> + <minIndex>1</minIndex> + <maxIndex>9</maxIndex> + </rollingPolicy> + <triggeringPolicy + class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <maxFileSize>5MB</maxFileSize> + </triggeringPolicy> + <encoder> + <pattern>${defaultPattern}</pattern> + </encoder> + </appender> + + <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <discardingThreshold>0</discardingThreshold> + <appender-ref ref="EELFSecurity" /> + </appender> + --> + + <!-- EELF Performance Appender. This appender is used to record performance + records. --> + <!-- + <appender name="EELFPerformance" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${performanceLogName}.log</file> + <rollingPolicy + class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> + <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip + </fileNamePattern> + <minIndex>1</minIndex> + <maxIndex>9</maxIndex> + </rollingPolicy> + <triggeringPolicy + class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <maxFileSize>5MB</maxFileSize> + </triggeringPolicy> + <encoder> + <outputPatternAsHeader>true</outputPatternAsHeader> + <pattern>${defaultPattern}</pattern> + </encoder> + </appender> + <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFPerformance" /> + </appender> + --> + + <!-- EELF Server Appender. This appender is used to record Server related + logging events. The Server logger and appender are specializations of the + EELF application root logger and appender. This can be used to segregate Server + events from other components, or it can be eliminated to record these events + as part of the application root log. --> + <!-- + <appender name="EELFServer" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${serverLogName}.log</file> + <rollingPolicy + class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> + <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip + </fileNamePattern> + <minIndex>1</minIndex> + <maxIndex>9</maxIndex> + </rollingPolicy> + <triggeringPolicy + class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <maxFileSize>5MB</maxFileSize> + </triggeringPolicy> + <encoder> + <pattern>${defaultPattern}</pattern> + </encoder> + </appender> + <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFServer" /> + </appender> + --> + + <!-- EELF Policy Appender. This appender is used to record Policy engine + related logging events. The Policy logger and appender are specializations + of the EELF application root logger and appender. This can be used to segregate + Policy engine events from other components, or it can be eliminated to record + these events as part of the application root log. --> + <!-- + <appender name="EELFPolicy" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${policyLogName}.log</file> + <rollingPolicy + class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> + <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip + </fileNamePattern> + <minIndex>1</minIndex> + <maxIndex>9</maxIndex> + </rollingPolicy> + <triggeringPolicy + class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <maxFileSize>5MB</maxFileSize> + </triggeringPolicy> + <encoder> + <pattern>${defaultPattern}</pattern> + </encoder> + </appender> + <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFPolicy" /> + </appender> + --> + + <!-- EELF Audit Appender. This appender is used to record audit engine + related logging events. The audit logger and appender are specializations + of the EELF application root logger and appender. This can be used to segregate + Policy engine events from other components, or it can be eliminated to record + these events as part of the application root log. --> + + <appender name="EELFAudit" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${auditLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- daily rollover --> + <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> + + <!-- keep 30 days' worth of history capped at 3GB total size --> + <maxHistory>30</maxHistory> + <totalSizeCap>3GB</totalSizeCap> + + </rollingPolicy> + <encoder> + <pattern>${auditLoggerPattern}</pattern> + </encoder> + </appender> + <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFAudit"/> + </appender> + + <appender name="EELFMetrics" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${metricsLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- daily rollover --> + <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> + + <!-- keep 30 days' worth of history capped at 3GB total size --> + <maxHistory>30</maxHistory> + <totalSizeCap>3GB</totalSizeCap> + + </rollingPolicy> + <encoder> + <pattern>${metricsLoggerPattern}</pattern> + </encoder> + </appender> + + + <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFMetrics"/> + </appender> + + <appender name="EELFError" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${errorLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- daily rollover --> + <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> + + <!-- keep 30 days' worth of history capped at 3GB total size --> + <maxHistory>30</maxHistory> + <totalSizeCap>3GB</totalSizeCap> + + </rollingPolicy> + <encoder> + <pattern>${errorLoggerPattern}</pattern> + </encoder> + </appender> + + <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFError"/> + </appender> + + <appender name="EELFDebug" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${debugLogDirectory}/${debugLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <!-- daily rollover --> + <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> + + <!-- keep 30 days' worth of history capped at 3GB total size --> + <maxHistory>30</maxHistory> + <totalSizeCap>3GB</totalSizeCap> + + </rollingPolicy> + <encoder> + <pattern>${defaultLoggerPattern}</pattern> + </encoder> + </appender> + + <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFDebug"/> + </appender> + + + <logger name="com.att.eelf" level="error" additivity="false"> + <appender-ref ref="asyncEELF"/> + </logger> + + <logger name="com.att.eelf" level="error" additivity="false"> + <appender-ref ref="asyncEELFAudit"/> + </logger> + + <logger name="com.att.eelf" level="error" additivity="false"> + <appender-ref ref="asyncEELFDebug"/> + </logger> + + <logger name="com.att.eelf.error" level="error" additivity="false"> + <appender-ref ref="asyncEELFError"/> + </logger> + + <logger name="com.att.eelf.metrics" level="error" additivity="false"> + <appender-ref ref="asyncEELFMetrics"/> + </logger> + + <root level="ERROR"> + <appender-ref ref="asyncEELF"/> + </root> + +</configuration> diff --git a/mdbc-internal-benchmark/src/main/resources/mdbc.properties b/mdbc-internal-benchmark/src/main/resources/mdbc.properties new file mode 100755 index 0000000..73e8f77 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/resources/mdbc.properties @@ -0,0 +1,13 @@ +# +# A list of all Mixins that should be checked by MDBC +# +MIXINS= \ + org.onap.music.mdbc.mixins.MySQLMixin \ + org.onap.music.mdbc.mixins.MusicMixin \ + org.onap.music.mdbc.mixins.Music2Mixin + +DEFAULT_DRIVERS=\ + org.h2.Driver \ + com.mysql.jdbc.Driver + +txdaemonsleeps=15
\ No newline at end of file diff --git a/mdbc-internal-benchmark/src/main/resources/music.properties b/mdbc-internal-benchmark/src/main/resources/music.properties new file mode 100755 index 0000000..ccacd38 --- /dev/null +++ b/mdbc-internal-benchmark/src/main/resources/music.properties @@ -0,0 +1,8 @@ +cassandra.host =\ + 10.0.0.5 +cassandra.user =\ + metric +cassandra.password =\ + metriccluster +zookeeper.host =\ + localhost |