You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2019/05/14 18:15:36 UTC

svn commit: r1859242 - in /uima/uima-ducc/trunk: src/main/admin/ uima-ducc-database/src/main/java/org/apache/uima/ducc/database/

Author: degenaro
Date: Tue May 14 18:15:36 2019
New Revision: 1859242

URL: http://svn.apache.org/viewvc?rev=1859242&view=rev
Log:
UIMA-6033 quiesced column not created when extending from older DUCC DB restore.

Added:
    uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUpdate.java   (with props)
Modified:
    uima/uima-ducc/trunk/src/main/admin/db_util.py
    uima/uima-ducc/trunk/src/main/admin/start_ducc
    uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java

Modified: uima/uima-ducc/trunk/src/main/admin/db_util.py
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/src/main/admin/db_util.py?rev=1859242&r1=1859241&r2=1859242&view=diff
==============================================================================
--- uima/uima-ducc/trunk/src/main/admin/db_util.py (original)
+++ uima/uima-ducc/trunk/src/main/admin/db_util.py Tue May 14 18:15:36 2019
@@ -205,3 +205,12 @@ def configure_database(DUCC_HOME, DUCC_H
     if( db_autostart ):
         stop_database(pidfile)
     return ret
+
+def update_database(DUCC_HOME, jvm):    
+    CMD = [jvm, '-DDUCC_HOME=' + DUCC_HOME, 'org.apache.uima.ducc.database.DbUpdate']
+    CMD = ' '.join(CMD)
+    if ( execute(CMD) != 0 ):
+        print 'Database schema update failure.'
+    #else:
+    #    print 'Database schema update success.'
+    

Modified: uima/uima-ducc/trunk/src/main/admin/start_ducc
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/src/main/admin/start_ducc?rev=1859242&r1=1859241&r2=1859242&view=diff
==============================================================================
--- uima/uima-ducc/trunk/src/main/admin/start_ducc (original)
+++ uima/uima-ducc/trunk/src/main/admin/start_ducc Tue May 14 18:15:36 2019
@@ -34,6 +34,8 @@ from ducc        import Ducc
 from ducc_util import ThreadPool
 from ducc_base import find_ducc_home
 
+import db_util as dbu
+
 class StartDucc(DuccUtil):
 
     def __init__(self):
@@ -369,6 +371,7 @@ class StartDucc(DuccUtil):
                     node = self.get_db_host()
                     com = 'database'
                     self.db_acct_start(node,com)
+                    dbu.update_database(self.DUCC_HOME, self.jvm)
                 except Exception (e):
                     # print e
                     print sys.exc_info()[0], "Can't start the database."

Added: uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUpdate.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUpdate.java?rev=1859242&view=auto
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUpdate.java (added)
+++ uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUpdate.java Tue May 14 18:15:36 2019
@@ -0,0 +1,199 @@
+/*
+ * 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
+ * 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.
+*/
+
+package org.apache.uima.ducc.database;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.uima.ducc.common.utils.DuccLogger;
+
+import com.datastax.driver.core.AuthProvider;
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.PlainTextAuthProvider;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.SimpleStatement;
+import com.datastax.driver.core.exceptions.InvalidQueryException;
+
+/**
+ * The purpose of this class is to update the DB with additions for newer versions of DUCC.
+ * 
+ * For example, when upgrading from DUCC 2.2.2 to 3.0.0 the new column "quiesced" needs to
+ * be added to the rmnodes table.  The methodology is to call the RmStatePersistence class to
+ * get an alter statement, and execute it against the "old" database in order to modernize it.
+ * If installing 3.0.0, the column is already there.  Adding the column more than once is harmless.
+ * 
+ * This code was originally designed to be called by start_ducc whenever the database is started.
+ */
+public class DbUpdate
+{
+	private DuccLogger logger = null;
+	
+	public static final String DUCC_KEYSPACE = "ducc";
+	public static final String DUCC_DATABASE_USER = "ducc";
+	
+	private String ducc_home = System.getProperty("DUCC_HOME");
+	private String ducc_properties = Paths.get(ducc_home,"resources","ducc.properties").toString();
+	private String ducc_private_properties = Paths.get(ducc_home,"resources.private","ducc.private.properties").toString();
+	
+	public DbUpdate() {
+		if (ducc_home == null) {
+            throw new IllegalStateException("DUCC_HOME must be set as a system property: -DDUCC_HOME=whatever");
+        }
+	}
+	
+	public Properties getDuccProperties(String filePath) {
+		Properties properties = null;
+		try {
+			File file = new File(filePath);
+			FileInputStream fis = new FileInputStream(file);
+			properties = new Properties();
+			properties.load(fis);
+			fis.close();
+		}
+		catch (FileNotFoundException e) {
+			throw new IllegalStateException(e);
+		} 
+		catch (IOException e) {
+			throw new IllegalStateException(e);
+		}
+		return properties;
+	}
+	
+	private String getDbUser(Properties properties) {
+		String retVal = null;
+		String key = "ducc.database.user";
+		retVal = properties.getProperty(key);
+		if(retVal == null) {
+			retVal = DUCC_DATABASE_USER;
+		}
+		return retVal;
+	}
+	
+	private String getDbHost(Properties properties) {
+		String retVal = null;
+		String key = "ducc.database.host";
+		retVal = properties.getProperty(key);
+		return retVal;
+	}
+	
+	private String getDbHostList(Properties properties) {
+		String retVal = null;
+		String key = "ducc.database.host.list";
+		retVal = properties.getProperty(key);
+		if(retVal == null) {
+			retVal = getDbHost(properties);
+		}
+		return retVal;
+	}
+	
+	private String getDbPw(Properties properties) {
+		String retVal = null;
+		String key = "db_password";
+		retVal = properties.getProperty(key);
+		return retVal;
+	}
+	
+	private void updateDb(Session session) {
+		updateDb(session, RmStatePersistence.getAlterList());
+	}
+	
+	private void updateDb(Session session, List<SimpleStatement> list) {
+		String location = "updateDb";
+		for ( SimpleStatement s : list ) {
+            doLog(location, "EXECUTE STATEMENT:", s.toString());
+            try {
+            	session.execute(s);
+            }
+            catch(InvalidQueryException e) {
+            	String cause = e.getMessage();
+            	if(cause.contains("conflicts with an existing column")) {
+            		//OK
+            	}
+            	else {
+            		throw e;
+            	}
+            }
+        }
+	}
+
+	private void doLog(String methodName, Object ... msg) {      
+		if ( logger == null ) {
+			StringBuffer buf = new StringBuffer(methodName);
+			for ( Object o : msg ) {
+				buf.append(" ");
+				if ( o == null ) {
+					buf.append("<null>");
+				} 
+				else {
+					buf.append(o.toString());
+				} 
+			}            
+			System.out.println(buf);
+		} 
+		else {
+			logger.info(methodName, null, msg);
+			return;
+		}
+	}
+	
+	public void update() {
+		Properties propsPublic = getDuccProperties(ducc_properties);
+		Properties propsPrivate = getDuccProperties(ducc_private_properties);
+		String ducc_db_user = getDbUser(propsPublic);
+		String ducc_db_host_list = getDbHostList(propsPublic);
+		String[] ducc_db_host_array = (String[])(Arrays.asList(ducc_db_host_list.split("\\s+")).toArray());
+		String ducc_db_pw = getDbPw(propsPrivate);
+		//System.out.println(ducc_db_host_list);
+		//System.out.println(ducc_db_user);
+		//System.out.println(ducc_db_pw);
+		AuthProvider auth = new PlainTextAuthProvider(ducc_db_user, ducc_db_pw);
+		Cluster cluster = Cluster.builder()
+                .withAuthProvider(auth)
+                .addContactPoints(ducc_db_host_array)
+                .build();
+		Session session = cluster.connect();
+		session.execute("USE " + DUCC_KEYSPACE);
+		updateDb(session);
+		session.close();
+		cluster.close();
+	}
+	
+    public static void main(String[] args)
+    {
+        int rc = 0;
+    	try {
+        	DbUpdate dbAlter = new DbUpdate();
+        	dbAlter.update();
+        } 
+        catch ( Throwable e ) {
+            System.out.println("Errors altering database");
+            e.printStackTrace();
+            rc = 1;
+        } 
+        System.exit(rc);
+    }
+
+}

Propchange: uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUpdate.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java?rev=1859242&r1=1859241&r2=1859242&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/RmStatePersistence.java Tue May 14 18:15:36 2019
@@ -139,6 +139,18 @@ public class RmStatePersistence
         } 
     }
 
+    /*
+     * Alter is used to update table in older DUCCs.
+     * The "quiesced" column was added in DUCC 3.0.0.
+     */
+    public static List<SimpleStatement> getAlterList() {
+    	List<SimpleStatement> list = new ArrayList<SimpleStatement>();
+    	StringBuffer sb;
+    	sb = new StringBuffer("ALTER TABLE " + RM_NODE_TABLE + " ADD "+"quiesced"+" "+"boolean");
+    	list.add(new SimpleStatement(sb.toString()));
+    	return list;
+    }
+    
     static List<SimpleStatement> mkSchema()
     	throws Exception
     {