[
https://issues.apache.org/jira/browse/CLOUDSTACK-10195?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16296710#comment-16296710
]
ASF GitHub Bot commented on CLOUDSTACK-10195:
---------------------------------------------
rhtyd closed pull request #2364: [CLOUDSTACK-10195] CloudStack MySQL HA problem
-- No database selected
URL: https://github.com/apache/cloudstack/pull/2364
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
index 2e20f241e01..d4717cada55 100644
--- a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
@@ -22,7 +22,6 @@
import java.nio.channels.SocketChannel;
import java.rmi.RemoteException;
import java.sql.Connection;
-import java.sql.SQLException;
import java.sql.SQLNonTransientException;
import java.sql.SQLRecoverableException;
import java.util.ArrayList;
@@ -546,7 +545,7 @@ protected void runInContext() {
profiler.start();
profilerHeartbeatUpdate.start();
-
txn.transitToUserManagedConnection(getHeartbeatConnection());
+
txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
if (s_logger.isTraceEnabled()) {
s_logger.trace("Cluster manager heartbeat update,
id:" + _mshostId);
}
@@ -597,7 +596,6 @@ protected void runInContext() {
invalidHeartbeatConnection();
}
} finally {
-
txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
txn.close("ClusterHeartbeat");
}
}
@@ -616,15 +614,6 @@ private boolean isRootCauseConnectionRelated(Throwable e) {
return false;
}
- private Connection getHeartbeatConnection() throws SQLException {
- if (_heartbeatConnection == null) {
- final Connection conn =
TransactionLegacy.getStandaloneConnectionWithException();
- _heartbeatConnection = new
ConnectionConcierge("ClusterManagerHeartbeat", conn, false);
- }
-
- return _heartbeatConnection.conn();
- }
-
private void invalidHeartbeatConnection() {
if (_heartbeatConnection != null) {
final Connection conn =
TransactionLegacy.getStandaloneConnection();
diff --git a/framework/db/test/com/cloud/utils/db/TransactionTest.java
b/framework/db/test/com/cloud/utils/db/TransactionTest.java
deleted file mode 100644
index fed663285d1..00000000000
--- a/framework/db/test/com/cloud/utils/db/TransactionTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.utils.db;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import com.cloud.utils.component.ComponentContext;
-import com.cloud.utils.exception.CloudRuntimeException;
-
-/**
- * A test fixture to test APIs or bugs found for Transaction class. This test
fixture will do one time setup before
- * all its testcases to set up a test db table, and then tear down these test
db artifacts after all testcases are run.
- *
- */
-public class TransactionTest {
-
- @BeforeClass
- public static void oneTimeSetup() {
- try (
- Connection conn = TransactionLegacy.getStandaloneConnection();
- PreparedStatement pstmt =
- conn.prepareStatement("CREATE TABLE `cloud`.`test` (" +
"`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT," + "`fld_int` int
unsigned,"
- + "`fld_long` bigint unsigned," + "`fld_string`
varchar(255)," + "PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT
CHARSET=utf8;");
- ) {
-
- pstmt.execute();
-
- } catch (SQLException e) {
- throw new CloudRuntimeException("Problem with sql", e);
- }
- }
-
- @Test
- /**
- * When a transaction is set to use user-managed db connection, for each
following db statement, we should see
- * that the same db connection is reused rather than acquiring a new one
each time in typical transaction model.
- */
- public void testUserManagedConnection() {
- DbTestDao testDao = ComponentContext.inject(DbTestDao.class);
- TransactionLegacy txn =
TransactionLegacy.open("SingleConnectionThread");
- Connection conn = null;
- try {
- conn = TransactionLegacy.getStandaloneConnectionWithException();
- txn.transitToUserManagedConnection(conn);
- // try two SQLs to make sure that they are using the same
connection
- // acquired above.
- testDao.create(1, 1, "Record 1");
- Connection checkConn =
TransactionLegacy.currentTxn().getConnection();
- if (checkConn != conn) {
- Assert.fail("A new db connection is acquired instead of using
old one after create sql");
- }
- testDao.update(2, 2, "Record 1");
- Connection checkConn2 =
TransactionLegacy.currentTxn().getConnection();
- if (checkConn2 != conn) {
- Assert.fail("A new db connection is acquired instead of using
old one after update sql");
- }
- } catch (SQLException e) {
- Assert.fail(e.getMessage());
- } finally {
- txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
- txn.close();
-
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException e) {
- throw new CloudRuntimeException("Problem with close db
connection", e);
- }
- }
- }
- }
-
- @Test
- /**
- * This test is simulating ClusterHeartBeat process, where the same
transaction and db connection is reused.
- */
- public void testTransactionReuse() {
- DbTestDao testDao = ComponentContext.inject(DbTestDao.class);
- // acquire a db connection and keep it
- Connection conn = null;
- try {
- conn = TransactionLegacy.getStandaloneConnectionWithException();
- } catch (SQLException ex) {
- throw new CloudRuntimeException("Problem with getting db
connection", ex);
- }
-
- // start heartbeat loop, make sure that each loop still use the same
- // connection
- TransactionLegacy txn = null;
- for (int i = 0; i < 3; i++) {
- txn = TransactionLegacy.open("HeartbeatSimulator");
- try {
-
- txn.transitToUserManagedConnection(conn);
- testDao.create(i, i, "Record " + i);
- Connection checkConn =
TransactionLegacy.currentTxn().getConnection();
- if (checkConn != conn) {
- Assert.fail("A new db connection is acquired instead of
using old one in loop " + i);
- }
- } catch (SQLException e) {
- Assert.fail(e.getMessage());
- } finally {
- txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
- txn.close();
- }
- }
- // close the connection once we are done since we are managing db
- // connection ourselves.
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException e) {
- throw new CloudRuntimeException("Problem with close db
connection", e);
- }
- }
- }
-
- @After
- /**
- * Delete all records after each test, but table is still kept
- */
- public void tearDown() {
- try (
- Connection conn = TransactionLegacy.getStandaloneConnection();
- PreparedStatement pstmt = conn.prepareStatement("truncate
table `cloud`.`test`");
- ) {
- pstmt.execute();
- } catch (SQLException e) {
- throw new CloudRuntimeException("Problem with sql", e);
- }
- }
-
- @AfterClass
- public static void oneTimeTearDown() {
- try (
- Connection conn = TransactionLegacy.getStandaloneConnection();
- PreparedStatement pstmt = conn.prepareStatement("DROP TABLE IF
EXISTS `cloud`.`test`");
- ) {
- pstmt.execute();
- } catch (SQLException e) {
- throw new CloudRuntimeException("Problem with sql", e);
- }
- }
-}
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> CloudStack MySQL HA problem -- No database selected
> ---------------------------------------------------
>
> Key: CLOUDSTACK-10195
> URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10195
> Project: CloudStack
> Issue Type: Bug
> Security Level: Public(Anyone can view this level - this is the
> default.)
> Affects Versions: 4.9.0, 4.9.2.0, 4.9.3.0
> Reporter: Rafael Weingärtner
> Assignee: Rafael Weingärtner
> Priority: Minor
>
> When using CloudStack with database HA configuration user receives warnings
> constantly saying “No database selected”.
> This problem happens at
> com.cloud.cluster.ClusterManagerImpl.getHeartbeatTask().new
> ManagedContextRunnable() {...}.runInContext(), line 550. The scheme of the
> database is not properly set in the transaction when database HA options are
> enabled.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)