Exemple #1
0
    def cmd_push(self):
        prev = self.get_prev_value()
        newvalue = self.get_head_and_config()
        val = self.propose_value(prev, newvalue)
        # print("val: ", val, "newval: ", newvalue, "prev: ", prev)
        if (val != newvalue):
            dbg.err("You should fetch first")
            return False

        # with open(self.path_master) as f:
        #     master_head = f.read().strip()
        # with open(self.get_head()) as f:
        #     head = f.read().strip()
        # if(len(master_head) > 0):
        #     head_history = self.get_history()
        #     if(not master_head in head_history):
        #         dbg.err("You should update first")
        #         self.unlock_master()
        #         return False
        # check master is ancestor of the head

        shutil.copyfile(self.get_head(), self.get_prev())
        self._update_all(self.get_prev(),
                         self.get_remote_path(self.get_prev_name()))
        from paxos import Proposer
        self.proposer = Proposer(None, self.services,
                                 self.get_pPaxos_path(newvalue))
        self._join()
        return True
Exemple #2
0
 def __init__(self, pid):
     super(PaxosProcess, self).__init__(pid)
     self.process_count = 0
     self.proposers = defaultdict(lambda: Proposer(self.process_count))
     self.acceptors = defaultdict(lambda: Acceptor(self.process_count))
     self.learners = defaultdict(lambda: Learner(self.process_count))
     self.client_requests = []
     self.internal_requests = []
 def __init__(self, config, globalConfig, client_sock=None):
     self.config = config
     self.globalConfig = globalConfig
     self.init_balance = 100
     self.set = []
     self.blockchain = []
     self.proposer = Proposer(self.config, globalConfig)
     self.acceptor = Acceptor(self.config)
     self.inPaxos = False
Exemple #4
0
def test_paxos_latency(metasync, opts):
    lock = "locktest/ltest_latency"
    import services
    srvs = ["onedrive"]
    srvs_instance = map(services.factory, srvs)

    for srv in srvs_instance:
        if not srv.exists(lock):
            srv.put(lock, '')

    from paxos import Proposer
    proposer = Proposer("1", srvs_instance, lock)
    val = proposer.propose("1")
    assert val == "1"
    proposer.join()
Exemple #5
0
def test_paxos(metasync, opts):
    "test paxos with disk_api"
    lock = 'locktest/ltest'

    test_init(metasync, opts)
    srvs = metasync.services

    for srv in srvs:
        if not srv.exists(lock):
            srv.put(lock, '')

    from paxos import Proposer

    proposer = Proposer("1", srvs, lock)
    val = proposer.propose("1")
    assert val == "1"
    proposer.join()
Exemple #6
0
def test_paxos_services(metasync, opts):
    "test paxos with services"

    # init tmp repo to play with
    #test_init(metasync, opts)

    # init lock primitives
    lock = 'locktest/ltest2'
    targets = ["google", "box", "dropbox"]
    srvs = map(services.factory, targets)
    for srv in srvs:
        if not srv.exists(lock):
            srv.put(lock, '')

    from paxos import Proposer

    proposer = Proposer("1", srvs, lock)
    val = proposer.propose("1")
    assert val == "1"
    proposer.join()
Exemple #7
0
 def propose_value(self, prev, newvalue):
     from paxos import Proposer
     self.proposer = Proposer(self.clientid, self.services,
                              self.get_remote_path("pPaxos/" + prev))
     return self.proposer.propose(newvalue)
Exemple #8
0
    def cmd_init(self,
                 namespace,
                 backend=None,
                 nreplicas=None,
                 encrypt_key=None):
        # already initialized?
        if self.check_sanity():
            dbg.err("already initialized %s (%s)" \
                     % (self.path_root, self.namespace))
            return False

        os.mkdir(self.path_meta)
        os.mkdir(self.path_objs)

        # build config opts
        conf = util.new_config()

        # core: unique/permanent info about local machine (often called client)
        #   NOTE. not sure if encryption_key should be in core, or unchangable
        conf.add_section('core')
        conf.set('core', 'namespace', namespace)
        conf.set('core', 'clientid', util.gen_uuid())
        conf.set('core', 'encryptkey', _get_conf_encryptkey(encrypt_key))

        # backend: info about sync service providers
        # XXX: Error handling
        conf.add_section('backend')
        try:
            services = _get_conf_services(backend)
            conf.set('backend', 'services', services)
            conf.set('backend', 'nreplicas',
                     _get_conf_nreplicas(nreplicas, len(services.split(","))))
        except:
            pass

        # flush
        with open(self.path_conf, "w") as fd:
            conf.write(fd)

        try:
            self._load()
        except NameError:
            shutil.rmtree(self.path_meta)
            return False

        # put config into remote
        conf.remove_option('core', 'clientid')
        conf.remove_option('core', 'encryptkey')

        with io.BytesIO() as out:
            conf.write(out)
            val = out.getvalue()
            configname = util.sha1(val)
            self._put_all_content(
                val, self.get_remote_path("configs/%s" % configname[:6]), True)

            #temporary --- move this to pPaxos
            #self._put_all_content(configname[:6], self.get_remote_path("config"), True)

        # Format for master: headhash.config[:6].version
        prev_master = "." + configname[:6] + ".0"
        # do we need both? or shall we put them into a file together.
        with open(self.get_head(), "w") as f:
            f.write(prev_master)
        with open(self.get_prev(), "w") as f:
            f.write(prev_master)
        self._put_all_dir(self.get_remote_path("objects"))
        # change to put_content
        self._put_all(self.get_head(),
                      self.get_remote_path(self.get_head_name()))
        self._put_all(self.get_prev(),
                      self.get_remote_path(self.get_prev_name()))

        from paxos import Proposer
        self.proposer = Proposer(None, self.services,
                                 self.get_pPaxos_path(prev_master))
        self._join()

        return True