A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Throw std::invalid_argument.
[simgrid.git]
/
examples
/
s4u
/
app-bittorrent
/
s4u-peer.cpp
diff --git
a/examples/s4u/app-bittorrent/s4u-peer.cpp
b/examples/s4u/app-bittorrent/s4u-peer.cpp
index
21fefba
..
6d133cc
100644
(file)
--- a/
examples/s4u/app-bittorrent/s4u-peer.cpp
+++ b/
examples/s4u/app-bittorrent/s4u-peer.cpp
@@
-1,11
+1,10
@@
-/* Copyright (c) 2012-201
8
. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2012-201
9
. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <algorithm>
#include <climits>
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <algorithm>
#include <climits>
-#include <xbt/ex.hpp>
#include "s4u-peer.hpp"
#include "s4u-tracker.hpp"
#include "s4u-peer.hpp"
#include "s4u-tracker.hpp"
@@
-16,15
+15,15
@@
XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_bt_peer, "Messages specific for the peers");
* User parameters for transferred file data. For the test, the default values are :
* File size: 10 pieces * 5 blocks/piece * 16384 bytes/block = 819200 bytes
*/
* User parameters for transferred file data. For the test, the default values are :
* File size: 10 pieces * 5 blocks/piece * 16384 bytes/block = 819200 bytes
*/
-#define FILE_PIECES 10UL
-#define PIECES_BLOCKS 5UL
-#define BLOCK_SIZE 16384
+constexpr unsigned long FILE_PIECES = 10UL;
+constexpr unsigned long PIECES_BLOCKS = 5UL;
+constexpr int BLOCK_SIZE = 16384;
/** Number of blocks asked by each request */
/** Number of blocks asked by each request */
-#define BLOCKS_REQUESTED 2UL
+constexpr unsigned long BLOCKS_REQUESTED = 2UL;
-#define ENABLE_END_GAME_MODE 1
-#define SLEEP_DURATION 1
+constexpr bool ENABLE_END_GAME_MODE = true;
+constexpr double SLEEP_DURATION = 1.0;
#define BITS_TO_BYTES(x) (((x) / 8 + (x) % 8) ? 1 : 0)
Peer::Peer(std::vector<std::string> args)
#define BITS_TO_BYTES(x) (((x) / 8 + (x) % 8) ? 1 : 0)
Peer::Peer(std::vector<std::string> args)
@@
-34,14
+33,14
@@
Peer::Peer(std::vector<std::string> args)
try {
id = std::stoi(args[1]);
mailbox_ = simgrid::s4u::Mailbox::by_name(std::to_string(id));
try {
id = std::stoi(args[1]);
mailbox_ = simgrid::s4u::Mailbox::by_name(std::to_string(id));
- } catch (
std::invalid_argument& ia
) {
- throw std::invalid_argument(
std::string("Invalid ID:") + args[1].c_str()
);
+ } catch (
const std::invalid_argument&
) {
+ throw std::invalid_argument(
"Invalid ID:" + args[1]
);
}
try {
deadline = std::stod(args[2]);
}
try {
deadline = std::stod(args[2]);
- } catch (
std::invalid_argument& ia
) {
- throw std::invalid_argument(
std::string("Invalid deadline:") + args[2].c_str()
);
+ } catch (
const std::invalid_argument&
) {
+ throw std::invalid_argument(
"Invalid deadline:" + args[2]
);
}
xbt_assert(deadline > 0, "Wrong deadline supplied");
}
xbt_assert(deadline > 0, "Wrong deadline supplied");
@@
-51,18
+50,11
@@
Peer::Peer(std::vector<std::string> args)
bitfield_ = (1U << FILE_PIECES) - 1U;
bitfield_blocks = (1ULL << (FILE_PIECES * PIECES_BLOCKS)) - 1ULL;
}
bitfield_ = (1U << FILE_PIECES) - 1U;
bitfield_blocks = (1ULL << (FILE_PIECES * PIECES_BLOCKS)) - 1ULL;
}
- pieces_count
= new short[FILE_PIECES]{0}
;
+ pieces_count
.resize(FILE_PIECES)
;
XBT_INFO("Hi, I'm joining the network with id %d", id);
}
XBT_INFO("Hi, I'm joining the network with id %d", id);
}
-Peer::~Peer()
-{
- for (auto const& peer : connected_peers)
- delete peer.second;
- delete[] pieces_count;
-}
-
/** Peer main function */
void Peer::operator()()
{
/** Peer main function */
void Peer::operator()()
{
@@
-86,32
+78,28
@@
void Peer::operator()()
bool Peer::getPeersFromTracker()
{
bool Peer::getPeersFromTracker()
{
- simgrid::s4u::Mailbox
Ptr
tracker_mailbox = simgrid::s4u::Mailbox::by_name(TRACKER_MAILBOX);
+ simgrid::s4u::Mailbox
*
tracker_mailbox = simgrid::s4u::Mailbox::by_name(TRACKER_MAILBOX);
// Build the task to send to the tracker
TrackerQuery* peer_request = new TrackerQuery(id, mailbox_);
try {
XBT_DEBUG("Sending a peer request to the tracker.");
tracker_mailbox->put(peer_request, TRACKER_COMM_SIZE, GET_PEERS_TIMEOUT);
// Build the task to send to the tracker
TrackerQuery* peer_request = new TrackerQuery(id, mailbox_);
try {
XBT_DEBUG("Sending a peer request to the tracker.");
tracker_mailbox->put(peer_request, TRACKER_COMM_SIZE, GET_PEERS_TIMEOUT);
- } catch (xbt_ex& e) {
- if (e.category == timeout_error) {
- XBT_DEBUG("Timeout expired when requesting peers to tracker");
- delete peer_request;
- return false;
- }
+ } catch (const simgrid::TimeoutError&) {
+ XBT_DEBUG("Timeout expired when requesting peers to tracker");
+ delete peer_request;
+ return false;
}
try {
TrackerAnswer* answer = static_cast<TrackerAnswer*>(mailbox_->get(GET_PEERS_TIMEOUT));
// Add the peers the tracker gave us to our peer list.
}
try {
TrackerAnswer* answer = static_cast<TrackerAnswer*>(mailbox_->get(GET_PEERS_TIMEOUT));
// Add the peers the tracker gave us to our peer list.
- for (auto const& peer_id :
*
answer->getPeers())
+ for (auto const& peer_id : answer->getPeers())
if (id != peer_id)
if (id != peer_id)
- connected_peers
[peer_id] = new Connection(peer_id
);
+ connected_peers
.emplace(peer_id, Connection(peer_id)
);
delete answer;
delete answer;
- } catch (xbt_ex& e) {
- if (e.category == timeout_error) {
- XBT_DEBUG("Timeout expired when requesting peers to tracker");
- return false;
- }
+ } catch (const simgrid::TimeoutError&) {
+ XBT_DEBUG("Timeout expired when requesting peers to tracker");
+ return false;
}
return true;
}
}
return true;
}
@@
-119,21
+107,21
@@
bool Peer::getPeersFromTracker()
void Peer::sendHandshakeToAllPeers()
{
for (auto const& kv : connected_peers) {
void Peer::sendHandshakeToAllPeers()
{
for (auto const& kv : connected_peers) {
-
Connection*
remote_peer = kv.second;
+
const Connection&
remote_peer = kv.second;
Message* handshake = new Message(MESSAGE_HANDSHAKE, id, mailbox_);
Message* handshake = new Message(MESSAGE_HANDSHAKE, id, mailbox_);
- remote_peer
->
mailbox_->put_init(handshake, MESSAGE_HANDSHAKE_SIZE)->detach();
- XBT_DEBUG("Sending a HANDSHAKE to %d", remote_peer
->
id);
+ remote_peer
.
mailbox_->put_init(handshake, MESSAGE_HANDSHAKE_SIZE)->detach();
+ XBT_DEBUG("Sending a HANDSHAKE to %d", remote_peer
.
id);
}
}
}
}
-void Peer::sendMessage(simgrid::s4u::Mailbox
Ptr
mailbox, e_message_type type, uint64_t size)
+void Peer::sendMessage(simgrid::s4u::Mailbox
*
mailbox, e_message_type type, uint64_t size)
{
const char* type_names[6] = {"HANDSHAKE", "CHOKE", "UNCHOKE", "INTERESTED", "NOTINTERESTED", "CANCEL"};
XBT_DEBUG("Sending %s to %s", type_names[type], mailbox->get_cname());
mailbox->put_init(new Message(type, id, bitfield_, mailbox_), size)->detach();
}
{
const char* type_names[6] = {"HANDSHAKE", "CHOKE", "UNCHOKE", "INTERESTED", "NOTINTERESTED", "CANCEL"};
XBT_DEBUG("Sending %s to %s", type_names[type], mailbox->get_cname());
mailbox->put_init(new Message(type, id, bitfield_, mailbox_), size)->detach();
}
-void Peer::sendBitfield(simgrid::s4u::Mailbox
Ptr
mailbox)
+void Peer::sendBitfield(simgrid::s4u::Mailbox
*
mailbox)
{
XBT_DEBUG("Sending a BITFIELD to %s", mailbox->get_cname());
mailbox
{
XBT_DEBUG("Sending a BITFIELD to %s", mailbox->get_cname());
mailbox
@@
-142,7
+130,7
@@
void Peer::sendBitfield(simgrid::s4u::MailboxPtr mailbox)
->detach();
}
->detach();
}
-void Peer::sendPiece(simgrid::s4u::Mailbox
Ptr
mailbox, unsigned int piece, int block_index, int block_length)
+void Peer::sendPiece(simgrid::s4u::Mailbox
*
mailbox, unsigned int piece, int block_index, int block_length)
{
xbt_assert(not hasNotPiece(piece), "Tried to send a unavailable piece.");
XBT_DEBUG("Sending the PIECE %u (%d,%d) to %s", piece, block_index, block_length, mailbox->get_cname());
{
xbt_assert(not hasNotPiece(piece), "Tried to send a unavailable piece.");
XBT_DEBUG("Sending the PIECE %u (%d,%d) to %s", piece, block_index, block_length, mailbox->get_cname());
@@
-153,8
+141,8
@@
void Peer::sendHaveToAllPeers(unsigned int piece)
{
XBT_DEBUG("Sending HAVE message to all my peers");
for (auto const& kv : connected_peers) {
{
XBT_DEBUG("Sending HAVE message to all my peers");
for (auto const& kv : connected_peers) {
-
Connection*
remote_peer = kv.second;
- remote_peer
->
mailbox_->put_init(new Message(MESSAGE_HAVE, id, mailbox_, piece), MESSAGE_HAVE_SIZE)->detach();
+
const Connection&
remote_peer = kv.second;
+ remote_peer
.
mailbox_->put_init(new Message(MESSAGE_HAVE, id, mailbox_, piece), MESSAGE_HAVE_SIZE)->detach();
}
}
}
}
@@
-222,7
+210,7
@@
int Peer::nbInterestedPeers()
{
int nb = 0;
for (auto const& kv : connected_peers)
{
int nb = 0;
for (auto const& kv : connected_peers)
- if (kv.second
->
interested)
+ if (kv.second
.
interested)
nb++;
return nb;
}
nb++;
return nb;
}
@@
-303,7
+291,7
@@
void Peer::handleMessage()
XBT_DEBUG("Received a %s message from %s", type_names[message->type], message->return_mailbox->get_cname());
auto known_peer = connected_peers.find(message->peer_id);
XBT_DEBUG("Received a %s message from %s", type_names[message->type], message->return_mailbox->get_cname());
auto known_peer = connected_peers.find(message->peer_id);
- Connection* remote_peer = (known_peer == connected_peers.end()) ? nullptr : known_peer->second;
+ Connection* remote_peer = (known_peer == connected_peers.end()) ? nullptr :
&
known_peer->second;
xbt_assert(remote_peer != nullptr || message->type == MESSAGE_HANDSHAKE,
"The impossible did happened: A not-in-our-list peer sent us a message.");
xbt_assert(remote_peer != nullptr || message->type == MESSAGE_HANDSHAKE,
"The impossible did happened: A not-in-our-list peer sent us a message.");
@@
-312,7
+300,7
@@
void Peer::handleMessage()
// Check if the peer is in our connection list.
if (remote_peer == nullptr) {
XBT_DEBUG("This peer %d was unknown, answer to its handshake", message->peer_id);
// Check if the peer is in our connection list.
if (remote_peer == nullptr) {
XBT_DEBUG("This peer %d was unknown, answer to its handshake", message->peer_id);
- connected_peers
[message->peer_id] = new Connection(message->peer_id
);
+ connected_peers
.emplace(message->peer_id, Connection(message->peer_id)
);
sendMessage(message->return_mailbox, MESSAGE_HANDSHAKE, MESSAGE_HANDSHAKE_SIZE);
}
// Send our bitfield to the peer
sendMessage(message->return_mailbox, MESSAGE_HANDSHAKE, MESSAGE_HANDSHAKE_SIZE);
}
// Send our bitfield to the peer
@@
-458,9
+446,8
@@
int Peer::selectPieceToDownload(Connection* remote_peer)
// end game mode
if (countPieces(current_pieces) >= (FILE_PIECES - countPieces(bitfield_)) && isInterestedBy(remote_peer)) {
// end game mode
if (countPieces(current_pieces) >= (FILE_PIECES - countPieces(bitfield_)) && isInterestedBy(remote_peer)) {
-#if ENABLE_END_GAME_MODE == 0
- return -1;
-#endif
+ if (not ENABLE_END_GAME_MODE)
+ return -1;
int nb_interesting_pieces = 0;
// compute the number of interesting pieces
for (unsigned int i = 0; i < FILE_PIECES; i++)
int nb_interesting_pieces = 0;
// compute the number of interesting pieces
for (unsigned int i = 0; i < FILE_PIECES; i++)
@@
-557,13
+544,12
@@
void Peer::updateChokedPeers()
/**If we are currently seeding, we unchoke the peer which has been unchoked the last time.*/
if (hasFinished()) {
/**If we are currently seeding, we unchoke the peer which has been unchoked the last time.*/
if (hasFinished()) {
- Connection* remote_peer;
double unchoke_time = simgrid::s4u::Engine::get_clock() + 1;
double unchoke_time = simgrid::s4u::Engine::get_clock() + 1;
- for (auto
const
& kv : connected_peers) {
- remote_peer = kv.second;
- if (remote_peer
->last_unchoke < unchoke_time && remote_peer->interested && remote_peer->
choked_upload) {
- unchoke_time = remote_peer
->
last_unchoke;
- chosen_peer = remote_peer;
+ for (auto& kv : connected_peers) {
+
Connection&
remote_peer = kv.second;
+ if (remote_peer
.last_unchoke < unchoke_time && remote_peer.interested && remote_peer.
choked_upload) {
+ unchoke_time = remote_peer
.
last_unchoke;
+ chosen_peer =
&
remote_peer;
}
}
} else {
}
}
} else {
@@
-572,12
+558,10
@@
void Peer::updateChokedPeers()
int j = 0;
do {
// We choose a random peer to unchoke.
int j = 0;
do {
// We choose a random peer to unchoke.
- std::unordered_map<int, Connection
*
>::iterator chosen_peer_it = connected_peers.begin();
+ std::unordered_map<int, Connection>::iterator chosen_peer_it = connected_peers.begin();
std::advance(chosen_peer_it, RngStream_RandInt(stream, 0, connected_peers.size() - 1));
std::advance(chosen_peer_it, RngStream_RandInt(stream, 0, connected_peers.size() - 1));
- chosen_peer = chosen_peer_it->second;
- if (chosen_peer == nullptr)
- THROWF(unknown_error, 0, "A peer should have be selected at this point");
- else if (not chosen_peer->interested || not chosen_peer->choked_upload)
+ chosen_peer = &chosen_peer_it->second;
+ if (not chosen_peer->interested || not chosen_peer->choked_upload)
chosen_peer = nullptr;
else
XBT_DEBUG("Nothing to do, keep going");
chosen_peer = nullptr;
else
XBT_DEBUG("Nothing to do, keep going");
@@
-586,11
+570,11
@@
void Peer::updateChokedPeers()
} else {
// Use the "fastest download" policy.
double fastest_speed = 0.0;
} else {
// Use the "fastest download" policy.
double fastest_speed = 0.0;
- for (auto
const
& kv : connected_peers) {
- Connection
*
remote_peer = kv.second;
- if (remote_peer
->peer_speed > fastest_speed && remote_peer->choked_upload && remote_peer->
interested) {
-
chosen_peer = remote_peer
;
-
fastest_speed = remote_peer->peer_speed
;
+ for (auto& kv : connected_peers) {
+ Connection
&
remote_peer = kv.second;
+ if (remote_peer
.peer_speed > fastest_speed && remote_peer.choked_upload && remote_peer.
interested) {
+
fastest_speed = remote_peer.peer_speed
;
+
chosen_peer = &remote_peer
;
}
}
}
}
}
}
@@
-623,20
+607,20
@@
void Peer::updateChokedPeers()
/** @brief Update "interested" state of peers: send "not interested" to peers that don't have any more pieces we want.*/
void Peer::updateInterestedAfterReceive()
{
/** @brief Update "interested" state of peers: send "not interested" to peers that don't have any more pieces we want.*/
void Peer::updateInterestedAfterReceive()
{
- for (auto
const
& kv : connected_peers) {
- Connection
*
remote_peer = kv.second;
- if (remote_peer
->
am_interested) {
+ for (auto& kv : connected_peers) {
+ Connection
&
remote_peer = kv.second;
+ if (remote_peer
.
am_interested) {
bool interested = false;
// Check if the peer still has a piece we want.
for (unsigned int i = 0; i < FILE_PIECES; i++)
bool interested = false;
// Check if the peer still has a piece we want.
for (unsigned int i = 0; i < FILE_PIECES; i++)
- if (hasNotPiece(i) && remote_peer
->
hasPiece(i)) {
+ if (hasNotPiece(i) && remote_peer
.
hasPiece(i)) {
interested = true;
break;
}
if (not interested) { // no more piece to download from connection
interested = true;
break;
}
if (not interested) { // no more piece to download from connection
- remote_peer
->
am_interested = false;
- sendMessage(remote_peer
->
mailbox_, MESSAGE_NOTINTERESTED, MESSAGE_NOTINTERESTED_SIZE);
+ remote_peer
.
am_interested = false;
+ sendMessage(remote_peer
.
mailbox_, MESSAGE_NOTINTERESTED, MESSAGE_NOTINTERESTED_SIZE);
}
}
}
}
}
}