Uploaded image for project: 'Ambari'
  1. Ambari
  2. AMBARI-18296

Database Consistency Check Fails With NPE With Missing Service From Stack

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 2.4.0
    • Fix Version/s: trunk, 2.4.1, 2.5.0, 2.4.2
    • Component/s: ambari-server
    • Labels:
      None

      Description

      The database consistency checker can fail if a service configuration exists for a service which is no longer on the current stack:

      2016-08-31 21:52:28,082 INFO - ******************************* Check database started ******************************* 2016-08-31 21:52:31,647 INFO - Checking for configs not mapped to any cluster 2016-08-31 21:52:31,653 INFO - Checking for configs selected more than once 2016-08-31 21:52:31,655 INFO - Checking for hosts without state 2016-08-31 21:52:31,657 INFO - Checking host component states count equals host component desired states count 2016-08-31 21:52:31,660 INFO - Checking services and their configs 2016-08-31 21:52:33,669 ERROR - Unexpected error, database check failed java.lang.NullPointerException at org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper.checkServiceConfigs(DatabaseConsistencyCheckHelper.java:543) at org.apache.ambari.server.checks.DatabaseConsistencyChecker.main(DatabaseConsistencyChecker.java:115)
      

      It seems like what happens is this query returns a service which is not defined in the current stack:

      SELECT
        c.cluster_name,
        cs.service_name,
        cc.type_name,
        sc.version
      FROM clusterservices cs
      JOIN serviceconfig sc
        ON cs.service_name = sc.service_name
        AND cs.cluster_id = sc.cluster_id
      JOIN serviceconfigmapping scm
        ON sc.service_config_id = scm.service_config_id
      JOIN clusterconfig cc
        ON scm.config_id = cc.config_id
        AND sc.cluster_id = cc.cluster_id
      JOIN clusters c
        ON cc.cluster_id = c.cluster_id
        AND sc.stack_id = c.desired_stack_id
      WHERE sc.group_id IS NULL
      AND sc.service_config_id = (SELECT
        MAX(service_config_id)
      FROM serviceconfig sc2
      WHERE sc2.service_name = sc.service_name
      AND sc2.cluster_id = sc.cluster_id)
      GROUP BY c.cluster_name,
               cs.service_name,
               cc.type_name,
               sc.version
      

      Problem area of code:

      serviceInfo is null
              for (String serviceName : serviceNames) {
                ServiceInfo serviceInfo = serviceInfoMap.get(serviceName);
                Set<String> configTypes = serviceInfo.getConfigTypeAttributes().keySet();
                for (String configType : configTypes) {
                  stackServiceConfigs.put(serviceName, configType);
                }
              }
      

        Attachments

        1. AMBARI-18296.patch
          3 kB
          Vitaly Brodetskyi

          Issue Links

            Activity

              People

              • Assignee:
                vbrodetskyi Vitaly Brodetskyi
                Reporter:
                jonathanhurley Jonathan Hurley
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: