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

maobaolong commented on HDFS-13226:
-----------------------------------


{code:java}
public boolean validate() {
    boolean ret = super.validate();
    if (this.getSourcePath() == null || this.getSourcePath().length() == 0) {
      LOG.error("Invalid entry, no source path specified ", this);
      ret = false;
    }
    if (!this.getSourcePath().startsWith("/")) {
      LOG.error("Invalid entry, all mount points must start with / ", this);
      ret = false;
    }
    if (this.getDestinations() == null || this.getDestinations().size() == 0) {
      LOG.error("Invalid entry, no destination paths specified ", this);
      ret = false;
    }
    for (RemoteLocation loc : getDestinations()) {
      String nsId = loc.getNameserviceId();
      if (nsId == null || nsId.length() == 0) {
        LOG.error("Invalid entry, invalid destination nameservice ", this);
        ret = false;
      }
      if (loc.getDest() == null || loc.getDest().length() == 0) {
        LOG.error("Invalid entry, invalid destination path ", this);
        ret = false;
      }
      if (!loc.getDest().startsWith("/")) {
        LOG.error("Invalid entry, all destination must start with / ", this);
        ret = false;
      }
    }
    return ret;
  }
{code}

Let's discuss about this method. I think this method have the following problem:

- if this.getSourcePath() return null, the this.getSourcePath().startsWith("/") 
will throw NPE.
- if the sourcePath is null, the validate method will not be invoked, instead, 
the NPE will be taken place as follow stack.
{code:java}
java.lang.NullPointerException
        at 
org.apache.hadoop.hdfs.federation.protocol.proto.HdfsServerFederationProtos$GetMountTableEntriesRequestProto$Builder.setSrcPath(HdfsServerFederationProtos.java:15937)
        at 
org.apache.hadoop.hdfs.server.federation.store.protocol.impl.pb.GetMountTableEntriesRequestPBImpl.setSrcPath(GetMountTableEntriesRequestPBImpl.java:73)
        at 
org.apache.hadoop.hdfs.server.federation.store.protocol.GetMountTableEntriesRequest.newInstance(GetMountTableEntriesRequest.java:38)
        at 
org.apache.hadoop.hdfs.tools.federation.RouterAdmin.addMount(RouterAdmin.java:280)
        at 
org.apache.hadoop.hdfs.tools.federation.RouterAdmin.addMount(RouterAdmin.java:258)
        at 
org.apache.hadoop.hdfs.tools.federation.RouterAdmin.run(RouterAdmin.java:154)
and normalizeFileSystemPath method found the null or empty src or dest first.
{code}
- if the nsId is null, 
{code:bash}
java.lang.NullPointerException
        at 
org.apache.hadoop.hdfs.tools.federation.RouterAdmin.addMount(RouterAdmin.java:224)
        at 
org.apache.hadoop.hdfs.tools.federation.RouterAdmin.run(RouterAdmin.java:154)
{code}
- if the source start with more than one '/', the entry will be create 
successfully as a different mount entry as the single '/' version.
for example
{code:bash}
hdfs dfsrouteradmin -add //addnode/ ns1 //addnode/
hdfs dfsrouteradmin -add /addnode/ ns1 /addnode/

Mount Table Entries:
Source                    Destinations              Owner                     
Group                     Mode                      Quota/Usage
//addnode/                ns1->//addnode/           hadp                      
hadp                      rwxr-xr-x                 [NsQuota: -/-, SsQuota: -/-]
/addnode                  ns1->/addnode             hadp                      
hadp                      rwxr-xr-x                 [NsQuota: -/-, SsQuota: -/-]
{code}
- if an error have occurred, should we check the following problem?
So, I want to modify to the following version of validate:
{code:java}
public boolean validate() {
    if (!super.validate()) {
      return false;
    }
    if (!this.getSourcePath().startsWith("/")
        || this.getSourcePath().startsWith("//")) {
      LOG.error("Invalid entry, all mount points must start with a single / ", 
this);
      return false;
    }
    for (RemoteLocation loc : getDestinations()) {
      String nsId = loc.getNameserviceId();
      if (nsId.length() == 0) {
        LOG.error("Invalid entry, invalid destination nameservice ", this);
        return false;
      } else if (!loc.getDest().startsWith("/") || 
this.getSourcePath().startsWith("//")) {
        LOG.error("Invalid entry, all destination must start with a single / ", 
this);
        return false;
      }
    }
    return true;
  }
{code}
Or 
{code:java}
 @Override
  public boolean validate() {
    if (!super.validate()) {
      return false;
    }
    if (!this.getSourcePath().startsWith("/")
        || this.getSourcePath().startsWith("//")) {
      throw new IllegalArgumentException("Invalid entry, all mount points must 
start with a single / ");
    }
    for (RemoteLocation loc : getDestinations()) {
      String nsId = loc.getNameserviceId();
      if (nsId.length() == 0) {
        throw new IllegalArgumentException("Invalid entry, invalid destination 
nameservice ");
      } else if (!loc.getDest().startsWith("/") || 
this.getSourcePath().startsWith("//")) {
        throw new IllegalArgumentException("Invalid entry, all destination must 
start with a single / ");
      }
    }
    return true;
  }
{code}

> RBF: We should throw the failure validate and refuse this mount entry
> ---------------------------------------------------------------------
>
>                 Key: HDFS-13226
>                 URL: https://issues.apache.org/jira/browse/HDFS-13226
>             Project: Hadoop HDFS
>          Issue Type: Sub-task
>          Components: hdfs
>    Affects Versions: 3.2.0
>            Reporter: maobaolong
>            Assignee: maobaolong
>            Priority: Major
>              Labels: RBF
>             Fix For: 3.2.0
>
>         Attachments: HDFS-13226.001.patch
>
>
> one of the mount entry source path rule is that the source path must start 
> with '\', somebody didn't follow the rule and execute the following command:
> {code:bash}
> $ hdfs dfsrouteradmin -add addnode/ ns1 /addnode/
> {code}
> But, the console show we are successful add this entry.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-issues-unsubscr...@hadoop.apache.org
For additional commands, e-mail: hdfs-issues-h...@hadoop.apache.org

Reply via email to