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

Aaron T. Myers updated HDFS-5138:
---------------------------------

    Attachment: HDFS-5138.patch

Thanks a lot for the review, Todd. Here's an updated patch which should address 
all of your feedback. Please have another look. Detailed responses below.

bq. thanks for the description in the above JIRA comment. Can you transfer this 
comment somewhere into the docs, perhaps 
hadoop-hdfs-project/hadoop-hdfs/src/site/apt/HDFSHighAvailabilityWithQJM.apt.vm 
or a new page? Perhaps with a slightly more user-facing angle.

Good thinking. Done.

bq. what would happen if the admin called finalizeUpgrade() when neither node 
had yet transitioned to active? I don't see any sanity check here.. is it 
possible you'd end up leaving the shared in an orphaned "upgrading" state and 
never end up finalizing it?

Great point. I've now added support for running finalizeUpgrade() on each NN 
from DFSAdmin, and made the DFSAdmin command also check to ensure that one NN 
is indeed active before it will finalize the upgrade.

bq. Similarly, what happens if you start one NN with -upgrade, and you start 
the other one without -upgrade. It seems to me it should check for the upgrade 
lock file in the shared dir and say "looks like an upgrade is in progress, 
please start the SBN with -upgrade".

Good thinking. Fixed.

bq. there are a few TODOs in the code that probably need to be addressed - 
nothing big, just a few things you may have missed.

Yes, as I said, this was a prelim patch to make sure folks were OK with the 
direction. All of them are pretty trivial and have been addressed in the latest 
patch, except for this one, which I'd love to hear your thoughts on:
{code}
+    // TODO(atm): What should we do here in the case of multiple shared edits
+    // dirs, which isn't actually possible at the moment?
{code}
My suggestion is that until we do actually support having multiple shared edits 
dirs (perhaps never) that we should just assert that there is in fact only a 
single one here.

bq. would be good to add Javadoc on the new methods, so that JM implementors 
know what the upgrade process looks like. i.e what is pre-upgrade, etc?

Yep, good thinking. Done. Please have a look at the new javadocs.

bq. "Could not perform upgrade or more JournalNodes" error message has some 
missing words in it.

Eagle-eye Lipcon. Good catch. Done.

bq. this line should be unreachable, right? maybe an 
AssertionError("Unreachable code") would make more sense? Also this same 
exception message is used down below in canRollBack which isn't quite right.

Good thinking. Done.

bq. when you upgrade the journal, I'd think you'd to copy over all the data 
from the PersistentLongFiles into the new dir?

Good catch. Done. I've also updated the tests to ensure that this happens 
during upgrade of JNs.

bq. worth considering a protobuf for the shared log lock, in case we want to 
add other fields to it later (instead of the custom serialization you do now)

I thought about this, but concluded that with just two fields it probably 
wasn't worth it. Do you feel strongly about this?

bq. need try...finally around the code where you write the shared log lock. On 
the read side you're also forgetting to close it.

Good catch. Fixed.

bq. the creation of the shared log lock file is non-atomic... I'm worried that 
we may hit the race in practice, since the AtomicFileOutputStream implies an 
fsync, which means that between the exists() check and the rename to the lock 
file, you may really have a decently long time window. Maybe we can use locking 
code like Storage does? Feel free to punt to a follow-up.

Note that in the case the lock file is being created on a JN, that the creation 
of the shared lock file is within a synchronized section. I agree that this 
could still be an issue in the NFS case, but seems to me like we can reasonably 
punt that to a later JIRA.

bq. can you add a doc on doUpgradeOfSharedLogOnTransitionToActive()?

Yep, done.

bq. why are some of the functions package-private and others are public?

That was an error. You're right that the one that was public can be 
package-private. Fixed.

bq. make it an abstract class or give it a private constructor so it can't be 
instantiated, since it's just static methods

Done. Made it abstract.

bq. brief javadocs would be nice for these methods, even though they're 
straight refactors of existing code.

Sure. Added.

bq. in canRollBack(), you throw an exception if there is no shared log. That 
doesn't seem right...

It actually is correct, since we only ever call this method in the event that 
HA is enabled, so there really should be a shared log. In the event that HA is 
not enabled, the upgrade of the edits dirs will be done directly on the storage 
dirs, instead of going through the edit log upgrade code path. The same is true 
FSEditLog#doPreUpgrade, doUpgrade, doFinalize, etc. I've changed the names of 
these methods to have "OfSharedLog" at the end to make this clear.

bq. capitalization of "RollBack" vs "Rollback" is a little inconsistent. Looks 
like Rollback is consistently used prior to this patch, so probably best to 
stick with that.

I attempted to consistenly use "Rollback" (one word) when it's used as a noun, 
and "RollBack" (two words) when it's used as a verb, which I believe to be 
grammatically correct. Perhaps it's best to stick with just one capitalization 
scheme for method/variable names, for consistency, even if it is technically 
incorrect English. Do you have an opinion here?

bq. in the switch statement on the startup option, I think you should keep the 
ROLLBACK case, but just have it throw AssertionError – just to make sure we 
don't accidentally have some case where we're passing it there but shouldn't 
be.GA

Good thinking. Done.

> Support HDFS upgrade in HA
> --------------------------
>
>                 Key: HDFS-5138
>                 URL: https://issues.apache.org/jira/browse/HDFS-5138
>             Project: Hadoop HDFS
>          Issue Type: Bug
>    Affects Versions: 2.1.1-beta
>            Reporter: Kihwal Lee
>            Assignee: Aaron T. Myers
>            Priority: Blocker
>         Attachments: HDFS-5138.patch, HDFS-5138.patch, HDFS-5138.patch, 
> HDFS-5138.patch
>
>
> With HA enabled, NN wo't start with "-upgrade". Since there has been a layout 
> version change between 2.0.x and 2.1.x, starting NN in upgrade mode was 
> necessary when deploying 2.1.x to an existing 2.0.x cluster. But the only way 
> to get around this was to disable HA and upgrade. 
> The NN and the cluster cannot be flipped back to HA until the upgrade is 
> finalized. If HA is disabled only on NN for layout upgrade and HA is turned 
> back on without involving DNs, things will work, but finaliizeUpgrade won't 
> work (the NN is in HA and it cannot be in upgrade mode) and DN's upgrade 
> snapshots won't get removed.
> We will need a different ways of doing layout upgrade and upgrade snapshot.  
> I am marking this as a 2.1.1-beta blocker based on feedback from others.  If 
> there is a reasonable workaround that does not increase maintenance window 
> greatly, we can lower its priority from blocker to critical.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to