[ https://issues.apache.org/jira/browse/HDFS-6940?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14125979#comment-14125979 ]
Aaron T. Myers commented on HDFS-6940: -------------------------------------- bq. Suresh, if you want to judge peoples' respectfulness, you should probably look at your own style of communication. Your subjective opinions on the value of people contributions are incomplete and hostile. Please consider apology. I 100% agree with [~sureshms] on this. It is a well-known expectation that those who are not familiar with certain areas of the codebase refrain from +1'ing patches to that area of the code base. It's not about the value of the contributions - it's about the areas of expertise. That's just common sense, not subjective judgment. This is the reason that we have discussed in the past having component areas and component owners. Up until now I have opposed that, because I thought that the existing understanding was sufficient. This JIRA and others may be demonstrating that we may need some actual rules on this. bq. Aaron, you never commented or objected on the patch itself. My understanding that you are questioning the implementation of ConsensusNode via sub-classing the NameNode. You actually posted your reservations even before the patch was submitted. That's correct, I posted objections to the entire direction of the patch. I could go through line by line if you'd like, but that's not usually necessary when one objects to the patch as a whole. It's difficult for me to understand how the comments that I posted could be interpreted to mean that I was OK with committing the patch. At the very least, I don't understand how this could be misinterpreted: "Anyway, I'm fine if you want to proceed with this direction, but please only commit this to the branch, not to trunk." You then committed it to trunk and branch-2 without any further discussion of that subject. For this reason alone this patch should not have been committed, and should be reverted. bq. I unswered this already. Will elaborate. Working on a branch means a lot of merging from trunk to the branch intended to keep the bunch in sync with trunk. So it used to be a general practice in this community to make initial refactoring on the trunk, if such changes keep the trunk in working condition, in order to easy those frequent merges. Found this conversation, for example. That's generally only the case when the changes are in and of themselves good changes to make as well. That is not the case in the case of this JIRA, where opening up method visibility is not independently a good idea. At the very least, it doesn't make any sense to have committed this to branch-2 in _addition_ to trunk. Why was that done? bq. I did create a jira to discuss ConsensusNode interfaces including your topic HDFS-7007. And this jira has nothing to do with NameNode subclassing. At all. I did ask explicitly if you have technical objections to the patch, and since you did not reply I assumed you don't have any. The patch is 100% about subclassing. The bulk of the patch is about opening up the visibility of certain methods to allow subclassing, for example all of these changes to {{FSNamesystem}}: {code} - private void loadFSImage(StartupOption startOpt) throws IOException { + protected void loadFSImage(StartupOption startOpt) throws IOException { final FSImage fsImage = getFSImage(); // format before starting up if requested @@ -1036,7 +1036,7 @@ imageLoadComplete(); } - private void startSecretManager() { + protected void startSecretManager() { if (dtSecretManager != null) { try { dtSecretManager.startThreads(); @@ -1048,7 +1048,7 @@ } } - private void startSecretManagerIfNecessary() { + protected void startSecretManagerIfNecessary() { boolean shouldRun = shouldUseDelegationTokens() && !isInSafeMode() && getEditLog().isOpenForWrite(); boolean running = dtSecretManager.isRunning(); @@ -1198,7 +1198,7 @@ return haEnabled && inActiveState() && startingActiveService; } - private boolean shouldUseDelegationTokens() { + protected boolean shouldUseDelegationTokens() { return UserGroupInformation.isSecurityEnabled() || alwaysUseDelegationTokensForTests; } @@ -2728,6 +2728,7 @@ * @throws UnresolvedLinkException * @throws IOException */ + protected LocatedBlock prepareFileForWrite(String src, INodeFile file, String leaseHolder, String clientMachine, boolean writeToEditLog, @@ -3184,6 +3185,7 @@ return new FileState(pendingFile, src); } + protected LocatedBlock makeLocatedBlock(Block blk, DatanodeStorageInfo[] locs, long offset) throws IOException { LocatedBlock lBlk = new LocatedBlock( @@ -3301,8 +3303,8 @@ return true; } - private INodeFile checkLease(String src, String holder, INode inode, - long fileId) + protected INodeFile checkLease(String src, String holder, INode inode, + long fileId) throws LeaseExpiredException, FileNotFoundException { assert hasReadLock(); final String ident = src + " (inode " + fileId + ")"; @@ -4412,7 +4414,7 @@ return leaseManager.reassignLease(lease, src, newHolder); } - private void commitOrCompleteLastBlock(final INodeFile fileINode, + protected void commitOrCompleteLastBlock(final INodeFile fileINode, final Block commitBlock) throws IOException { assert hasWriteLock(); Preconditions.checkArgument(fileINode.isUnderConstruction()); @@ -4808,6 +4810,7 @@ * @return an array of datanode commands * @throws IOException */ + protected HeartbeatResponse handleHeartbeat(DatanodeRegistration nodeReg, StorageReport[] reports, long cacheCapacity, long cacheUsed, int xceiverCount, int xmitsInProgress, int failedVolumes) @@ -4857,8 +4860,8 @@ * @param file * @param logRetryCache */ - private void persistBlocks(String path, INodeFile file, - boolean logRetryCache) { + protected void persistBlocks(String path, INodeFile file, + boolean logRetryCache) { assert hasWriteLock(); Preconditions.checkArgument(file.isUnderConstruction()); getEditLog().logUpdateBlocks(path, file, logRetryCache); @@ -5289,7 +5292,7 @@ * @param path * @param file */ - private void persistNewBlock(String path, INodeFile file) { + protected void persistNewBlock(String path, INodeFile file) { Preconditions.checkArgument(file.isUnderConstruction()); getEditLog().logAddBlock(path, file); if (NameNode.stateChangeLog.isDebugEnabled()) { @@ -7167,7 +7170,7 @@ * * @return true if delegation token operation is allowed */ - private boolean isAllowedDelegationTokenOp() throws IOException { + protected boolean isAllowedDelegationTokenOp() throws IOException { {code} Changing those visibilities is not a useful refactor in and of itself, and in my opinion is on its own a poor decision to make. What reason is there to change those method visibilities except to support subclassing? I also fail to see how changing these on trunk/branch-2 will make merges any easier. Could you explain that? bq. I don't think this JIRA is appropriate to this kind of discussion... At this point I agree that this JIRA has gone off the rails. Multiple issues are now being discussed that are not specific to this JIRA. I believe that for the time being we should revert this change from trunk/branch-2 until discussion on that is finished. Separately, we should continue some of these discussions elsewhere. I'll be bringing this JIRA to the attention of the Hadoop PMC, as it has gotten out of hand. > Initial refactoring to allow ConsensusNode implementation > --------------------------------------------------------- > > Key: HDFS-6940 > URL: https://issues.apache.org/jira/browse/HDFS-6940 > Project: Hadoop HDFS > Issue Type: Sub-task > Components: namenode > Affects Versions: 2.0.6-alpha, 2.5.0 > Reporter: Konstantin Shvachko > Assignee: Konstantin Shvachko > Fix For: 2.6.0 > > Attachments: HDFS-6940.patch > > > Minor refactoring of FSNamesystem to open private methods that are needed for > CNode implementation. -- This message was sent by Atlassian JIRA (v6.3.4#6332)