diff options
author | Aravinda VK <avishwan@redhat.com> | 2015-06-26 22:36:31 -0400 |
---|---|---|
committer | Venky Shankar <vshankar@redhat.com> | 2015-07-05 23:09:10 -0700 |
commit | adc704557a141a624fc702f7303b8b81582e1598 (patch) | |
tree | 2cda5daca9d198e508721060a999772519a69720 /tools | |
parent | 0fdf6c9db5114c77cd846c71699eb877d41ad6ae (diff) |
tools/glusterfind: RENAME and MODIFY issues
If Modification happens before RENAME, GFID to Path Conversion
converts it into New Path. Delete Modify Entry and insert again
So that MODIFY <NEW NAME> comes after RENAME.
Default value of pgfids and basenames changed to "" instead of NULL
Also fixed RENAME issue of displaying "RENAME <NEW NAME> <NEW NAME>".
Also fixed RENAME followed by missing MODIFY
Change-Id: I8202f6e6ec33f7bd921e71da38677f2ee2dab87a
BUG: 1236270
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Signed-off-by: Milind Changire <mchangir@redhat.com>
Reviewed-on: http://review.gluster.org/11443
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Aravinda VK <avishwan@redhat.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/glusterfind/src/changelogdata.py | 39 | ||||
-rw-r--r-- | tools/glusterfind/src/main.py | 3 |
2 files changed, 30 insertions, 12 deletions
diff --git a/tools/glusterfind/src/changelogdata.py b/tools/glusterfind/src/changelogdata.py index c42aa2a2315..08d711b9696 100644 --- a/tools/glusterfind/src/changelogdata.py +++ b/tools/glusterfind/src/changelogdata.py @@ -100,10 +100,10 @@ class ChangelogData(object): ts VARCHAR, type VARCHAR, gfid VARCHAR(40), - pgfid1 VARCHAR(40), - bn1 VARCHAR(500), - pgfid2 VARCHAR(40), - bn2 VARCHAR(500), + pgfid1 VARCHAR(40) DEFAULT '', + bn1 VARCHAR(500) DEFAULT '', + pgfid2 VARCHAR(40) DEFAULT '', + bn2 VARCHAR(500) DEFAULT '', path1 VARCHAR DEFAULT '', path2 VARCHAR DEFAULT '' ) @@ -283,7 +283,7 @@ class ChangelogData(object): def append_path1(self, path, inode): # || is for concatenate in SQL - query = """UPDATE gfidpath SET path1 = ',' || ? + query = """UPDATE gfidpath SET path1 = path1 || ',' || ? WHERE gfid IN (SELECT gfid FROM inodegfid WHERE inode = ?)""" self.cursor.execute(query, (path, inode)) @@ -344,16 +344,32 @@ class ChangelogData(object): "pgfid1": pgfid1, "bn1": bn1}) elif self.gfidpath_exists({"gfid": data[1], "type": "RENAME", "pgfid2": pgfid1, "bn2": bn1}): - # If <OLD_PGFID>/<BNAME> is same as <PGFID2>/<BN2>(may be previous - # RENAME) then UPDATE <NEW_PGFID>/<BNAME> as <PGFID2>/<BN2> - self.gfidpath_update({"pgfid2": pgfid2, "bn2": bn2}, - {"gfid": data[1], "type": "RENAME", - "pgfid2": pgfid1, "bn2": bn1}) + # If we are renaming file back to original name then just + # delete the entry since it will effectively be a no-op + if self.gfidpath_exists({"gfid": data[1], "type": "RENAME", + "pgfid2": pgfid1, "bn2": bn1, + "pgfid1": pgfid2, "bn1": bn2}): + self.gfidpath_delete({"gfid": data[1], "type": "RENAME", + "pgfid2": pgfid1, "bn2": bn1}) + else: + # If <OLD_PGFID>/<BNAME> is same as <PGFID2>/<BN2> + # (may be previous RENAME) + # then UPDATE <NEW_PGFID>/<BNAME> as <PGFID2>/<BN2> + self.gfidpath_update({"pgfid2": pgfid2, "bn2": bn2}, + {"gfid": data[1], "type": "RENAME", + "pgfid2": pgfid1, "bn2": bn1}) else: # Else insert as RENAME self.gfidpath_add(changelogfile, RecordType.RENAME, data[1], pgfid1, bn1, pgfid2, bn2) + if self.gfidpath_exists({"gfid": data[1], "type": "MODIFY"}): + # If MODIFY exists already for that GFID, remove it and insert + # again so that MODIFY entry comes after RENAME entry + # Output will have MODIFY <NEWNAME> + self.gfidpath_delete({"gfid": data[1], "type": "MODIFY"}) + self.gfidpath_add(changelogfile, RecordType.MODIFY, data[1]) + def when_link_symlink(self, changelogfile, data): # E <GFID> <LINK|SYMLINK> <PGFID>/<BASENAME> # Add as New record in Db as Type NEW @@ -366,7 +382,8 @@ class ChangelogData(object): def when_data_meta(self, changelogfile, data): # If GFID row exists, Ignore else Add to Db - if not self.gfidpath_exists({"gfid": data[1]}): + if not self.gfidpath_exists({"gfid": data[1], "type": "NEW"}) and \ + not self.gfidpath_exists({"gfid": data[1], "type": "MODIFY"}): self.gfidpath_add(changelogfile, RecordType.MODIFY, data[1]) def when_unlink_rmdir(self, changelogfile, data): diff --git a/tools/glusterfind/src/main.py b/tools/glusterfind/src/main.py index 18130e07aa6..8b3d3fe9edd 100644 --- a/tools/glusterfind/src/main.py +++ b/tools/glusterfind/src/main.py @@ -433,7 +433,8 @@ def mode_pre(session_dir, args): # Multiple paths in case of Hardlinks paths = row[1].split(",") for p in paths: - if p == "": + if p == "" or p.replace("%2F%2F","%2F") == \ + row[2].replace("%2F%2F","%2F"): continue f.write("%s %s %s\n" % (row[0], p, row[2])) |