[ 
https://issues.apache.org/jira/browse/AMBARI-19130?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jonathan Hurley updated AMBARI-19130:
-------------------------------------
    Status: Patch Available  (was: Open)

> Downgrade Can Create Multiple Mappings For Latest Configs
> ---------------------------------------------------------
>
>                 Key: AMBARI-19130
>                 URL: https://issues.apache.org/jira/browse/AMBARI-19130
>             Project: Ambari
>          Issue Type: Bug
>          Components: ambari-server
>    Affects Versions: 2.2.0
>            Reporter: Jonathan Hurley
>            Assignee: Jonathan Hurley
>            Priority: Critical
>             Fix For: 2.5.0
>
>         Attachments: AMBARI-19130.patch
>
>
> During a downgrade which crosses major stack versions (such as from HDP 2.y 
> to HDP 2.x), Ambari attempts to set the latest configurations from HDP 2.x as 
> "current". However, after the downgrade succeeds, the database fails with the 
> following consistency check:
> {code}
> ERROR - You have config(s), in cluster c1, that is(are) selected more than 
> once in clusterconfigmapping table: 
> ranger-storm-plugin-properties,mapred-env,webhcat-env,hive-exec-log4j,hive-log4j,webhcat-log4j,storm-env,yarn-log4j,hcat-env
> {code}
> The problem is actually not with {{clusterconfig}} but with the state of the 
> {{clusterconfigmapping}} table _before_ upgrade. Apparently, it is possible 
> to have multiple mappings for the same config. We match on the config type 
> and tag (such as hdfs-site / version1234566789). There should never, EVER be 
> duplicate mappings for the same config and version tag.
> The current downgrade code doesn't "break" after finding its first match:
> {code}
>       for(ClusterConfigMappingEntity configMappingEntity: 
> configMappingEntities){
>         String type = configMappingEntity.getType();
>         String tag =  configMappingEntity.getTag();
>         for (ClusterConfigMappingEntity latest : latestConfigMappingByStack) {
>           String latestType = latest.getType();
>           String latestTag = latest.getTag();
>           // find the latest config of a given mapping entity
>           if (StringUtils.equals(type, latestType) && StringUtils.equals(tag, 
> latestTag)) {
>             LOG.info("{} with version tag {} is selected for stack {}", type, 
> tag, stackId.toString());
>             configMappingEntity.setSelected(1);
>           }
>         }
>       }
> {code}
> I'm not sure that breaking will work here since we don't know the ordering. 
> We could order the results and then break on the first match. In any event, 
> it's a problem. But it's only a problem for the latest version of a config 
> since that's what we're going to try to make selected.
> Here's a query from a test cluster which shows that if this cluster were to 
> be downgraded, 5 configs would have multiple mappings created. This is 
> because for the latest config, there are multiple mappings in 
> {{clusterconfigmapping}}.
> {noformat}
> SELECT
>   mapping.type_name,
>   mapping.version_tag,
>   COUNT(*)
> FROM clusterconfigmapping mapping
> JOIN (SELECT
>   config.type_name,
>   config.version_tag,
>   MAX(config.version) AS latest_version
> FROM clusterconfig config
> GROUP BY config.type_name) AS latestConfig
>   ON latestConfig.type_name = mapping.type_name
>   AND latestConfig.version_tag = mapping.version_tag
> GROUP BY
>     type_name, version_tag  
> HAVING COUNT(*) > 1
> +-------------------------------+----------------------+----------+
> | type_name                     | version_tag          | COUNT(*) |
> +-------------------------------+----------------------+----------+
> | hcat-env                      | version1             |        5 |
> | hive-exec-log4j               | version1             |        5 |
> | hive-log4j                    | version1             |        5 |
> | ranger-hive-plugin-properties | version1436918769763 |        3 |
> | webhcat-env                   | version1             |        5 |
> +-------------------------------+----------------------+----------+
> 5 rows in set (0.00 sec)
> {noformat}
> STR:
> # Install a cluster, and instrument the {{clusterconfigmapping}} table to 
> have multiple mappings for a given type (with only 1 currently selected).
> # Upgrade and then downgrade 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to