aboutsummaryrefslogtreecommitdiffstats
path: root/mdbc-internal-benchmark/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'mdbc-internal-benchmark/src/main')
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricAddTxDigestBenchmark.java143
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricCommitBenchmark.java137
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricIsolatedMixinCommBenchmark.java151
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricOwnBenchmark.java142
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricPeekLockBenchmark.java151
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricRedoLogBenchmark.java130
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/MetricThreadJoinBenchmark.java197
-rw-r--r--mdbc-internal-benchmark/src/main/java/org/onap/music/mdbc/OwnUtils.java383
-rwxr-xr-xmdbc-internal-benchmark/src/main/resources/logback.xml369
-rwxr-xr-xmdbc-internal-benchmark/src/main/resources/mdbc.properties13
-rwxr-xr-xmdbc-internal-benchmark/src/main/resources/music.properties8
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