Пример #1
0
def insert_from_peer():
    msgs = pickle.loads(request.json.get('data').encode("utf-8"))
    for msg in msgs:
        fid = int(msg['id'])
        value = int(msg['num'])

        def _insert():
            return globalVal.BLOCK_CHAIN.insert(fid, value)

        caller.atomic_call(globalVal.BLOCK_CHAIN_LOCK, _insert)
        # caller.thread_call(req.post_peers('insert_from_peer', msg))
    return 'ok'
Пример #2
0
def modify():
    msgs = json.loads(request.data)
    while globalVal.RECV_IS_LOCK:
        None
    for msg in msgs:
        fid = int(msg['id'])
        value = int(msg['num'])
        def _modify():
            return globalVal.BLOCK_CHAIN.modify(fid, value)
        caller.atomic_call(globalVal.BLOCK_CHAIN_LOCK, _modify)
        #caller.thread_call(req.post_peers('insert_from_peer', msg))

    return '1'
Пример #3
0
def after_confirm():
    globalVal.RECV_IS_LOCK = False
    for msgs in globalVal.RECV_BUF:
        for msg in msgs:
            fid = int(msg['id'])
            value = int(msg['num'])
            def _insert():
                return globalVal.BLOCK_CHAIN.insert(fid, value)
            caller.atomic_call(globalVal.BLOCK_CHAIN_LOCK, _insert)
        #req.post_peers_cnt('insert_from_peer', json.dumps(msgs))
        req.post_peers_cnt('insert_from_peer', {'data': unicode(pickle.dumps(msgs), "utf-8")})
    globalVal.RECV_BUF = []
    return 'ok'
Пример #4
0
def insert():
    msgs = json.loads(request.data)
    if globalVal.RECV_IS_LOCK:
        globalVal.RECV_BUF.append(msgs)
        return '1'
    else:
        for msg in msgs:
            fid = int(msg['id'])
            value = int(msg['num'])
            def _insert():
                return globalVal.BLOCK_CHAIN.insert(fid, value)
            caller.atomic_call(globalVal.BLOCK_CHAIN_LOCK, _insert)
            #caller.thread_call(req.post_peers('insert_from_peer', msg))
        req.post_peers_cnt('insert_from_peer', {'data': unicode(pickle.dumps(msgs), "utf-8")})
        return '1'
Пример #5
0
def get_peers_cnt(op):
    rets = []
    for peer in config.peers_url:  #TODO: parallel it
        if peer != config.url:
            print 'GET ' + peer + str(op)
            try:
                # atomic add send cnt
                caller.atomic_call(globalVal.SEND_CNT_LOCK, send_cnt_add)

                ret = requests.get(peer + str(op))
                rets.append(ret)

                #atomic minus send cnt
                caller.atomic_call(globalVal.SEND_CNT_LOCK, send_cnt_minus)
            except:
                print 'GET' + peer + str(op) + ' error'

                # atomic minus send cnt
                caller.atomic_call(globalVal.SEND_CNT_LOCK, send_cnt_minus)
                continue
    return rets
Пример #6
0
def uniform():
    heart.heart_beat()
    #heart.check_peers()
    if globalVal.IS_MAIN == False:
        return

    print '----------uniform------------(' +  str(globalVal.UNIFORM_CNT) + ')'
    globalVal.UNIFORM_CNT += 1

    #
    # pre uniform
    #
    globalVal.PRE_UNIFORM_CNT = globalVal.PEERS_NUM - 1

    #send pre uniform signal
    globalVal.RECV_IS_LOCK = True
    req.post_peers('pre_uniform', {'url': config.url + 'pre_uniform_confirm'})

    #wait pre uniform confirm, loop until all send finish
    while globalVal.SEND_CNT > 0:
        None

    # wait pre uniform confirm, loop until all peers confirm
    while globalVal.PRE_UNIFORM_CNT > 0:
        None

    #
    # uniform
    #
    globalVal.UNIFORM_HASH_BUFF = []
    req.post_peers('get_hash', {'url': config.url + 'get_hash_back'})
    this_hash = globalVal.BLOCK_CHAIN.calc_hash()

    print 'loop until all hash send back'
    #loop until all hash send back
    while len(globalVal.UNIFORM_HASH_BUFF) < globalVal.PEERS_NUM - 1:
        None

    # get most freq hash
    hash_array = [this_hash]
    for msg in globalVal.UNIFORM_HASH_BUFF:
        hash_array.append(msg.get('hash'))
    def countMax(arry):
        import collections
        max = collections.Counter(arry).most_common()[0][0]
        return max

    most_hash = countMax(hash_array)

    #recover incoreccted process
    for msg in globalVal.UNIFORM_HASH_BUFF:
        if msg.get('hash') != most_hash:
            print 'diff hash'
            print msg
            globalVal.UNIFORM_DIFF_HASH_URLS.append(msg.get('url'))
        else:
            requests.get(msg.get('url') + 'confirm_block')

    incorrect_cnt = len(globalVal.UNIFORM_DIFF_HASH_URLS)
    if this_hash != most_hash:
        incorrect_cnt += 1

    if incorrect_cnt >= (globalVal.PEERS_NUM + 1) / 2:
        print 'ERROR: Most of peers are incorrect !!!!!!'

    recover_all_data = None
    if len(globalVal.UNIFORM_DIFF_HASH_URLS) > 0 or this_hash != most_hash:
        for msg in globalVal.UNIFORM_HASH_BUFF:
            if msg.get('hash') == most_hash:
                try:
                    res = requests.get(msg.get('url')+'get_recover_chain_data')
                    recover_all_data = json.loads(res.text)
                    break
                except:
                    print 'get recover data from ' + msg.get('url') + 'failed. Try another'
                    continue

    print recover_all_data
    for url in globalVal.UNIFORM_DIFF_HASH_URLS:
        try:
            requests.post(url + 'recover_chain_data_all', json={'data': unicode(pickle.dumps(recover_all_data), "utf-8")})
        except:
            print 'recover process ' + url + ', connect failed'
            continue

    # for url in globalVal.UNIFORM_DIFF_HASH_URLS:
    #     try:
    #         requests.get(url + 'confirm_block')
    #     except:
    #         print 'confirm after recover connect failed'
    #         continue
    globalVal.UNIFORM_DIFF_HASH_URLS = []

    if this_hash != most_hash:
        globalVal.BLOCK_CHAIN.recover(recover_all_data)
    globalVal.BLOCK_CHAIN.confirm_block()

    #
    # after uniform
    #
    globalVal.RECV_IS_LOCK = False
    req.get_peers('after_confirm')

    for msgs in globalVal.RECV_BUF:
        for msg in msgs:
            fid = int(msg['id'])
            value = int(msg['num'])
            def _insert():
                return globalVal.BLOCK_CHAIN.insert(fid, value)
            caller.atomic_call(globalVal.BLOCK_CHAIN_LOCK, _insert)
        #req.post_peers_cnt('insert_from_peer', json.dumps(msgs))
        req.post_peers_cnt('insert_from_peer', {'data': unicode(pickle.dumps(msgs), "utf-8")})

    globalVal.RECV_BUF = []

    print '----------------BLOCK CHAIN---------------------'
    try:
        globalVal.BLOCK_CHAIN.dataprint()
    except:
        print 'some error happend'
        pass
    print '------------------------------------------------'
Пример #7
0
def kill():
    caller.atomic_call(globalVal.BLOCK_CHAIN_LOCK, globalVal.BLOCK_CHAIN.deleteall)
    return '1'
Пример #8
0
def get_hash_back():
    msg = request.json
    def _append():
        globalVal.UNIFORM_HASH_BUFF.append(msg)
    caller.atomic_call(globalVal.UNIFORM_HASH_BUFF_LOCK, _append) # TODO: check msg is passed correctly
    return 'ok'
Пример #9
0
def pre_uniform_confirm():
    def _minus():
        globalVal.PRE_UNIFORM_CNT -= 1
    caller.atomic_call(globalVal.PRE_UNIFORM_CNT_LOCK, _minus)
    return 'ok'