Exemple #1
0
 def __init__(self, nmetaslabs):
     self.nmetaslabs = nmetaslabs
     self.pool = Pool(nmetaslabs)
     self.y_flushed = []
     self.y_blocks = []
     self.y_logs = []
     self.last_incoming = 0
Exemple #2
0
 def __init__(self, nmetaslabs):
     self.nmetaslabs = nmetaslabs
     self.pool = Pool(nmetaslabs)
     self.y_flushed = []
     self.y_blocks = []
     self.y_logs = []
     self.summary = Summary(self.pool)
Exemple #3
0
class HeuristicSummary(object):
    def __init__(self, nmetaslabs, blimit):
        self.nmetaslabs = nmetaslabs
        self.pool = Pool(nmetaslabs)
        self.y_flushed, self.y_blocks, self.y_logs = [], [], []
        self.summary = Summary(self.pool)
        self.blimit = blimit

        #XXX: Hack
        global q
        q = int(blimit / 10)

    def printLogs(self):
        print "=== DBG - PRINT LOGS - START ==="
        for log in self.pool.logs.sms:
            print "[{}] - M {} - B {}".format(log.txg, len(log.metaslabs_flushed), log.blocks)
        print "=== DBG - PRINT LOGS - END ==="

    def condition_satisfied(self):
        if self.pool.mss.nmetaslabs() >= self.pool.logs.nblocks:
            return True
        return False

    def addGraphEntry(self, nflushed):
        self.y_flushed.append(nflushed)
        self.y_blocks.append(self.pool.logs.nblocks)
        self.y_logs.append(self.pool.logs.nlogs())

    def initializeState(self, incoming):
        all_metaslabs = self.pool.mss.ms_ordered_by_flushed
        self.pool.sync_new_changes(incoming, all_metaslabs)
        self.summary.addData(self.pool.syncing_txg, len(all_metaslabs), incoming)
        self.summary.trimData(0, self.pool.logs.nblocks - incoming)
        print "DBG - TXG: {} - Flushed: {} ".format(self.pool.syncing_txg, len(all_metaslabs))
        self.summary.printSummary()
        self.pool.sync_done()
        self.addGraphEntry(len(all_metaslabs))

    def sync_cycle(self, incoming_blocks):
        if self.pool.syncing_txg == 0:
            self.initializeState(incoming_blocks)
            return

        nflushed = self.summary.adviceFlushing(incoming_blocks, self.blimit)
        self.pool.flush_n_metaslabs(nflushed)
        ms_flushed_this_txg = self.pool.mss.ms_ordered_by_flushed[-nflushed:]
        self.pool.sync_new_changes(incoming_blocks, ms_flushed_this_txg)
        self.summary.addData(self.pool.syncing_txg, nflushed, incoming_blocks)
        self.summary.trimData(nflushed, self.y_blocks[-1] -self.pool.logs.nblocks +incoming_blocks)
        print "DBG - TXG: {} - Flushed: {} ".format(self.pool.syncing_txg, nflushed)
        self.summary.printSummary()
        self.pool.sync_done()
        self.addGraphEntry(nflushed)

    def simulate(self, y_incoming):
        for incoming in y_incoming:
            self.sync_cycle(incoming)
Exemple #4
0
    def __init__(self, nmetaslabs, blimit):
        self.nmetaslabs = nmetaslabs
        self.pool = Pool(nmetaslabs)
        self.y_flushed, self.y_blocks, self.y_logs = [], [], []
        self.summary = Summary(self.pool)
        self.blimit = blimit

        #XXX: Hack
        global q
        q = int(blimit / 10)
Exemple #5
0
class HeuristicRSTable2(object):
    def __init__(self, nmetaslabs):
        self.nmetaslabs = nmetaslabs
        self.pool = Pool(nmetaslabs)
        self.y_flushed = []
        self.y_blocks = []
        self.y_logs = []

    def condition_satisfied(self):
        if self.pool.mss.nmetaslabs() >= self.pool.logs.nblocks:
            return True
        return False

    def sync_cycle(self, incoming_blocks):
        if self.pool.syncing_txg == 0:
            all_metaslabs = self.pool.mss.ms_ordered_by_flushed
            self.pool.sync_new_changes(incoming_blocks, all_metaslabs)
            self.y_flushed.append(0)
            self.y_blocks.append(self.pool.logs.nblocks)
            self.y_logs.append(self.pool.logs.nlogs())
            self.pool.sync_done()
            return

        nflushed = 0
        mtable = MTable(self.pool)
        nflushed += mtable.flushApproximately(incoming_blocks)
        print "M", nflushed
        self.pool.flush_n_metaslabs(nflushed)

        # while not self.condition_satisfied():
        #     self.pool.flush_n_metaslabs(1)
        #     nflushed += 1

        ms_flushed_this_txg = self.pool.mss.ms_ordered_by_flushed[-nflushed:]
        self.pool.sync_new_changes(incoming_blocks, ms_flushed_this_txg)

        print "DBG - ", self.pool.syncing_txg, " flushed", nflushed
        self.pool.sync_done()

        self.y_flushed.append(nflushed)
        self.y_blocks.append(self.pool.logs.nblocks)
        self.y_logs.append(self.pool.logs.nlogs())

    def simulate(self, y_incoming):
        for incoming in y_incoming:
            self.sync_cycle(incoming)
Exemple #6
0
class HeuristicIncoming(object):
    def __init__(self, nmetaslabs):
        self.nmetaslabs = nmetaslabs
        self.pool = Pool(nmetaslabs)
        self.y_flushed = []
        self.y_blocks = []
        self.y_logs = []
        self.last_incoming = 0

    def condition_satisfied(self):
        if self.pool.mss.nmetaslabs() >= self.pool.logs.nblocks:
            return True
        return False

    def sync_cycle(self, incoming_blocks):
        if self.pool.syncing_txg == 0:
            all_metaslabs = self.pool.mss.ms_ordered_by_flushed
            self.pool.sync_new_changes(incoming_blocks, all_metaslabs)
            self.y_flushed.append(0)
            self.y_blocks.append(self.pool.logs.nblocks)
            self.y_logs.append(self.pool.logs.nlogs())
            self.pool.sync_done()
            self.last_incoming = incoming_blocks
            return

        nflushed = 0
        if not self.last_incoming == 0:
            self.pool.flush_n_metaslabs(self.last_incoming)
            nflushed += self.last_incoming
        assert nflushed <= self.nmetaslabs

        while not self.condition_satisfied():
            print "1:", len(self.pool.logs.sms[0].metaslabs_flushed), self.pool.logs.nlogs()
            self.pool.flush_n_metaslabs(1)
            nflushed += 1
            print "2:", len(self.pool.logs.sms[0].metaslabs_flushed), self.pool.logs.nlogs()
        assert nflushed <= self.nmetaslabs
        assert self.condition_satisfied()
        
        ms_flushed_this_txg = self.pool.mss.ms_ordered_by_flushed[-nflushed:]
        self.pool.sync_new_changes(incoming_blocks, ms_flushed_this_txg)

        print "DBG - ", self.pool.syncing_txg, " incoming", incoming_blocks, " flushed", nflushed
        self.pool.sync_done()
        self.last_incoming = incoming_blocks

        self.y_flushed.append(nflushed)
        self.y_blocks.append(self.pool.logs.nblocks)
        self.y_logs.append(self.pool.logs.nlogs())

        print "N", self.nmetaslabs, self.pool.logs.nblocks

    def simulate(self, y_incoming):
        for incoming in y_incoming:
            self.sync_cycle(incoming)
Exemple #7
0
class HeuristicAvgBlock(object):
    def __init__(self, nmetaslabs):
        self.nmetaslabs = nmetaslabs
        self.pool = Pool(nmetaslabs)
        self.y_flushed = []
        self.y_blocks = []
        self.y_logs = []

    def condition_satisfied(self):
        if self.pool.mss.nmetaslabs() >= self.pool.logs.nblocks:
            return True
        return False

    def flush_count(self):
        return int(self.pool.logs.nblocks / self.pool.logs.nlogs())

    def sync_cycle(self, incoming_blocks):
        if self.pool.syncing_txg == 0:
            all_metaslabs = self.pool.mss.ms_ordered_by_flushed
            self.pool.sync_new_changes(incoming_blocks, all_metaslabs)
            self.y_flushed.append(0)
            self.y_blocks.append(self.pool.logs.nblocks)
            self.y_logs.append(self.pool.logs.nlogs())
            self.pool.sync_done()
            return

        nflushed = 0
        while not self.condition_satisfied():
            self.pool.flush_n_metaslabs(1)
            nflushed += 1

        to_flush = max(self.flush_count() - nflushed, 0)
        if to_flush != 0:
            self.pool.flush_n_metaslabs(to_flush)
            nflushed += to_flush

        ms_flushed_this_txg = self.pool.mss.ms_ordered_by_flushed[-nflushed:]
        self.pool.sync_new_changes(incoming_blocks, ms_flushed_this_txg)

        print "DBG - ", self.pool.syncing_txg, " flushed", nflushed
        self.pool.sync_done()

        self.y_flushed.append(nflushed)
        self.y_blocks.append(self.pool.logs.nblocks)
        self.y_logs.append(self.pool.logs.nlogs())

    def simulate(self, y_incoming):
        for incoming in y_incoming:
            self.sync_cycle(incoming)
Exemple #8
0
class HeuristicSummary2(object):
    def __init__(self, nmetaslabs):
        self.nmetaslabs = nmetaslabs
        self.pool = Pool(nmetaslabs)
        self.y_flushed = []
        self.y_blocks = []
        self.y_logs = []
        self.summary = Summary(self.pool)

    def condition_satisfied(self):
        if self.pool.mss.nmetaslabs() >= self.pool.logs.nblocks:
            return True
        return False

    def printAllLogs(self):
        print "=== DBG - PRINT LOGS - START ==="
        for log in self.pool.logs.sms:
            print "txg", log.txg, "ms", len(
                log.metaslabs_flushed), "blks", log.blocks
        print "=== DBG - PRINT LOGS - END ==="

    def printSummary(self):
        print "=== DBG - PRINT SUMMARY - START ==="
        for entry in self.summary.tab:
            print "range: {}-{}".format(entry.beginTXG, entry.endTXG)
        print "=== DBG - PRINT SUMMARY - END ==="

    def sync_cycle(self, incoming_blocks):
        if self.pool.syncing_txg == 0:
            all_metaslabs = self.pool.mss.ms_ordered_by_flushed
            self.pool.sync_new_changes(incoming_blocks, all_metaslabs)
            self.summary.updateSummary(len(all_metaslabs), 0, incoming_blocks)
            self.y_flushed.append(0)  # Not really
            self.y_blocks.append(self.pool.logs.nblocks)
            self.y_logs.append(self.pool.logs.nlogs())
            self.pool.sync_done()
            return

        self.summary.verifySummary()
        nflushed = 0
        nflushed += self.summary.metaslabsToFlush(incoming_blocks)
        print "M", nflushed
        self.pool.flush_n_metaslabs(nflushed)
        self.summary.verifySummary()

        ms_flushed_this_txg = self.pool.mss.ms_ordered_by_flushed[-nflushed:]
        self.pool.sync_new_changes(incoming_blocks, ms_flushed_this_txg)
        print "Y", self.y_blocks[-1], self.pool.logs.nblocks
        self.summary.updateSummary(nflushed,
                                   self.y_blocks[-1] - self.pool.logs.nblocks,
                                   incoming_blocks)

        self.printAllLogs()
        self.printSummary()
        self.summary.verifySummary()

        print "DBG - ", self.pool.syncing_txg, " flushed", nflushed
        self.pool.sync_done()

        self.y_flushed.append(nflushed)
        self.y_blocks.append(self.pool.logs.nblocks)
        self.y_logs.append(self.pool.logs.nlogs())

    def simulate(self, y_incoming):
        for incoming in y_incoming:
            self.sync_cycle(incoming)