From 6be57ae7e6650138678342502fe0a70ffc932f14 Mon Sep 17 00:00:00 2001 From: Jarek Jarcec Cecho Date: Thu, 24 Sep 2015 12:57:04 -0700 Subject: [PATCH] SQOOP-2588: Sqoop2: CommonRepositoryHandler#inUseLink only check if link is used in the from side of a job (Dian Fu via Jarek Jarcec Cecho) --- .../repository/common/CommonRepositoryHandler.java | 1 + ...ommonRepositoryInsertUpdateDeleteSelectQuery.java | 12 +++++++++--- .../apache/sqoop/repository/derby/DerbyTestCase.java | 2 +- .../sqoop/repository/derby/TestLinkHandling.java | 2 ++ .../repository/mysql/TestLinkHandling.java | 8 ++++++-- .../repository/postgresql/TestLinkHandling.java | 4 +++- 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java index 9c45fe76..1b0caf7d 100644 --- a/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java +++ b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryHandler.java @@ -448,6 +448,7 @@ public boolean inUseLink(String linkName, Connection conn) { try (PreparedStatement stmt = conn.prepareStatement(crudQueries.getStmtSelectJobsForLinkCheck())) { stmt.setString(1, linkName); + stmt.setString(2, linkName); try (ResultSet rs = stmt.executeQuery()) { // Should be always valid in case of count(*) query diff --git a/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryInsertUpdateDeleteSelectQuery.java b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryInsertUpdateDeleteSelectQuery.java index aa872ab5..144b0025 100644 --- a/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryInsertUpdateDeleteSelectQuery.java +++ b/repository/repository-common/src/main/java/org/apache/sqoop/repository/common/CommonRepositoryInsertUpdateDeleteSelectQuery.java @@ -397,12 +397,18 @@ public class CommonRepositoryInsertUpdateDeleteSelectQuery { // DML: Check if there are jobs for given link private static final String STMT_SELECT_JOBS_FOR_LINK_CHECK = - "SELECT" - + " count(*)" + "SELECT SUM(CNT) FROM (" + + " SELECT count(*) as CNT" + " FROM " + CommonRepoUtils.getTableName(SCHEMA_SQOOP, TABLE_SQ_JOB_NAME) + " INNER JOIN " + CommonRepoUtils.getTableName(SCHEMA_SQOOP, TABLE_SQ_LINK_NAME) + " ON " + CommonRepoUtils.escapeColumnName(COLUMN_SQB_FROM_LINK) + " = " + CommonRepoUtils.escapeColumnName(COLUMN_SQ_LNK_ID) - + " WHERE " + CommonRepoUtils.escapeColumnName(COLUMN_SQ_LNK_NAME) + " = ? "; + + " WHERE " + CommonRepoUtils.escapeColumnName(COLUMN_SQ_LNK_NAME) + " = ? " + + " UNION ALL" + + " SELECT count(*) as CNT" + + " FROM " + CommonRepoUtils.getTableName(SCHEMA_SQOOP, TABLE_SQ_JOB_NAME) + + " INNER JOIN " + CommonRepoUtils.getTableName(SCHEMA_SQOOP, TABLE_SQ_LINK_NAME) + + " ON " + CommonRepoUtils.escapeColumnName(COLUMN_SQB_TO_LINK) + " = " + CommonRepoUtils.escapeColumnName(COLUMN_SQ_LNK_ID) + + " WHERE " + CommonRepoUtils.escapeColumnName(COLUMN_SQ_LNK_NAME) + " = ? ) as JOB_COUNT"; //DML: Select all jobs private static final String STMT_SELECT_JOB_ALL = diff --git a/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java b/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java index cd4c76c7..5fd510df 100644 --- a/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java +++ b/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java @@ -668,7 +668,7 @@ public void loadJobs(int version) throws Exception { case 7: for (String name : new String[] { "JA", "JB", "JC", "JD" }) { runQuery("INSERT INTO SQOOP.SQ_JOB(SQB_NAME, SQB_FROM_LINK, SQB_TO_LINK)" + " VALUES('" - + name + index + "', 1, 1)"); + + name + index + "', 1, 2)"); } // Odd IDs inputs have values diff --git a/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/TestLinkHandling.java b/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/TestLinkHandling.java index 40bac8bd..e6cb9fb3 100644 --- a/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/TestLinkHandling.java +++ b/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/TestLinkHandling.java @@ -210,10 +210,12 @@ public void testInUseLink() throws Exception { loadLinksForLatestVersion(); assertFalse(handler.inUseLink("CA", getDerbyDatabaseConnection())); + assertFalse(handler.inUseLink("CB", getDerbyDatabaseConnection())); loadJobsForLatestVersion(); assertTrue(handler.inUseLink("CA", getDerbyDatabaseConnection())); + assertTrue(handler.inUseLink("CB", getDerbyDatabaseConnection())); } @Test diff --git a/repository/repository-mysql/src/test/java/org/apache/sqoop/integration/repository/mysql/TestLinkHandling.java b/repository/repository-mysql/src/test/java/org/apache/sqoop/integration/repository/mysql/TestLinkHandling.java index 72fa981c..db171240 100644 --- a/repository/repository-mysql/src/test/java/org/apache/sqoop/integration/repository/mysql/TestLinkHandling.java +++ b/repository/repository-mysql/src/test/java/org/apache/sqoop/integration/repository/mysql/TestLinkHandling.java @@ -217,16 +217,20 @@ public void testInUseLink() throws Exception { // Create job and submission and make that job in use to make sure link is // in use. MLink linkA = handler.findLink(LINK_A_NAME, provider.getConnection()); + MLink linkB = handler.findLink(LINK_B_NAME, provider.getConnection()); MJob job = getJob("Job-A", handler.findConnector("A", provider.getConnection()), - handler.findConnector("B", provider.getConnection()), linkA, - handler.findLink(LINK_B_NAME, provider.getConnection())); + handler.findConnector("B", provider.getConnection()), + linkA, + linkB); handler.createJob(job, provider.getConnection()); MSubmission submission = getSubmission(job, SubmissionStatus.RUNNING); handler.createSubmission(submission, provider.getConnection()); assertTrue(handler.inUseLink(linkA.getName(), provider.getConnection())); + assertTrue(handler.inUseLink(linkB.getName(), + provider.getConnection())); } @Test diff --git a/repository/repository-postgresql/src/test/java/org/apache/sqoop/integration/repository/postgresql/TestLinkHandling.java b/repository/repository-postgresql/src/test/java/org/apache/sqoop/integration/repository/postgresql/TestLinkHandling.java index 498f18f8..24de195c 100644 --- a/repository/repository-postgresql/src/test/java/org/apache/sqoop/integration/repository/postgresql/TestLinkHandling.java +++ b/repository/repository-postgresql/src/test/java/org/apache/sqoop/integration/repository/postgresql/TestLinkHandling.java @@ -212,16 +212,18 @@ public void testInUseLink() throws Exception { // Create job and submission and make that job in use to make sure link is in use. MLink linkA = handler.findLink(LINK_A_NAME, provider.getConnection()); + MLink linkB = handler.findLink(LINK_B_NAME, provider.getConnection()); MJob job = getJob("Job-A", handler.findConnector("A", provider.getConnection()), handler.findConnector("B", provider.getConnection()), linkA, - handler.findLink(LINK_B_NAME, provider.getConnection())); + linkB); handler.createJob(job, provider.getConnection()); MSubmission submission = getSubmission(job, SubmissionStatus.RUNNING); handler.createSubmission(submission, provider.getConnection()); assertTrue(handler.inUseLink(linkA.getName(), provider.getConnection())); + assertTrue(handler.inUseLink(linkB.getName(), provider.getConnection())); } @Test