Uploaded image for project: 'Hadoop HDFS'
  1. Hadoop HDFS
  2. HDFS-1249

with fuse-dfs, chown which only has owner (or only group) argument fails with Input/output error.

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 0.20.1, 0.20.2
    • 2.0.2-alpha
    • fuse-dfs
    • x86 linux (ubuntu 10.04)

    • Reviewed

    Description

      with fuse-dfs, chown which only has owner (or only group) argument fails with Input/output error.
      ----------
      /mnt/hdfs/tmp# chown root file1
      chown: changing ownership of `file1': Input/output error
      /mnt/hdfs/tmp# chown root:root file1
      /mnt/hdfs/tmp# chown :root file1
      chown: changing group of `file1': Input/output error
      ----------
      I think it should be treated as unchanged for missing part(owner or group) instead of returning an error.

      I took fuse_dfs log and it is saying
      ----------
      unique: 25, opcode: SETATTR (4), nodeid: 14, insize: 128
      chown /tmp/file1 0 4294967295
      could not lookup group -1
      unique: 25, error: -5 (Input/output error), outsize: 16
      unique: 26, opcode: SETATTR (4), nodeid: 14, insize: 128
      chown /tmp/file1 0 0
      getattr /tmp/file1
      unique: 26, success, outsize: 120
      unique: 27, opcode: SETATTR (4), nodeid: 14, insize: 128
      chown /tmp/file1 4294967295 0
      could not lookup userid -1
      unique: 27, error: -5 (Input/output error), outsize: 16
      ----------

      therefore this should happen because dfs_chown() in src/contrib/fuse-dfs/src/fuse_impls_chown.c has following
      ----------
      ...
      user = getUsername(uid);
      if (NULL == user)

      { syslog(LOG_ERR,"Could not lookup the user id string %d\n",(int)uid); fprintf(stderr, "could not lookup userid %d\n", (int)uid); ret = -EIO; }

      if (0 == ret) {
      group = getGroup(gid);
      if (group == NULL)

      { syslog(LOG_ERR,"Could not lookup the group id string %d\n",(int)gid); fprintf(stderr, "could not lookup group %d\n", (int)gid); ret = -EIO; }


      }
      ...
      ----------

      but actually, hdfsChown() in src/c++/libhdfs/hdfs.c has this
      ----------
      ...
      if (owner == NULL && group == NULL)

      { fprintf(stderr, "Both owner and group cannot be null in chown"); errno = EINVAL; return -1; }

      ...
      ----------

      and also, setOwner seems allowing NULL
      ----------
      username - If it is null, the original username remains unchanged.
      groupname - If it is null, the original groupname remains unchanged.
      ----------
      according to the api document.

      therefore, I think fuse_impls_chown.c should not treat only user(or only group) lookup fail as an error.

      Attachments

        1. HDFS1249.1
          0.9 kB
          matsusaka kentaro
        2. HDFS-1249.002.patch
          6 kB
          Colin McCabe
        3. HDFS-1249.001.patch
          5 kB
          Colin McCabe

        Activity

          People

            cmccabe Colin McCabe
            kentaro matsusaka kentaro
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: