[ 
https://issues.apache.org/jira/browse/HDFS-5526?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13827810#comment-13827810
 ] 

Kihwal Lee commented on HDFS-5526:
----------------------------------

I think we need to clarify the role of the VERSION files.  I think layout 
version and ctime checks are also in the block pool slice level, which is 
represented by {{BlockPoolSliceStorage}}.  So, I think not all fields in the 
VERSION file written by {{DataStorage}} - the volume-level storage - is useful. 
 

VERSION properties in {{DataStorage}} : <volume>/current/VERSION
 - layoutVersion 
 - storageType 
 - namespaceID  
 - clusterID
 - cTime
 - storageID

VERSION properties in {{BlockPoolSliceStorage}} : 
<volume>/current/<blockpool>/current/VERSION
 - layoutVersion
 - namespaceID
 - blockpoolID
 - cTime

For {{DataStorage}}, the critical information to maintain during 
post-federation upgrade/rollback are
 - namespaceID (not used post federation)
 - storageID
 - storageType - automatically set
 - clusterID

{{cTime}} at {{DataStorage}} level doesn't seem to make sense. It will be 
compared against the one in {{nsInfo}} from the name node for the first block 
pool that is initialized. If the initialization order changes, {{DataStorage}} 
may fail to initialize. I don't know whether it's by design or not, but as you 
(Vinay) said, {{DataStorage.upgrade}} will always run during DN startup after 
the first upgrade. This prevents the initialization failure during normal 
start-up and upgrade. Rollback is different since it doesn't go through this 
code path. 

Since upgrade in {{DataStorage}} level does not involve actual data, {{cTime}} 
change within the same layout version has no meaning and it shouldn't make any 
changes. I propose removing cTime check for post-federation upgrades. 
Validation should be only performed against {{clusterID}} and 
{{layoutVersion}}. Upgrade action (post-federation, not 1.x to 2.x upgrades) be 
taken only when the layout version is changed.

For post-federation rollback, it should only update {layoutVersion}. There is 
no need to save the old layout version. The layout version is invalid (i.e. 
talked to a NN running wrong version), the rollback at 
{{BlockPoolSliceStorage}} will fail. If the error is corrected and the datanode 
is restarted with "-rollback", it should not be stuck in an invalid state. It 
means, the rollback at {{DataStorage}} level should accept whatever the first 
name node is saying. Again, this is safe since correctness is checked in  
{{BlockPoolSliceStorage}} level.

I will submit an update patch soon.

> Datanode cannot roll back to previous layout version
> ----------------------------------------------------
>
>                 Key: HDFS-5526
>                 URL: https://issues.apache.org/jira/browse/HDFS-5526
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: datanode
>            Reporter: Tsz Wo (Nicholas), SZE
>            Assignee: Kihwal Lee
>            Priority: Blocker
>         Attachments: HDFS-5526.patch
>
>
> Current trunk layout version is -48.
> Hadoop v2.2.0 layout version is -47.
> If a cluster is upgraded from v2.2.0 (-47) to trunk (-48), the datanodes 
> cannot start with -rollback.  It will fail with IncorrectVersionException.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to