You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by rk...@apache.org on 2016/10/04 19:29:24 UTC
[2/2] oozie git commit: Revert "OOZIE-2245 Service to periodically
check database schema (rkanter)"
Revert "OOZIE-2245 Service to periodically check database schema (rkanter)"
This reverts commit 9839fb292e5483f4d101849483109208de75f9c3.
Conflicts:
release-log.txt
Project: http://git-wip-us.apache.org/repos/asf/oozie/repo
Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/5a75844f
Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/5a75844f
Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/5a75844f
Branch: refs/heads/branch-4.3
Commit: 5a75844f44839d4e2087afd89dbd008ece1b73fc
Parents: 671142f
Author: Robert Kanter <rk...@cloudera.com>
Authored: Tue Oct 4 12:29:00 2016 -0700
Committer: Robert Kanter <rk...@cloudera.com>
Committed: Tue Oct 4 12:29:00 2016 -0700
----------------------------------------------------------------------
.../oozie/command/SchemaCheckXCommand.java | 529 -------------------
.../oozie/service/SchemaCheckerService.java | 125 -----
core/src/main/resources/oozie-default.xml | 21 +-
docs/src/site/twiki/AG_Monitoring.twiki | 26 -
release-log.txt | 1 -
5 files changed, 1 insertion(+), 701 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/oozie/blob/5a75844f/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java b/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
deleted file mode 100644
index 1cc086e..0000000
--- a/core/src/main/java/org/apache/oozie/command/SchemaCheckXCommand.java
+++ /dev/null
@@ -1,529 +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
- * 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.oozie.command;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.oozie.BinaryBlob;
-import org.apache.oozie.BundleActionBean;
-import org.apache.oozie.BundleJobBean;
-import org.apache.oozie.CoordinatorActionBean;
-import org.apache.oozie.CoordinatorJobBean;
-import org.apache.oozie.SLAEventBean;
-import org.apache.oozie.StringBlob;
-import org.apache.oozie.WorkflowActionBean;
-import org.apache.oozie.WorkflowJobBean;
-import org.apache.oozie.client.rest.JsonBean;
-import org.apache.oozie.client.rest.JsonSLAEvent;
-import org.apache.oozie.service.SchemaCheckerService;
-import org.apache.oozie.service.Services;
-import org.apache.oozie.sla.SLARegistrationBean;
-import org.apache.oozie.sla.SLASummaryBean;
-import org.apache.oozie.util.Pair;
-import org.apache.oozie.util.XLog;
-import org.apache.openjpa.persistence.jdbc.Index;
-
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.Table;
-import java.lang.reflect.Field;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public class SchemaCheckXCommand extends XCommand<Void> {
- private XLog LOG = XLog.getLog(SchemaCheckXCommand.class);
-
- private String dbType;
- private String url;
- private String user;
- private String pass;
- private boolean ignoreExtras;
-
- public SchemaCheckXCommand(String dbType, String url, String user, String pass, boolean ignoreExtras) {
- super("schema-check", "schema-check", 0);
- this.dbType = dbType;
- this.url = url;
- this.user = user;
- this.pass = pass;
- this.ignoreExtras = ignoreExtras;
- }
-
- @Override
- protected Void execute() throws CommandException {
- Connection conn = null;
- LOG.info("About to check database schema");
- Date startTime = new Date();
- boolean problem = false;
- try {
- conn = DriverManager.getConnection(url, user, pass);
- String catalog = conn.getCatalog();
- DatabaseMetaData metaData = conn.getMetaData();
-
- Map<String, Class<? extends JsonBean>> tableClasses = new HashMap<String, Class<? extends JsonBean>>();
- tableClasses.put(getTableName(BundleActionBean.class), BundleActionBean.class);
- tableClasses.put(getTableName(BundleJobBean.class), BundleJobBean.class);
- tableClasses.put(getTableName(CoordinatorActionBean.class), CoordinatorActionBean.class);
- tableClasses.put(getTableName(CoordinatorJobBean.class), CoordinatorJobBean.class);
- tableClasses.put(getTableName(JsonSLAEvent.class), JsonSLAEvent.class);
- tableClasses.put(getTableName(SLARegistrationBean.class), SLARegistrationBean.class);
- tableClasses.put(getTableName(SLASummaryBean.class), SLASummaryBean.class);
- tableClasses.put(getTableName(WorkflowActionBean.class), WorkflowActionBean.class);
- tableClasses.put(getTableName(WorkflowJobBean.class), WorkflowJobBean.class);
-
- boolean tableProblem = checkTables(metaData, catalog, tableClasses.keySet());
- problem = problem | tableProblem;
- if (!tableProblem) {
- for (Map.Entry<String, Class<? extends JsonBean>> table : tableClasses.entrySet()) {
- TableInfo ti = new TableInfo(table.getValue(), dbType);
- boolean columnProblem = checkColumns(metaData, catalog, table.getKey(), ti.columnTypes);
- problem = problem | columnProblem;
- if (!columnProblem) {
- boolean primaryKeyProblem = checkPrimaryKey(metaData, catalog, table.getKey(), ti.primaryKeyColumn);
- problem = problem | primaryKeyProblem;
- boolean indexProblem = checkIndexes(metaData, catalog, table.getKey(), ti.indexedColumns);
- problem = problem | indexProblem;
- }
- }
- }
- if (problem) {
- LOG.error("Database schema is BAD! Check previous error log messages for details");
- } else {
- LOG.info("Database schema is GOOD");
- }
- } catch (SQLException sqle) {
- LOG.error("An Exception occured while talking to the database: " + sqle.getMessage(), sqle);
- problem = true;
- } finally {
- if (conn != null) {
- try {
- conn.close();
- } catch (Exception e) {
- LOG.error("An Exception occured while disconnecting from the database: " + e.getMessage(), e);
- }
- }
- Services.get().get(SchemaCheckerService.class).updateInstrumentation(problem, startTime);
- }
- return null;
- }
-
- private boolean checkTables(DatabaseMetaData metaData, String catalog, final Collection<String> expectedTablesRaw)
- throws SQLException {
- boolean problem = false;
- Set<String> expectedTables = new HashSet<String>(expectedTablesRaw);
- expectedTables.add(caseTableName("oozie_sys"));
- expectedTables.add(caseTableName("openjpa_sequence_table"));
- expectedTables.add(caseTableName("validate_conn"));
- // Oracle returns > 1000 tables if we don't have the schema "OOZIE"; MySQL and Postgres don't want this
- String schema = null;
- if (dbType.equals("oracle")) {
- schema = "OOZIE";
- }
- ResultSet rs = metaData.getTables(catalog, schema, null, new String[]{"TABLE"});
- Set<String> foundTables = new HashSet<String>();
- while (rs.next()) {
- String tabName = rs.getString("TABLE_NAME");
- if (tabName != null) {
- foundTables.add(tabName);
- }
- }
- Collection missingTables = CollectionUtils.subtract(expectedTables, foundTables);
- if (!missingTables.isEmpty()) {
- LOG.error("Found [{0}] missing tables: {1}", missingTables.size(), Arrays.toString(missingTables.toArray()));
- problem = true;
- } else if (LOG.isDebugEnabled()) {
- LOG.debug("No missing tables found: {0}", Arrays.toString(expectedTables.toArray()));
- }
- if (!ignoreExtras) {
- Collection extraTables = CollectionUtils.subtract(foundTables, expectedTables);
- if (!extraTables.isEmpty()) {
- LOG.error("Found [{0}] extra tables: {1}", extraTables.size(), Arrays.toString(extraTables.toArray()));
- problem = true;
- } else {
- LOG.debug("No extra tables found");
- }
- }
- return problem;
- }
-
- private boolean checkColumns(DatabaseMetaData metaData, String catalog, String table,
- Map<String, Integer> expectedColumnTypes) throws SQLException {
- boolean problem = false;
- Map<String, Pair<Integer, String>> foundColumns = new HashMap<String, Pair<Integer, String>>();
- ResultSet rs = metaData.getColumns(catalog, null, table, null);
- while (rs.next()) {
- String colName = rs.getString("COLUMN_NAME");
- Integer dataType = rs.getInt("DATA_TYPE");
- String colDef = rs.getString("COLUMN_DEF");
- if (colName != null) {
- foundColumns.put(colName, new Pair<Integer, String>(dataType, colDef));
- }
- }
- Collection missingColumns = CollectionUtils.subtract(expectedColumnTypes.keySet(), foundColumns.keySet());
- if (!missingColumns.isEmpty()) {
- LOG.error("Found [{0}] missing columns in table [{1}]: {2}",
- missingColumns.size(), table, Arrays.toString(missingColumns.toArray()));
- problem = true;
- } else {
- for (Map.Entry<String, Integer> ent : expectedColumnTypes.entrySet()) {
- if (!foundColumns.get(ent.getKey()).getFist().equals(ent.getValue())) {
- LOG.error("Expected column [{0}] in table [{1}] to have type [{2}], but found type [{3}]",
- ent.getKey(), table, getSQLTypeFromInt(ent.getValue()),
- getSQLTypeFromInt(foundColumns.get(ent.getKey()).getFist()));
- problem = true;
- } else if (foundColumns.get(ent.getKey()).getSecond() != null) {
- LOG.error("Expected column [{0}] in table [{1}] to have default value [NULL], but found default vale [{2}]",
- ent.getKey(), table, foundColumns.get(ent.getKey()).getSecond());
- problem = true;
- } else {
- LOG.debug("Found column [{0}] in table [{1}] with type [{2}] and default value [NULL]",
- ent.getKey(), table, getSQLTypeFromInt(ent.getValue()));
- }
- }
- }
- if (!ignoreExtras) {
- Collection extraColumns = CollectionUtils.subtract(foundColumns.keySet(), expectedColumnTypes.keySet());
- if (!extraColumns.isEmpty()) {
- LOG.error("Found [{0}] extra columns in table [{1}]: {2}",
- extraColumns.size(), table, Arrays.toString(extraColumns.toArray()));
- problem = true;
- } else {
- LOG.debug("No extra columns found in table [{0}]", table);
- }
- }
- return problem;
- }
-
- private boolean checkPrimaryKey(DatabaseMetaData metaData, String catalog, String table, String expectedPrimaryKeyColumn)
- throws SQLException {
- boolean problem = false;
- ResultSet rs = metaData.getPrimaryKeys(catalog, null, table);
- if (!rs.next()) {
- LOG.error("Expected column [{0}] to be the primary key in table [{1}], but none were found",
- expectedPrimaryKeyColumn, table);
- problem = true;
- } else {
- String foundPrimaryKeyColumn = rs.getString("COLUMN_NAME");
- if (!foundPrimaryKeyColumn.equals(expectedPrimaryKeyColumn)) {
- LOG.error("Expected column [{0}] to be the primary key in table [{1}], but found column [{2}] instead",
- expectedPrimaryKeyColumn, table, foundPrimaryKeyColumn);
- problem = true;
- } else {
- LOG.debug("Found column [{0}] to be the primary key in table [{1}]", expectedPrimaryKeyColumn, table);
- }
- }
- return problem;
- }
-
- private boolean checkIndexes(DatabaseMetaData metaData, String catalog, String table, Set<String> expectedIndexedColumns)
- throws SQLException {
- boolean problem = false;
- Set<String> foundIndexedColumns = new HashSet<String>();
- ResultSet rs = metaData.getIndexInfo(catalog, null, table, false, true);
- while (rs.next()) {
- String colName = rs.getString("COLUMN_NAME");
- if (colName != null) {
- foundIndexedColumns.add(colName);
- }
- }
- Collection missingIndexColumns = CollectionUtils.subtract(expectedIndexedColumns, foundIndexedColumns);
- if (!missingIndexColumns.isEmpty()) {
- LOG.error("Found [{0}] missing indexes for columns in table [{1}]: {2}",
- missingIndexColumns.size(), table, Arrays.toString(missingIndexColumns.toArray()));
- problem = true;
- } else {
- if (LOG.isDebugEnabled()) {
- LOG.debug("No missing indexes found in table [{0}]: {1}",
- table, Arrays.toString(expectedIndexedColumns.toArray()));
- }
- }
- if (!ignoreExtras) {
- Collection extraIndexColumns = CollectionUtils.subtract(foundIndexedColumns, expectedIndexedColumns);
- if (!extraIndexColumns.isEmpty()) {
- LOG.error("Found [{0}] extra indexes for columns in table [{1}]: {2}",
- extraIndexColumns.size(), table, Arrays.toString(extraIndexColumns.toArray()));
- problem = true;
- } else {
- LOG.debug("No extra indexes found in table [{0}]", table);
- }
- }
- return problem;
- }
-
- private String getTableName(Class<? extends JsonBean> clazz) {
- Table tabAnn = clazz.getAnnotation(Table.class);
- if (tabAnn != null) {
- return caseTableName(tabAnn.name());
- }
- return null;
- }
-
- private String caseTableName(String name) {
- // MySQL and Oracle wants table names in all caps
- if (dbType.equals("mysql") || dbType.equals("oracle")) {
- return name.toUpperCase();
- }
- // Postgres wants table names in all lowers
- if (dbType.equals("postgresql")) {
- return name.toLowerCase();
- }
- return name;
- }
-
- private String getSQLTypeFromInt(int t) {
- switch (t) {
- case Types.BIT:
- return "BIT";
- case Types.TINYINT:
- return "TINYINT";
- case Types.SMALLINT:
- return "SMALLINT";
- case Types.INTEGER:
- return "INTEGER";
- case Types.BIGINT:
- return "BIGINT";
- case Types.FLOAT:
- return "FLOAT";
- case Types.REAL:
- return "REAL";
- case Types.DOUBLE:
- return "DOUBLE";
- case Types.NUMERIC:
- return "NUMERIC";
- case Types.DECIMAL:
- return "DECIMAL";
- case Types.CHAR:
- return "CHAR";
- case Types.VARCHAR:
- return "VARCHAR";
- case Types.LONGVARCHAR:
- return "LONGVARCHAR";
- case Types.DATE:
- return "DATE";
- case Types.TIME:
- return "TIME";
- case Types.TIMESTAMP:
- return "TIMESTAMP";
- case Types.BINARY:
- return "BINARY";
- case Types.VARBINARY:
- return "VARBINARY";
- case Types.LONGVARBINARY:
- return "LONGVARBINARY";
- case Types.NULL:
- return "NULL";
- case Types.OTHER:
- return "OTHER";
- case Types.JAVA_OBJECT:
- return "JAVA_OBJECT";
- case Types.DISTINCT:
- return "DISTINCT";
- case Types.STRUCT:
- return "STRUCT";
- case Types.ARRAY:
- return "ARRAY";
- case Types.BLOB:
- return "BLOB";
- case Types.CLOB:
- return "CLOB";
- case Types.REF:
- return "REF";
- case Types.DATALINK:
- return "DATALINK";
- case Types.BOOLEAN:
- return "BOOLEAN";
- case Types.ROWID:
- return "ROWID";
- case Types.NCHAR:
- return "NCHAR";
- case Types.NVARCHAR:
- return "NVARCHAR";
- case Types.LONGNVARCHAR:
- return "LONGNVARCHAR";
- case Types.NCLOB:
- return "NCLOB";
- case Types.SQLXML:
- return "SQLXML";
- default:
- return "unknown";
- }
- }
-
- private static class TableInfo {
- String primaryKeyColumn;
- Map<String, Integer> columnTypes;
- Set<String> indexedColumns;
-
- public TableInfo(Class<? extends JsonBean> clazz, String dbType) {
- columnTypes = new HashMap<String, Integer>();
- indexedColumns = new HashSet<String>();
- populate(clazz, dbType);
- // The "SLA_EVENTS" table is made up of two classes (JsonSLAEvent and SLAEventBean), and the reflection doesn't pick up
- // from both automatically, so we have to manually do this
- if (clazz.equals(JsonSLAEvent.class)) {
- populate(SLAEventBean.class, dbType);
- }
- }
-
- private void populate(Class<? extends JsonBean> clazz, String dbType) {
- Field[] fields = clazz.getDeclaredFields();
- for (Field field : fields) {
- Column colAnn = field.getAnnotation(Column.class);
- if (colAnn != null) {
- String name = caseColumnName(colAnn.name(), dbType);
- boolean isLob = (field.getAnnotation(Lob.class) != null);
- Integer type = getSQLType(field.getType(), isLob, dbType);
- columnTypes.put(name, type);
- boolean isIndex = (field.getAnnotation(Index.class) != null);
- if (isIndex) {
- indexedColumns.add(name);
- }
- boolean isPrimaryKey = (field.getAnnotation(Id.class) != null);
- if (isPrimaryKey) {
- indexedColumns.add(name);
- primaryKeyColumn = name;
- }
- } else {
- // Some Id fields don't have an @Column annotation
- Id idAnn = field.getAnnotation(Id.class);
- if (idAnn != null) {
- String name = caseColumnName(field.getName(), dbType);
- boolean isLob = (field.getAnnotation(Lob.class) != null);
- Integer type = getSQLType(field.getType(), isLob, dbType);
- columnTypes.put(name, type);
- indexedColumns.add(name);
- primaryKeyColumn = name;
- }
- }
- }
- DiscriminatorColumn discAnn = clazz.getAnnotation(DiscriminatorColumn.class);
- if (discAnn != null) {
- String name = caseColumnName(discAnn.name(), dbType);
- Integer type = getSQLType(discAnn.discriminatorType());
- columnTypes.put(name, type);
- indexedColumns.add(name);
- }
- // For some reason, MySQL doesn't end up having this index...
- if (dbType.equals("mysql") && clazz.equals(WorkflowActionBean.class)) {
- indexedColumns.remove("wf_id");
- }
- }
-
- private static Integer getSQLType(Class<?> clazz, boolean isLob, String dbType) {
- if (clazz.equals(String.class)) {
- if (dbType.equals("mysql") && isLob) {
- return Types.LONGVARCHAR;
- }
- if (dbType.equals("oracle") && isLob) {
- return Types.CLOB;
- }
- return Types.VARCHAR;
- }
- if (clazz.equals(StringBlob.class) || clazz.equals(BinaryBlob.class)) {
- if (dbType.equals("mysql")) {
- return Types.LONGVARBINARY;
- }
- if (dbType.equals("oracle")) {
- return Types.BLOB;
- }
- return Types.BINARY;
- }
- if (clazz.equals(Timestamp.class)) {
- return Types.TIMESTAMP;
- }
- if (clazz.equals(int.class)) {
- if (dbType.equals("oracle")) {
- return Types.DECIMAL;
- }
- return Types.INTEGER;
- }
- if (clazz.equals(long.class)) {
- if (dbType.equals("oracle")) {
- return Types.DECIMAL;
- }
- return Types.BIGINT;
- }
- if (clazz.equals(byte.class)) {
- if (dbType.equals("mysql")) {
- return Types.TINYINT;
- }
- if (dbType.equals("oracle")) {
- return Types.DECIMAL;
- }
- return Types.SMALLINT;
- }
- return null;
- }
-
- private static Integer getSQLType(DiscriminatorType discType) {
- switch (discType) {
- case STRING:
- return Types.VARCHAR;
- case CHAR:
- return Types.CHAR;
- case INTEGER:
- return Types.INTEGER;
- }
- return null;
- }
-
- private static String caseColumnName(String name, String dbType) {
- // Oracle wants column names in all caps
- if (dbType.equals("oracle")) {
- return name.toUpperCase();
- }
- // Postgres and MySQL want column names in all lowers
- if (dbType.equals("postgresql") || dbType.equals("mysql")) {
- return name.toLowerCase();
- }
- return name;
- }
- }
-
- @Override
- protected void loadState() throws CommandException {
- }
-
- @Override
- protected void verifyPrecondition() throws CommandException, PreconditionException {
- }
-
- @Override
- protected boolean isLockRequired() {
- return false;
- }
-
- @Override
- public String getEntityKey() {
- return null;
- }
-}
http://git-wip-us.apache.org/repos/asf/oozie/blob/5a75844f/core/src/main/java/org/apache/oozie/service/SchemaCheckerService.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/service/SchemaCheckerService.java b/core/src/main/java/org/apache/oozie/service/SchemaCheckerService.java
deleted file mode 100644
index 7fda9e2..0000000
--- a/core/src/main/java/org/apache/oozie/service/SchemaCheckerService.java
+++ /dev/null
@@ -1,125 +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
- * 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.oozie.service;
-
-import org.apache.oozie.ErrorCode;
-import org.apache.oozie.command.SchemaCheckXCommand;
-import org.apache.oozie.util.Instrumentable;
-import org.apache.oozie.util.Instrumentation;
-import org.apache.oozie.util.XLog;
-
-import java.util.Date;
-
-public class SchemaCheckerService implements Service, Instrumentable {
- private XLog LOG = XLog.getLog(SchemaCheckerService.class);
-
- public static final String CONF_PREFIX = Service.CONF_PREFIX + "SchemaCheckerService.";
- public static final String CONF_INTERVAL = CONF_PREFIX + "check.interval";
- public static final String CONF_IGNORE_EXTRAS = CONF_PREFIX + "ignore.extras";
-
- private String status = "N/A (not yet run)";
- private String lastCheck = "N/A";
-
- @Override
- public void init(Services services) throws ServiceException {
- String url = ConfigurationService.get(JPAService.CONF_URL);
- String dbType = url.substring("jdbc:".length());
- dbType = dbType.substring(0, dbType.indexOf(":"));
-
- int interval = ConfigurationService.getInt(CONF_INTERVAL);
- if (dbType.equals("derby") || dbType.equals("hsqldb") || dbType.equals("sqlserver") || interval <= 0) {
- LOG.debug("SchemaCheckerService is disabled: not supported for {0}", dbType);
- status = "DISABLED (" + dbType + " no supported)";
- } else {
- String driver = ConfigurationService.get(JPAService.CONF_DRIVER);
- String user = ConfigurationService.get(JPAService.CONF_USERNAME);
- String pass = ConfigurationService.get(JPAService.CONF_PASSWORD);
- boolean ignoreExtras = ConfigurationService.getBoolean(CONF_IGNORE_EXTRAS);
-
- try {
- Class.forName(driver).newInstance();
- } catch (Exception ex) {
- throw new ServiceException(ErrorCode.E0100, getClass().getName(), ex);
- }
- Runnable schemaCheckerRunnable = new SchemaCheckerRunnable(dbType, url, user, pass, ignoreExtras);
- services.get(SchedulerService.class).schedule(schemaCheckerRunnable, 0, interval, SchedulerService.Unit.HOUR);
- }
- }
-
- @Override
- public void destroy() {
- }
-
- @Override
- public Class<? extends Service> getInterface() {
- return SchemaCheckerService.class;
- }
-
- @Override
- public void instrument(Instrumentation instr) {
- instr.addVariable("schema-checker", "status", new Instrumentation.Variable<String>() {
- @Override
- public String getValue() {
- return status;
- }
- });
- instr.addVariable("schema-checker", "last-check", new Instrumentation.Variable<String>() {
- @Override
- public String getValue() {
- return lastCheck;
- }
- });
- }
-
- public void updateInstrumentation(boolean problem, Date time) {
- if (problem) {
- status = "BAD (check log for details)";
- } else {
- status = "GOOD";
- }
- lastCheck = time.toString();
- }
-
- static class SchemaCheckerRunnable implements Runnable {
- private String dbType;
- private String url;
- private String user;
- private String pass;
- private boolean ignoreExtras;
-
- public SchemaCheckerRunnable(String dbType, String url, String user, String pass, boolean ignoreExtras) {
- this.dbType = dbType;
- this.url = url;
- this.user = user;
- this.pass = pass;
- this.ignoreExtras = ignoreExtras;
- }
-
- @Override
- public void run() {// Only queue the schema check command if this is the leader
- if (Services.get().get(JobsConcurrencyService.class).isLeader()) {
- Services.get().get(CallableQueueService.class).queue(
- new SchemaCheckXCommand(dbType, url, user, pass, ignoreExtras));
- } else {
- Services.get().get(SchemaCheckerService.class).status = "DISABLED (not leader in HA)";
- Services.get().get(SchemaCheckerService.class).lastCheck = "N/A";
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/oozie/blob/5a75844f/core/src/main/resources/oozie-default.xml
----------------------------------------------------------------------
diff --git a/core/src/main/resources/oozie-default.xml b/core/src/main/resources/oozie-default.xml
index e71ebe3..b61f163 100644
--- a/core/src/main/resources/oozie-default.xml
+++ b/core/src/main/resources/oozie-default.xml
@@ -171,8 +171,7 @@
org.apache.oozie.service.ProxyUserService,
org.apache.oozie.service.XLogStreamingService,
org.apache.oozie.service.JvmPauseMonitorService,
- org.apache.oozie.service.SparkConfigurationService,
- org.apache.oozie.service.SchemaCheckerService
+ org.apache.oozie.service.SparkConfigurationService
</value>
<description>
All services to be created and managed by Oozie Services singleton.
@@ -2841,22 +2840,4 @@ will be the requeue interval for the actions which are waiting for a long time w
</description>
</property>
- <property>
- <name>oozie.service.SchemaCheckerService.check.interval</name>
- <value>168</value>
- <description>
- This is the interval at which Oozie will check the database schema, in hours.
- A zero or negative value will disable the checker.
- </description>
- </property>
-
- <property>
- <name>oozie.service.SchemaCheckerService.ignore.extras</name>
- <value>false</value>
- <description>
- When set to false, the schema checker will consider extra (unused) tables, columns, and indexes to be incorrect. When
- set to true, these will be ignored.
- </description>
- </property>
-
</configuration>
http://git-wip-us.apache.org/repos/asf/oozie/blob/5a75844f/docs/src/site/twiki/AG_Monitoring.twiki
----------------------------------------------------------------------
diff --git a/docs/src/site/twiki/AG_Monitoring.twiki b/docs/src/site/twiki/AG_Monitoring.twiki
index 2a3e9a0..63f0542 100644
--- a/docs/src/site/twiki/AG_Monitoring.twiki
+++ b/docs/src/site/twiki/AG_Monitoring.twiki
@@ -158,32 +158,6 @@ query parameters:
* threadsort - The order in which the threads are sorted for display. Valid values are name, cpu, state. Default is state.
* cpuwatch - Time interval in milliseconds to monitor cpu usage of threads. Default value is 0.
----++ Monitoring Database Schema Integrity
-
-Oozie stores all of its state in a database. Hence, ensuring that the database schema is correct is very important to ensuring that
-Oozie is healthy and behaves correctly. To help with this, Oozie includes a =SchemaCheckerService= which periodically runs and
-performs a series of checks on the database schema. More specifically, it checks the following:
- * Existence of the required tables
- * Existence of the required columns in each table
- * Each column has the correct type and default value
- * Existence of the required primary keys and indexes
-
-After each run, the =SchemaCheckerService= writes the result of the checks to the Oozie log and to the "schema-checker.status"
-instrumentation variable. If there's a problem, it will be logged at the ERROR level, while correct checks are logged at the DEBUG
-level.
-
-By default, the =SchemaCheckerService= runs every 7 days. This can be configured
-by =oozie.service.SchemaCheckerService.check.interval=
-
-By default, the =SchemaCheckerService= will consider "extra" tables, columns, and indexes to be incorrect. Advanced users who have
-added additional tables, columns, and indexes can tell Oozie to ignore these by
-seting =oozie.service.SchemaCheckerService.ignore.extras= to =false=.
-
-The =SchemaCheckerService= currently only supports MySQL, PostgreSQL, and Oracle databases. SQL Server and Derby are currently not
-supported.
-
-When Oozie HA is enabled, only one of the Oozie servers will perform the checks.
-
[[index][::Go back to Oozie Documentation Index::]]
</noautolink>
http://git-wip-us.apache.org/repos/asf/oozie/blob/5a75844f/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index 35cce80..4dcf2fb 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -190,7 +190,6 @@ OOZIE-2348 Recovery service keeps on recovering coord action of suspended jobs (
OOZIE-2277 Honor oozie.action.sharelib.for.spark in Spark jobs (rkanter)
OOZIE-2322 Oozie Web UI doesn't work with Kerberos in Internet Explorer 10 or 11 and curl (rkanter)
OOZIE-2343 Shell Action should take Oozie Action config and setup HADOOP_CONF_DIR (rkanter)
-OOZIE-2245 Service to periodically check database schema (rkanter)
OOZIE-2332 Add ability to provide Hive and Hive 2 Action queries inline in workflows (prateekrungta via rkanter)
OOZIE-2329 Make handling yarn restarts configurable (puru)
OOZIE-2228 Statustransit service doesn't pick bundle with suspend status (puru)