Example #1
0
 def test_reset_character_sequence(self):
     """
     Ensure that a sequence can be reset
     """
     sequence = CharacterSequence()
     for idx in xrange(27): sequence.next()
     self.assertEqual(sequence.value, "aa")
     sequence.reset()
     self.assertEqual(sequence.next(), "a")
Example #2
0
 def test_reset_character_sequence(self):
     """
     Ensure that a sequence can be reset
     """
     sequence = CharacterSequence()
     for idx in xrange(27):
         sequence.next()
     self.assertEqual(sequence.value, "aa")
     sequence.reset()
     self.assertEqual(sequence.next(), "a")
Example #3
0
    def test_character_sequence_upper(self):
        """
        Ensure that uppercase in the character sequence works as expected
        """
        letters = 'ABCDEFGHIJKLMNOPQRSTUVWYZ'
        sequence = CharacterSequence(upper=True)
        self.assertEqual(sequence.next(), 'A')

        for idx in xrange(1, 1000):
            val = sequence.next()
            self.assertEqual(len(val), int(math.log(idx, 26)) + 1)
            self.assertEqual(val[-1], letters[idx % 26])
Example #4
0
    def test_character_sequence(self):
        """
        Ensure that an "infinite" character sequence works as expected
        """
        letters = 'abcdefghijklmnopqrstuvwxyz'
        sequence = CharacterSequence()
        self.assertEqual(sequence.next(), 'a')

        for idx in xrange(1, 1000):
            val = sequence.next()
            self.assertEqual(len(val), int(math.log(idx, 26)) + 1)
            self.assertEqual(val[-1], letters[idx % 26])
Example #5
0
    def test_character_sequence_upper(self):
        """
        Ensure that uppercase in the character sequence works as expected
        """
        letters = 'ABCDEFGHIJKLMNOPQRSTUVWYZ'
        sequence = CharacterSequence(upper=True)
        self.assertEqual(sequence.next(), 'A')

        for idx in xrange(1, 1000):
            val = sequence.next()
            self.assertEqual(len(val), int(math.log(idx, 26)) + 1)
            self.assertEqual(val[-1], letters[idx % 26])
Example #6
0
    def test_character_sequence(self):
        """
        Ensure that an "infinite" character sequence works as expected
        """
        letters = 'abcdefghijklmnopqrstuvwxyz'
        sequence = CharacterSequence()
        self.assertEqual(sequence.next(), 'a')

        for idx in xrange(1, 1000):
            val = sequence.next()
            self.assertEqual(len(val), int(math.log(idx, 26)) + 1)
            self.assertEqual(val[-1], letters[idx % 26])
Example #7
0
    def test_log_index(self):
        """
        Test finding the index of a version in a log
        """
        versions = CharacterSequence(upper=True)
        log = WriteLog()

        for term in xrange(5):
            for _ in xrange(10):
                log.append(versions.next(), term)

        versions.reset()
        for idx in xrange(1, len(log)):
            version = versions.next()
            self.assertEqual(log.index(version), idx)
            self.assertEqual(log[log.index(version)].version, version)
Example #8
0
    def test_log_index(self):
        """
        Test finding the index of a version in a log
        """
        versions = CharacterSequence(upper=True)
        log = WriteLog()

        for term in xrange(5):
            for _ in xrange(10):
                log.append(versions.next(), term)

        versions.reset()
        for idx in xrange(1, len(log)):
            version = versions.next()
            self.assertEqual(log.index(version), idx)
            self.assertEqual(log[log.index(version)].version, version)
Example #9
0
    def handle(self, args):
        """
        Uses built in workloads and the TracesWriter to generate a trace file.
        """
        # Disable logging during trace generation
        logger = logging.getLogger('cloudscope.simulation')
        logger.disabled = True

        # Update settings arguments
        settings.simulation.conflict_prob = args.conflict
        settings.simulation.access_mean = args.access_mean
        settings.simulation.access_stddev = args.access_stddev

        # Simulation arguments
        kwargs = {
            'users': args.users,
            'objects': args.objects,
            'max_sim_time': args.timesteps,
            'trace': None,
        }

        # Create simulation
        simulation = ConsistencySimulation.load(args.data[0], **kwargs)
        simulation.trace = None

        # Create or select the correct simulation
        if args.best_case or args.tiered:
            workload = BestCaseAllocation(
                simulation,
                args.objects,
                selection='random',
            )
            workload.allocate_many(args.users)

        elif args.ping_pong:
            factory = CharacterSequence(upper=True)
            objects = [factory.next() for _ in range(args.objects)]
            workload = PingPongWorkload(
                simulation,
                simulation.replicas[:args.users],
                objects=objects,
            )

        else:
            simulation.script()
            workload = simulation.workload

        # Create the traces writer and write the traces to disk
        writer = TracesWriter(workload, args.timesteps)
        counts = writer.write(args.output)

        return (
            "traced {rows:,} accesses on {devices:,} devices over {timesteps:,} timesteps ({realtime})\n"
            "object space contains {objects:,} object names:\n"
            "  {mean_objects_per_device:,} average objects per device | "
            "{mean_devices_per_object:,} average devices per object\n"
            "  {mean_accesses_per_device:,} average accesses per device | "
            "{mean_accesses_per_object:,} average accesses per object\n"
            "wrote the trace file to {0}").format(args.output.name, **counts)
Example #10
0
    def test_log_remove(self):
        """
        Test the remove of an item from a log
        """
        log = WriteLog()
        versions = CharacterSequence(upper=True)

        for term in xrange(5):
            for _ in xrange(10):
                log.append(versions.next(), term)

        loglen = len(log)
        versions.reset()
        for idx in xrange(1, loglen):
            version = versions.next()
            self.assertEqual(version, log.remove(version), "log must return the removed version")
            self.assertEqual(len(log), loglen-idx, "log must decrease in size")
            self.assertNotIn(version, log, "log must not contain version")
Example #11
0
    def handle(self, args):
        """
        Uses built in workloads and the TracesWriter to generate a trace file.
        """
        # Disable logging during trace generation
        logger = logging.getLogger('cloudscope.simulation')
        logger.disabled = True

        # Update settings arguments
        settings.simulation.conflict_prob = args.conflict
        settings.simulation.access_mean   = args.access_mean
        settings.simulation.access_stddev = args.access_stddev

        # Simulation arguments
        kwargs = {
            'users': args.users,
            'objects': args.objects,
            'max_sim_time': args.timesteps,
            'trace': None,
        }

        # Create simulation
        simulation = ConsistencySimulation.load(args.data[0], **kwargs)
        simulation.trace = None

        # Create or select the correct simulation
        if args.best_case or args.tiered:
            workload = BestCaseAllocation(
                simulation, args.objects, selection='random',
            )
            workload.allocate_many(args.users)

        elif args.ping_pong:
            factory = CharacterSequence(upper=True)
            objects = [factory.next() for _ in range(args.objects)]
            workload = PingPongWorkload(
                simulation, simulation.replicas[:args.users], objects=objects,
            )

        else:
            simulation.script()
            workload = simulation.workload

        # Create the traces writer and write the traces to disk
        writer = TracesWriter(workload, args.timesteps)
        counts = writer.write(args.output)

        return (
            "traced {rows:,} accesses on {devices:,} devices over {timesteps:,} timesteps ({realtime})\n"
            "object space contains {objects:,} object names:\n"
            "  {mean_objects_per_device:,} average objects per device | "
            "{mean_devices_per_object:,} average devices per object\n"
            "  {mean_accesses_per_device:,} average accesses per device | "
            "{mean_accesses_per_object:,} average accesses per object\n"
            "wrote the trace file to {0}"
        ).format(args.output.name, **counts)
Example #12
0
    def test_log_remove(self):
        """
        Test the remove of an item from a log
        """
        log = WriteLog()
        versions = CharacterSequence(upper=True)

        for term in xrange(5):
            for _ in xrange(10):
                log.append(versions.next(), term)

        loglen = len(log)
        versions.reset()
        for idx in xrange(1, loglen):
            version = versions.next()
            self.assertEqual(version, log.remove(version),
                             "log must return the removed version")
            self.assertEqual(len(log), loglen - idx,
                             "log must decrease in size")
            self.assertNotIn(version, log, "log must not contain version")
Example #13
0
class ObjectFactory(object):
    """
    Creates a new object class with versioning.
    """
    def __init__(self, namespace=None):
        self.namespace = namespace or Namespace()
        self.counter = CharacterSequence(upper=True)

    def __call__(self):
        return self.namespace(self.counter.next())

    def reset(self):
        """
        Resets the namespace
        """
        self.namespace.reset()
Example #14
0
class ObjectFactory(object):
    """
    Creates a new object class with versioning.
    """

    def __init__(self, namespace=None):
        self.namespace = namespace or Namespace()
        self.counter   = CharacterSequence(upper=True)

    def __call__(self):
        return self.namespace(self.counter.next())

    def reset(self):
        """
        Resets the namespace
        """
        self.namespace.reset()