def optimize_coalesce(operation_schedule): # now let's optimize the operation schedule # this optimization is quite basic # step 1: coalesce contiguous operations on the same file system operations_grouped_by_source = itertools.groupby( operation_schedule, lambda op: op[1] ) new = [] for _, opgroup in [ (x, list(y)) for x, y in operations_grouped_by_source ]: if not opgroup: # empty opgroup continue if opgroup[0][0] == 'full': # full operations new.extend(opgroup) elif opgroup[0][0] == 'create_stub': # create stub operations new.extend(opgroup) elif opgroup[0][0] == 'incremental': # incremental # 1->2->3->4 => 1->4 new_ops = [ (srcs, dsts) for _, _, _, srcs, dsts in opgroup ] new_ops = simplify(new_ops) for srcs, dsts in new_ops: new.append(tuple(opgroup[0][:3] + (srcs, dsts))) else: assert 0, "not reached: unknown operation type in %s" % opgroup return new
def test_simple(self): m = [ (1,2,"one"), (2,3,"two"), ] r1 = zfsutils.simplify(m) r2 = [[1, 3, 'one']] self.assertEqual(r1, r2)
def test_simple(self): m = [ (1,2,"one"), (2,3,"two"), ] r1 = zfsutils.simplify(m) r2 = [[1, 3, 'one']] self.assertEquals(r1, r2)
def test_with_strings(self): m = [ "abM", "bcN", "cdO", ] # note last element is a tuple r1 = zfsutils.simplify(m) r2 = [list("adM")] self.assertEqual(r1, r2)
def test_discrete(self): m = [ (1,2,"one"), (2,4,"two"), (6,9,"three"), ] # note last element is a tuple r1 = zfsutils.simplify(m) r2 = [[1, 4, 'one'], (6, 9, 'three')] self.assertEqual(r1, r2)
def test_with_strings(self): m = [ "abM", "bcN", "cdO", ] # note last element is a tuple r1 = zfsutils.simplify(m) r2 = [list("adM")] self.assertEquals(r1, r2)
def test_discrete(self): m = [ (1,2,"one"), (2,4,"two"), (6,9,"three"), ] # note last element is a tuple r1 = zfsutils.simplify(m) r2 = [[1, 4, 'one'], (6, 9, 'three')] self.assertEquals(r1, r2)
def test_complex(self): m = [ (1,2,"one"), (2,3,"two"), (3,4,"three"), (8,9,"three"), (4,5,"four"), (6,8,"blah"), ] r1 = zfsutils.simplify(m) r2 = [[1, 5, 'one'], [6, 9, 'blah']] self.assertEqual(r1, r2)
def test_complex(self): m = [ (1,2,"one"), (2,3,"two"), (3,4,"three"), (8,9,"three"), (4,5,"four"), (6,8,"blah"), ] r1 = zfsutils.simplify(m) r2 = [[1, 5, 'one'], [6, 9, 'blah']] self.assertEquals(r1, r2)