Commit cf84368c authored by bescoto's avatar bescoto

Removed --mirror-only feature and most checkpointing/recovery code


git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup@250 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
parent 7bae6a1c
...@@ -48,23 +48,22 @@ def parse_cmdlineoptions(arglist): ...@@ -48,23 +48,22 @@ def parse_cmdlineoptions(arglist):
try: return open(filename, "r") try: return open(filename, "r")
except IOError: Log.FatalError("Error opening file %s" % filename) except IOError: Log.FatalError("Error opening file %s" % filename)
try: optlist, args = getopt.getopt(arglist, "blmr:sv:V", try: optlist, args = getopt.getopt(arglist, "blr:sv:V",
["backup-mode", "calculate-average", ["backup-mode", "calculate-average", "change-source-perms",
"change-source-perms", "chars-to-quote=", "chars-to-quote=", "checkpoint-interval=", "current-time=",
"checkpoint-interval=", "current-time=", "exclude=", "exclude=", "exclude-device-files", "exclude-filelist=",
"exclude-device-files", "exclude-filelist=",
"exclude-filelist-stdin", "exclude-globbing-filelist=", "exclude-filelist-stdin", "exclude-globbing-filelist=",
"exclude-mirror=", "exclude-other-filesystems", "exclude-mirror=", "exclude-other-filesystems",
"exclude-regexp=", "exclude-special-files", "force", "exclude-regexp=", "exclude-special-files", "force",
"include=", "include-filelist=", "include-filelist-stdin", "include=", "include-filelist=", "include-filelist-stdin",
"include-globbing-filelist=", "include-regexp=", "include-globbing-filelist=", "include-regexp=",
"list-changed-since=", "list-increments", "mirror-only", "list-changed-since=", "list-increments", "no-compression",
"no-compression", "no-compression-regexp=", "no-hard-links", "no-compression-regexp=", "no-hard-links", "no-resume",
"no-resume", "null-separator", "parsable-output", "null-separator", "parsable-output", "print-statistics",
"print-statistics", "quoting-char=", "remote-cmd=", "quoting-char=", "remote-cmd=", "remote-schema=",
"remote-schema=", "remove-older-than=", "restore-as-of=", "remove-older-than=", "restore-as-of=", "restrict=",
"restrict=", "restrict-read-only=", "restrict-update-only=", "restrict-read-only=", "restrict-update-only=", "resume",
"resume", "resume-window=", "server", "sleep-ratio=", "resume-window=", "server", "sleep-ratio=",
"ssh-no-compression", "terminal-verbosity=", "test-server", "ssh-no-compression", "terminal-verbosity=", "test-server",
"verbosity=", "version", "windows-mode", "verbosity=", "version", "windows-mode",
"windows-time-format"]) "windows-time-format"])
...@@ -115,7 +114,6 @@ def parse_cmdlineoptions(arglist): ...@@ -115,7 +114,6 @@ def parse_cmdlineoptions(arglist):
restore_timestr, action = arg, "list-changed-since" restore_timestr, action = arg, "list-changed-since"
elif opt == "-l" or opt == "--list-increments": elif opt == "-l" or opt == "--list-increments":
action = "list-increments" action = "list-increments"
elif opt == "-m" or opt == "--mirror-only": action = "mirror"
elif opt == "--no-compression": Globals.set("compression", None) elif opt == "--no-compression": Globals.set("compression", None)
elif opt == "--no-compression-regexp": elif opt == "--no-compression-regexp":
Globals.set("no_compression_regexp_string", arg) Globals.set("no_compression_regexp_string", arg)
...@@ -185,8 +183,7 @@ def set_action(): ...@@ -185,8 +183,7 @@ def set_action():
commandline_error("No arguments given") commandline_error("No arguments given")
if l > 0 and action == "server": if l > 0 and action == "server":
commandline_error("Too many arguments given") commandline_error("Too many arguments given")
if l < 2 and (action == "backup" or action == "mirror" or if l < 2 and (action == "backup" or action == "restore-as-of"):
action == "restore-as-of"):
commandline_error("Two arguments are required (source, destination).") commandline_error("Two arguments are required (source, destination).")
if l == 2 and (action == "list-increments" or if l == 2 and (action == "list-increments" or
action == "remove-older-than" or action == "remove-older-than" or
...@@ -228,7 +225,6 @@ def take_action(rps): ...@@ -228,7 +225,6 @@ def take_action(rps):
elif action == "backup": Backup(rps[0], rps[1]) elif action == "backup": Backup(rps[0], rps[1])
elif action == "restore": restore(*rps) elif action == "restore": restore(*rps)
elif action == "restore-as-of": RestoreAsOf(rps[0], rps[1]) elif action == "restore-as-of": RestoreAsOf(rps[0], rps[1])
elif action == "mirror": Mirror(rps[0], rps[1])
elif action == "test-server": SetConnections.TestConnections() elif action == "test-server": SetConnections.TestConnections()
elif action == "list-changed-since": ListChangedSince(rps[0]) elif action == "list-changed-since": ListChangedSince(rps[0])
elif action == "list-increments": ListIncrements(rps[0]) elif action == "list-increments": ListIncrements(rps[0])
...@@ -254,37 +250,15 @@ def Main(arglist): ...@@ -254,37 +250,15 @@ def Main(arglist):
cleanup() cleanup()
def Mirror(src_rp, dest_rp):
"""Turn dest_path into a copy of src_path"""
Log("Mirroring %s to %s" % (src_rp.path, dest_rp.path), 5)
mirror_check_paths(src_rp, dest_rp)
# Since no "rdiff-backup-data" dir, use root of destination.
SetConnections.UpdateGlobal('rbdir', dest_rp)
SetConnections.BackupInitConnections(src_rp.conn, dest_rp.conn)
backup_init_select(src_rp, dest_rp)
HighLevel.Mirror(src_rp, dest_rp)
def mirror_check_paths(rpin, rpout):
"""Check paths and return rpin, rpout"""
if not rpin.lstat():
Log.FatalError("Source directory %s does not exist" % rpin.path)
if rpout.lstat() and not force: Log.FatalError(
"""Destination %s exists so continuing could mess it up. Run
rdiff-backup with the --force option if you want to mirror anyway.""" %
rpout.path)
def Backup(rpin, rpout): def Backup(rpin, rpout):
"""Backup, possibly incrementally, src_path to dest_path.""" """Backup, possibly incrementally, src_path to dest_path."""
SetConnections.BackupInitConnections(rpin.conn, rpout.conn) SetConnections.BackupInitConnections(rpin.conn, rpout.conn)
backup_init_select(rpin, rpout) backup_init_select(rpin, rpout)
backup_init_dirs(rpin, rpout) backup_init_dirs(rpin, rpout)
RSI = Globals.backup_writer.Resume.ResumeCheck()
SaveState.init_filenames()
if prevtime: if prevtime:
Time.setprevtime(prevtime) Time.setprevtime(prevtime)
HighLevel.Mirror_and_increment(rpin, rpout, incdir, RSI) HighLevel.Mirror_and_increment(rpin, rpout, incdir)
else: HighLevel.Mirror(rpin, rpout, incdir, RSI) else: HighLevel.Mirror(rpin, rpout, incdir)
rpout.conn.Main.backup_touch_curmirror_local(rpin, rpout) rpout.conn.Main.backup_touch_curmirror_local(rpin, rpout)
def backup_init_select(rpin, rpout): def backup_init_select(rpin, rpout):
......
...@@ -40,7 +40,7 @@ class HighLevel: ...@@ -40,7 +40,7 @@ class HighLevel:
accompanying diagram. accompanying diagram.
""" """
def Mirror(src_rpath, dest_rpath, inc_rpath = None, session_info = None): def Mirror(src_rpath, dest_rpath, inc_rpath):
"""Turn dest_rpath into a copy of src_rpath """Turn dest_rpath into a copy of src_rpath
If inc_rpath is true, then this is the initial mirroring of an If inc_rpath is true, then this is the initial mirroring of an
...@@ -51,14 +51,10 @@ class HighLevel: ...@@ -51,14 +51,10 @@ class HighLevel:
SourceS = src_rpath.conn.HLSourceStruct SourceS = src_rpath.conn.HLSourceStruct
DestS = dest_rpath.conn.HLDestinationStruct DestS = dest_rpath.conn.HLDestinationStruct
SourceS.set_session_info(session_info)
DestS.set_session_info(session_info)
src_init_dsiter = SourceS.split_initial_dsiter() src_init_dsiter = SourceS.split_initial_dsiter()
dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter) dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter)
diffiter = SourceS.get_diffs_and_finalize(dest_sigiter) diffiter = SourceS.get_diffs_and_finalize(dest_sigiter)
if inc_rpath: DestS.patch_w_datadir_writes(dest_rpath, diffiter, inc_rpath)
DestS.patch_w_datadir_writes(dest_rpath, diffiter, inc_rpath)
else: DestS.patch_and_finalize(dest_rpath, diffiter)
dest_rpath.setdata() dest_rpath.setdata()
...@@ -68,9 +64,6 @@ class HighLevel: ...@@ -68,9 +64,6 @@ class HighLevel:
SourceS = src_rpath.conn.HLSourceStruct SourceS = src_rpath.conn.HLSourceStruct
DestS = dest_rpath.conn.HLDestinationStruct DestS = dest_rpath.conn.HLDestinationStruct
SourceS.set_session_info(session_info)
DestS.set_session_info(session_info)
if not session_info: dest_rpath.conn.SaveState.touch_last_file()
src_init_dsiter = SourceS.split_initial_dsiter() src_init_dsiter = SourceS.split_initial_dsiter()
dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter) dest_sigiter = DestS.get_sigs(dest_rpath, src_init_dsiter)
diffiter = SourceS.get_diffs_and_finalize(dest_sigiter) diffiter = SourceS.get_diffs_and_finalize(dest_sigiter)
...@@ -84,19 +77,9 @@ MakeStatic(HighLevel) ...@@ -84,19 +77,9 @@ MakeStatic(HighLevel)
class HLSourceStruct: class HLSourceStruct:
"""Hold info used by HL on the source side""" """Hold info used by HL on the source side"""
_session_info = None # set to si if resuming
def set_session_info(cls, session_info):
cls._session_info = session_info
def iterate_from(cls):
"""Supply more aruments to DestructiveStepping.Iterate_from"""
if cls._session_info is None: Globals.select_source.set_iter()
else: Globals.select_source.set_iter(cls._session_info.last_index, 1)
return Globals.select_source
def split_initial_dsiter(cls): def split_initial_dsiter(cls):
"""Set iterators of all dsrps from rpath, returning one""" """Set iterators of all dsrps from rpath, returning one"""
dsiter = cls.iterate_from() dsiter = Globals.select_source.set_iter()
initial_dsiter1, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2) initial_dsiter1, cls.initial_dsiter2 = Iter.multiplex(dsiter, 2)
return initial_dsiter1 return initial_dsiter1
...@@ -133,18 +116,10 @@ MakeClass(HLSourceStruct) ...@@ -133,18 +116,10 @@ MakeClass(HLSourceStruct)
class HLDestinationStruct: class HLDestinationStruct:
"""Hold info used by HL on the destination side""" """Hold info used by HL on the destination side"""
_session_info = None # set to si if resuming _session_info = None # set to si if resuming
def set_session_info(cls, session_info):
cls._session_info = session_info
def iterate_from(cls):
"""Return selection iterator to iterate all the mirror files"""
if cls._session_info is None: Globals.select_mirror.set_iter()
else: Globals.select_mirror.set_iter(cls._session_info.last_index)
return Globals.select_mirror
def split_initial_dsiter(cls): def split_initial_dsiter(cls):
"""Set initial_dsiters (iteration of all dsrps from rpath)""" """Set initial_dsiters (iteration of all dsrps from rpath)"""
result, cls.initial_dsiter2 = Iter.multiplex(cls.iterate_from(), 2) result, cls.initial_dsiter2 = \
Iter.multiplex(Globals.select_mirror.set_iter(), 2)
return result return result
def get_dissimilar(cls, baserp, src_init_iter, dest_init_iter): def get_dissimilar(cls, baserp, src_init_iter, dest_init_iter):
...@@ -287,7 +262,6 @@ class HLDestinationStruct: ...@@ -287,7 +262,6 @@ class HLDestinationStruct:
if diff_rorp and diff_rorp.isplaceholder(): diff_rorp = None if diff_rorp and diff_rorp.isplaceholder(): diff_rorp = None
ITR(dsrp.index, diff_rorp, dsrp) ITR(dsrp.index, diff_rorp, dsrp)
finalizer(dsrp.index, dsrp) finalizer(dsrp.index, dsrp)
SaveState.checkpoint(ITR, finalizer, dsrp)
finished_dsrp = dsrp finished_dsrp = dsrp
ITR.Finish() ITR.Finish()
finalizer.Finish() finalizer.Finish()
...@@ -296,7 +270,6 @@ class HLDestinationStruct: ...@@ -296,7 +270,6 @@ class HLDestinationStruct:
if Globals.preserve_hardlinks: Hardlink.final_writedata() if Globals.preserve_hardlinks: Hardlink.final_writedata()
MiscStats.close_dir_stats_file() MiscStats.close_dir_stats_file()
MiscStats.write_session_statistics(ITR.root_branch) MiscStats.write_session_statistics(ITR.root_branch)
SaveState.checkpoint_remove()
def patch_increment_and_finalize(cls, dest_rpath, diffs, inc_rpath): def patch_increment_and_finalize(cls, dest_rpath, diffs, inc_rpath):
"""Apply diffs, write increment if necessary, and finalize""" """Apply diffs, write increment if necessary, and finalize"""
...@@ -314,7 +287,6 @@ class HLDestinationStruct: ...@@ -314,7 +287,6 @@ class HLDestinationStruct:
if diff_rorp and diff_rorp.isplaceholder(): diff_rorp = None if diff_rorp and diff_rorp.isplaceholder(): diff_rorp = None
ITR(index, diff_rorp, dsrp) ITR(index, diff_rorp, dsrp)
finalizer(index, dsrp) finalizer(index, dsrp)
SaveState.checkpoint(ITR, finalizer, dsrp)
finished_dsrp = dsrp finished_dsrp = dsrp
ITR.Finish() ITR.Finish()
finalizer.Finish() finalizer.Finish()
...@@ -323,15 +295,14 @@ class HLDestinationStruct: ...@@ -323,15 +295,14 @@ class HLDestinationStruct:
if Globals.preserve_hardlinks: Hardlink.final_writedata() if Globals.preserve_hardlinks: Hardlink.final_writedata()
MiscStats.close_dir_stats_file() MiscStats.close_dir_stats_file()
MiscStats.write_session_statistics(ITR.root_branch) MiscStats.write_session_statistics(ITR.root_branch)
SaveState.checkpoint_remove()
def handle_last_error(cls, dsrp, finalizer, ITR): def handle_last_error(cls, dsrp, finalizer, ITR):
"""If catch fatal error, try to checkpoint before exiting""" """If catch fatal error, try to checkpoint before exiting"""
Log.exception(1, 2) Log.exception(1, 2)
TracebackArchive.log() TracebackArchive.log()
SaveState.checkpoint(ITR, finalizer, dsrp, 1) #SaveState.checkpoint(ITR, finalizer, dsrp, 1)
if Globals.preserve_hardlinks: Hardlink.final_checkpoint(Globals.rbdir) #if Globals.preserve_hardlinks: Hardlink.final_checkpoint(Globals.rbdir)
SaveState.touch_last_file_definitive() #SaveState.touch_last_file_definitive()
raise raise
MakeClass(HLDestinationStruct) MakeClass(HLDestinationStruct)
......
...@@ -88,35 +88,30 @@ def InternalBackup(source_local, dest_local, src_dir, dest_dir, ...@@ -88,35 +88,30 @@ def InternalBackup(source_local, dest_local, src_dir, dest_dir,
Main.Backup(rpin, rpout) Main.Backup(rpin, rpout)
Main.cleanup() Main.cleanup()
def InternalMirror(source_local, dest_local, src_dir, dest_dir, def InternalMirror(source_local, dest_local, src_dir, dest_dir):
write_data = None): """Mirror src to dest internally
"""Mirror src to dest internally, like InternalBackup"""
remote_schema = '%s'
if not source_local: like InternalBackup, but only mirror. Do this through
src_dir = "cd test1; python ../server.py ../%s::../%s" % \ InternalBackup, but then delete rdiff-backup-data directory.
(SourceDir, src_dir)
if not dest_local:
dest_dir = "cd test2/tmp; python ../../server.py ../../%s::../../%s" \
% (SourceDir, dest_dir)
rpin, rpout = cmd_schemas2rps([src_dir, dest_dir], remote_schema) """
Main.misc_setup([rpin, rpout]) # Save attributes of root to restore later
Main.backup_init_select(rpin, rpout) src_root = RPath(Globals.local_connection, src_dir)
if not rpout.lstat(): rpout.mkdir() dest_root = RPath(Globals.local_connection, dest_dir)
if write_data: # use rdiff-backup-data dir to checkpoint dest_rbdir = dest_root.append("rdiff-backup-data")
data_dir = rpout.append("rdiff-backup-data") dest_incdir = dest_rbdir.append("increments")
if not data_dir.lstat(): data_dir.mkdir()
SetConnections.UpdateGlobal('rbdir', data_dir) # We need to create these directories or else failure because
else: # just use root directory to hold checkpoints # --force option not given.
SetConnections.UpdateGlobal('rbdir', rpout) if not dest_root.lstat(): dest_root.mkdir()
SetConnections.BackupInitConnections(rpin.conn, rpout.conn) if not dest_rbdir.lstat(): dest_rbdir.mkdir()
if not dest_incdir.lstat(): dest_incdir.mkdir()
if write_data:
SaveState.init_filenames() InternalBackup(source_local, dest_local, src_dir, dest_dir)
HighLevel.Mirror(rpin, rpout, Globals.rbdir.append("increments")) dest_root.setdata()
else: HighLevel.Mirror(rpin, rpout) dest_rbdir.delete()
Main.cleanup() # Restore old attributes
RPathStatic.copy_attribs(src_root, dest_root)
def InternalRestore(mirror_local, dest_local, mirror_dir, dest_dir, time): def InternalRestore(mirror_local, dest_local, mirror_dir, dest_dir, time):
"""Restore mirror_dir to dest_dir at given time """Restore mirror_dir to dest_dir at given time
......
...@@ -198,23 +198,23 @@ class Final(PathSetter): ...@@ -198,23 +198,23 @@ class Final(PathSetter):
self.set_connections(None, None, "test2/tmp", "../../") self.set_connections(None, None, "test2/tmp", "../../")
self.runtest() self.runtest()
def testMirroringLocal(self): # def testMirroringLocal(self):
"""Run mirroring only everything remote""" # """Run mirroring only everything remote"""
self.delete_tmpdirs() # self.delete_tmpdirs()
self.set_connections(None, None, None, None) # self.set_connections(None, None, None, None)
self.exec_rb_extra_args(10000, "-m", # self.exec_rb_extra_args(10000, "-m",
"testfiles/various_file_types", # "testfiles/various_file_types",
"testfiles/output") # "testfiles/output")
assert CompareRecursive(Local.vftrp, Local.rpout, exclude_rbdir = None) # assert CompareRecursive(Local.vftrp, Local.rpout, exclude_rbdir = None)
def testMirroringRemote(self): # def testMirroringRemote(self):
"""Run mirroring only everything remote""" # """Run mirroring only everything remote"""
self.delete_tmpdirs() # self.delete_tmpdirs()
self.set_connections("test1/", "../", "test2/tmp/", "../../") # self.set_connections("test1/", "../", "test2/tmp/", "../../")
self.exec_rb_extra_args(10000, "-m", # self.exec_rb_extra_args(10000, "-m",
"testfiles/various_file_types", # "testfiles/various_file_types",
"testfiles/output") # "testfiles/output")
assert CompareRecursive(Local.vftrp, Local.rpout, exclude_rbdir = None) # assert CompareRecursive(Local.vftrp, Local.rpout, exclude_rbdir = None)
def testProcRemote(self): def testProcRemote(self):
"""Test mirroring proc""" """Test mirroring proc"""
......
...@@ -24,16 +24,5 @@ class RemoteMirrorTest(unittest.TestCase): ...@@ -24,16 +24,5 @@ class RemoteMirrorTest(unittest.TestCase):
MirrorTest(1, 1, ['testfiles/increment1', 'testfiles/increment2', MirrorTest(1, 1, ['testfiles/increment1', 'testfiles/increment2',
'testfiles/increment3', 'testfiles/increment4']) 'testfiles/increment3', 'testfiles/increment4'])
def testMirrorWithCheckpointing(self):
"""Like testMirror but this time checkpoint"""
MirrorTest(None, None, ["testfiles/increment1"], 1)
def testMirrorWithCheckpointing2(self):
"""Larger data set"""
MirrorTest(1, None, ['testfiles/increment1', 'testfiles/increment2',
'testfiles/increment3', 'testfiles/increment4'],
1)
if __name__ == "__main__": unittest.main() if __name__ == "__main__": unittest.main()
...@@ -292,23 +292,6 @@ class MirrorTest(PathSetter): ...@@ -292,23 +292,6 @@ class MirrorTest(PathSetter):
self.setPathnames('test1', '../', 'test2/tmp', '../../') self.setPathnames('test1', '../', 'test2/tmp', '../../')
self.run_partial_test() self.run_partial_test()
def testNopermsLocal(self):
"Test mirroring a directory that has no permissions"
self.setPathnames(None, None, None, None)
Time.setcurtime()
SaveState.init_filenames()
self.Mirror(self.noperms, self.noperms_out, None)
# Can't compare because we don't have the permissions to do it right
#assert CompareRecursive(Local.noperms, Local.noperms_out)
def testNopermsRemote(self):
"No permissions mirroring (remote)"
self.setPathnames('test1', '../', 'test2/tmp', '../../')
Time.setcurtime()
SaveState.init_filenames()
self.Mirror(self.noperms, self.noperms_out, None)
#assert CompareRecursive(Local.noperms, Local.noperms_out)
def testPermSkipLocal(self): def testPermSkipLocal(self):
"""Test to see if rdiff-backup will skip unreadable files""" """Test to see if rdiff-backup will skip unreadable files"""
self.setPathnames(None, None, None, None) self.setPathnames(None, None, None, None)
...@@ -418,13 +401,11 @@ class MirrorTest(PathSetter): ...@@ -418,13 +401,11 @@ class MirrorTest(PathSetter):
self.Mirror(self.inc2rp, self.rpout) self.Mirror(self.inc2rp, self.rpout)
assert CompareRecursive(Local.inc2rp, Local.rpout) assert CompareRecursive(Local.inc2rp, Local.rpout)
def Mirror(self, rpin, rpout, write_increments = 1): def Mirror(self, rpin, rpout):
"""Like HighLevel.Mirror, but run misc_setup first""" """Like HighLevel.Mirror, but run misc_setup first"""
Main.misc_setup([rpin, rpout]) Main.misc_setup([rpin, rpout])
Main.backup_init_select(rpin, rpout) Main.backup_init_select(rpin, rpout)
if write_increments: HighLevel.Mirror(rpin, rpout,
HighLevel.Mirror(rpin, rpout, rpout.append_path("rdiff-backup-data/increments"))
rpout.append_path("rdiff-backup-data/increments"))
else: HighLevel.Mirror(rpin, rpout)
if __name__ == "__main__": unittest.main() if __name__ == "__main__": unittest.main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment