Example #1
0
 def make_offer(self, peer, blobs):
     offer_count = self.offers_sent.get(peer, 0)
     self._add_offer_sent(peer)
     if peer in self.accepted_offers:
         # if there was a previous accepted offer, use that
         offer = self.accepted_offers[peer]
     elif offer_count == 0 and self.is_generous:
         # Try asking for it for free
         offer = Offer(Decimal(0.0))
     else:
         rates = [self.price_model.calculate_price(blob) for blob in blobs]
         price = self._make_rate_offer(rates, offer_count)
         offer = Offer(price)
     return offer
Example #2
0
 def _handle_price_response(self, response_dict, request):
     assert request.response_identifier == 'blob_data_payment_rate'
     if 'blob_data_payment_rate' not in response_dict:
         return InvalidResponseError("response identifier not in response")
     offer_value = self.protocol_offers.pop(self.protocol)
     offer = Offer(offer_value)
     offer.handle(response_dict['blob_data_payment_rate'])
     self.payment_rate_manager.record_offer_reply(self.peer, offer)
     if offer.is_accepted:
         log.info("Offered rate %f/mb accepted by %s", offer.rate, self.peer.host)
         self.protocol_prices[self.protocol] = offer.rate
         return True
     elif offer.is_too_low:
         log.debug("Offered rate %f/mb rejected by %s", offer.rate, self.peer.host)
         return not self.payment_rate_manager.price_limit_reached(self.peer)
     else:
         log.warning("Price disagreement")
         self.requestor._price_disagreements.append(self.peer)
         return False
Example #3
0
 def _handle_price_response(self, response_dict, request):
     assert request.response_identifier == 'blob_data_payment_rate'
     if 'blob_data_payment_rate' not in response_dict:
         return InvalidResponseError("response identifier not in response")
     offer_value = self.protocol_offers.pop(self.protocol)
     offer = Offer(offer_value)
     offer.handle(response_dict['blob_data_payment_rate'])
     self.payment_rate_manager.record_offer_reply(self.peer, offer)
     if offer.is_accepted:
         log.info("Offered rate %f/mb accepted by %s", offer.rate, self.peer.host)
         self.protocol_prices[self.protocol] = offer.rate
         return True
     elif offer.is_too_low:
         log.debug("Offered rate %f/mb rejected by %s", offer.rate, self.peer.host)
         return not self.payment_rate_manager.price_limit_reached(self.peer)
     else:
         log.warning("Price disagreement")
         self.requestor._price_disagreements.append(self.peer)
         return False
Example #4
0
def calculate_negotation_turns(client_base,
                               host_base,
                               host_is_generous=True,
                               client_is_generous=True):
    blobs = [
        'b2e48bb4c88cf46b76adf0d47a72389fae0cd1f19ed27dc5'
        '09138c99509a25423a4cef788d571dca7988e1dca69e6fa0',
        'd7c82e6cac093b3f16107d2ae2b2c75424f1fcad2c7fbdbe'
        '66e4a13c0b6bd27b67b3a29c403b82279ab0f7c1c48d6787',
        '5a450b416275da4bdff604ee7b58eaedc7913c5005b7184f'
        'c3bc5ef0b1add00613587f54217c91097fc039ed9eace9dd',
        'f99d24cd50d4bfd77c2598bfbeeb8415bf0feef21200bdf0'
        'b8fbbde7751a77b7a2c68e09c25465a2f40fba8eecb0b4e0',
        '9dbda74a472a2e5861a5d18197aeba0f5de67c67e401124c'
        '243d2f0f41edf01d7a26aeb0b5fc9bf47f6361e0f0968e2c',
        '91dc64cf1ff42e20d627b033ad5e4c3a4a96856ed8a6e3fb'
        '4cd5fa1cfba4bf72eefd325f579db92f45f4355550ace8e7',
        '6d8017aba362e5c5d0046625a039513419810a0397d72831'
        '8c328a5cc5d96efb589fbca0728e54fe5adbf87e9545ee07',
        '6af95cd062b4a179576997ef1054c9d2120f8592eea045e9'
        '667bea411d520262cd5a47b137eabb7a7871f5f8a79c92dd',
        '8c70d5e2f5c3a6085006198e5192d157a125d92e73787944'
        '72007a61947992768926513fc10924785bdb1761df3c37e6',
        'c84aa1fd8f5009f7c4e71e444e40d95610abc1480834f835'
        'eefb267287aeb10025880a3ce22580db8c6d92efb5bc0c9c'
    ]

    host = mock.Mock()
    host.host = "1.2.3.4"
    client = mock.Mock()
    client.host = "1.2.3.5"

    client_base_prm = BasePaymentRateManager(client_base)
    client_prm = NegotiatedPaymentRateManager(client_base_prm,
                                              DummyBlobAvailabilityTracker(),
                                              generous=client_is_generous)
    host_base_prm = BasePaymentRateManager(host_base)
    host_prm = NegotiatedPaymentRateManager(host_base_prm,
                                            DummyBlobAvailabilityTracker(),
                                            generous=host_is_generous)
    blobs_to_query = get_random_sample(blobs)
    accepted = False
    turns = 0
    while not accepted:
        rate = client_prm.get_rate_blob_data(host, blobs_to_query)
        offer = Offer(rate)
        accepted = host_prm.accept_rate_blob_data(client, blobs_to_query,
                                                  offer)
        turns += 1
    return turns
Example #5
0
    def _handle_price_response(self, response_dict, request):
        assert request.response_identifier == 'blob_data_payment_rate'
        if 'blob_data_payment_rate' not in response_dict:
            return InvalidResponseError("response identifier not in response")
        assert self.protocol in self.protocol_prices
        rate = self.protocol_prices[self.protocol]
        offer = Offer(rate)
        offer.handle(response_dict['blob_data_payment_rate'])
        self.payment_rate_manager.record_offer_reply(self.peer.host, offer)

        if offer.is_accepted:
            log.debug("Offered rate %f/mb accepted by %s", rate,
                      str(self.peer.host))
            return True
        elif offer.is_too_low:
            log.debug("Offered rate %f/mb rejected by %s", rate,
                      str(self.peer.host))
            del self.protocol_prices[self.protocol]
            return True
        else:
            log.warning("Price disagreement")
            del self.protocol_prices[self.protocol]
            self.requestor._price_disagreements.append(self.peer)
            return False
Example #6
0
    def handle_queries(self, queries):
        response = defer.succeed({})
        log.debug("Handle query: %s", str(queries))

        if self.AVAILABILITY_QUERY in queries:
            self._blobs_requested = queries[self.AVAILABILITY_QUERY]
            response.addCallback(lambda r: self._reply_to_availability(r, self._blobs_requested))
        if self.PAYMENT_RATE_QUERY in queries:
            offered_rate = queries[self.PAYMENT_RATE_QUERY]
            offer = Offer(offered_rate)
            if offer.rate is None:
                log.warning("Empty rate offer")
            response.addCallback(lambda r: self._handle_payment_rate_query(offer, r))
        if self.BLOB_QUERY in queries:
            incoming = queries[self.BLOB_QUERY]
            response.addCallback(lambda r: self._reply_to_send_request(r, incoming))
        return response