Bug 803621

Summary: cli_canonicalize_path causing problem when brick paths contain symlinks
Product: [Community] GlusterFS Reporter: Kaushal <kaushal>
Component: cliAssignee: Kaushal <kaushal>
Status: CLOSED NOTABUG QA Contact:
Severity: unspecified Docs Contact:
Priority: medium    
Version: mainlineCC: gluster-bugs
Target Milestone: ---   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2012-06-12 09:17:28 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Kaushal 2012-03-15 09:42:54 UTC
Description of problem:
cli_canonicalize_path overwrites the next word in the words[] array when it expands symlinks if the real path is longer than given path. This causes cli to fail verification of next brick.

I have a cluster with 3 peers, with all the bricks on the /export of the respective peer. On one of the peers the /export directory is a symlink to another directory on a larger partition. The volume is setup as given below.

Version-Release number of selected component (if applicable):
mainline

How reproducible:
Always on the peer with symlink export directory, and cluster setup as given.

Steps to Reproduce:
Issue a command like create volume, add-brick, remove-brick, replace-brick etc. which can take multiple bricks as arguments.
Eg:
 gluster volume remove-brick test 192.168.56.101:/export/test 192.168.56.101:/export/test-rep start

Actual results:
The commands will fail with "wrong brick type" message.
For the above eg:
wrong brick type: export/test, use <HOSTNAME>:<export-dir-abs-path>
Usage: volume remove-brick <VOLNAME> [replica <COUNT>] <BRICK> ... {start|pause|abort|status|commit|force}

cli_canonicalize_path, modifies the path of the 1st brick (192.168.56.101:/export/test, even though the brick isn't on the peer issuing the command) to its real path (here /export/Media/export/test). This modification increases the length of the path, which causes the next member in the words[] array (brick 192.168.56.101:/export/test-rep) to be overwritten. This overwriting causes the validation of the next brick to fail and the gluster command as a result.

Expected results:
The commands should succeed.

cli should perform only the minimum checks necessary to make sure that the given bricks are in proper format for glusterd to interpret. cli shouldn't be canonicalizing brick paths, as bricks may be (and most often will be) on different peers. The checking and canonicalizing of paths should be left to glusterd.

Additional info:

#volume info

Volume Name: test
Type: Distributed-Replicate
Volume ID: 265b064d-148d-465b-b291-1ec17f8dfe17
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: 192.168.56.1:/export/test
Brick2: 192.168.56.1:/export/test-rep
Brick3: 192.168.56.101:/export/test
Brick4: 192.168.56.101:/export/test-rep

192.168.56.1 is the peer with symlinked /export (to /media/Extra/export)

Comment 1 Kaushal 2012-06-12 09:17:28 UTC
Changes introduced in patch http://review.gluster.com/#change,3315 (core: canonicalize paths) remove resolution of symlinks using realpath(). Thus, this problem shouldn't occur anymore.