From adc704557a141a624fc702f7303b8b81582e1598 Mon Sep 17 00:00:00 2001 From: Aravinda VK Date: Fri, 26 Jun 2015 22:36:31 -0400 Subject: 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 comes after RENAME. Default value of pgfids and basenames changed to "" instead of NULL Also fixed RENAME issue of displaying "RENAME ". Also fixed RENAME followed by missing MODIFY Change-Id: I8202f6e6ec33f7bd921e71da38677f2ee2dab87a BUG: 1236270 Signed-off-by: Kotresh HR Signed-off-by: Milind Changire Reviewed-on: http://review.gluster.org/11443 Tested-by: Gluster Build System Reviewed-by: Aravinda VK Tested-by: NetBSD Build System --- tools/glusterfind/src/changelogdata.py | 39 ++++++++++++++++++++++++---------- tools/glusterfind/src/main.py | 3 ++- 2 files changed, 30 insertions(+), 12 deletions(-) (limited to 'tools') 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 / is same as /(may be previous - # RENAME) then UPDATE / as / - 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 / is same as / + # (may be previous RENAME) + # then UPDATE / as / + 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 + self.gfidpath_delete({"gfid": data[1], "type": "MODIFY"}) + self.gfidpath_add(changelogfile, RecordType.MODIFY, data[1]) + def when_link_symlink(self, changelogfile, data): # E / # 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])) -- cgit