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
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
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()
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()
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()
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)
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