code cleanup

This commit is contained in:
jmjatlanta 2017-08-02 08:53:34 -05:00
parent 0638996684
commit 986d054c6c
4 changed files with 55 additions and 35 deletions

View file

@ -5,6 +5,7 @@
* For a somewhat accurate diagram of how this may work, @see https://github.com/ipfs/js-ipfs-bitswap * For a somewhat accurate diagram of how this may work, @see https://github.com/ipfs/js-ipfs-bitswap
*/ */
#include "libp2p/utils/logger.h"
#include "ipfs/exchange/bitswap/network.h" #include "ipfs/exchange/bitswap/network.h"
#include "ipfs/exchange/bitswap/peer_request_queue.h" #include "ipfs/exchange/bitswap/peer_request_queue.h"
@ -104,23 +105,16 @@ int ipfs_bitswap_network_handle_message(const struct IpfsNode* node, const struc
ipfs_bitswap_message_free(message); ipfs_bitswap_message_free(message);
return 0; return 0;
} }
struct Libp2pPeer* temp_peer = libp2p_peer_new(); struct Libp2pPeer* peer = libp2p_peerstore_get_or_add_peer_by_id(node->peerstore, (unsigned char*)sessionContext->remote_peer_id, strlen(sessionContext->remote_peer_id));
temp_peer->id_size = strlen(sessionContext->remote_peer_id);
temp_peer->id = malloc(temp_peer->id_size);
if (temp_peer->id == NULL) {
libp2p_peer_free(temp_peer);
ipfs_bitswap_message_free(message);
return 0;
}
memcpy(temp_peer->id, sessionContext->remote_peer_id, strlen(sessionContext->remote_peer_id));
struct Libp2pPeer* peer = libp2p_peerstore_get_or_add_peer(node->peerstore, temp_peer);
libp2p_peer_free(temp_peer);
if (peer == NULL) { if (peer == NULL) {
libp2p_logger_error("bitswap_network", "Unable to find or add peer %s of length %d to peerstore.\n", sessionContext->remote_peer_id, strlen(sessionContext->remote_peer_id));
ipfs_bitswap_message_free(message); ipfs_bitswap_message_free(message);
return 0; return 0;
} }
// find the queue
struct PeerRequestEntry* queueEntry = ipfs_bitswap_peer_request_queue_find_entry(bitswapContext->peerRequestQueue, peer); struct PeerRequestEntry* queueEntry = ipfs_bitswap_peer_request_queue_find_entry(bitswapContext->peerRequestQueue, peer);
if (queueEntry == NULL) { if (queueEntry == NULL) {
// add the queue
struct PeerRequest* peerRequest =ipfs_bitswap_peer_request_new(); struct PeerRequest* peerRequest =ipfs_bitswap_peer_request_new();
peerRequest->peer = peer; peerRequest->peer = peer;
ipfs_bitswap_peer_request_queue_add(bitswapContext->peerRequestQueue, peerRequest); ipfs_bitswap_peer_request_queue_add(bitswapContext->peerRequestQueue, peerRequest);
@ -134,17 +128,18 @@ int ipfs_bitswap_network_handle_message(const struct IpfsNode* node, const struc
struct WantlistEntry* entry = (struct WantlistEntry*) libp2p_utils_vector_get(message->wantlist->entries, i); struct WantlistEntry* entry = (struct WantlistEntry*) libp2p_utils_vector_get(message->wantlist->entries, i);
// turn the "block" back into a cid // turn the "block" back into a cid
struct Cid* cid = NULL; struct Cid* cid = NULL;
if (!ipfs_cid_protobuf_decode(entry->block, entry->block_size, &cid)) { if (!ipfs_cid_protobuf_decode(entry->block, entry->block_size, &cid) || cid->hash_length == 0) {
libp2p_logger_error("bitswap_network", "Message had invalid CID\n");
ipfs_cid_free(cid); ipfs_cid_free(cid);
return 0; return 0;
} }
if (entry->cancel) if (entry->cancel)
ipfs_bitswap_network_remove_cid_from_queue(queueEntry->current->cids_they_want, cid); ipfs_bitswap_network_remove_cid_from_queue(queueEntry->current->cids_they_want, cid);
else { else {
struct CidEntry* entry = ipfs_bitswap_peer_request_cid_entry_new(); struct CidEntry* cidEntry = ipfs_bitswap_peer_request_cid_entry_new();
entry->cid = cid; cidEntry->cid = cid;
entry->cancel = 0; cidEntry->cancel = 0;
libp2p_utils_vector_add(queueEntry->current->cids_they_want, entry); libp2p_utils_vector_add(queueEntry->current->cids_they_want, cidEntry);
} }
} }
} }

View file

@ -160,6 +160,39 @@ struct PeerRequestEntry* ipfs_bitswap_peer_request_queue_find_entry(struct PeerR
return NULL; return NULL;
} }
/***
* Determine if any of the cids in the list are waiting to be filled
* @param cidEntries a Vector of CidEntry objects
* @returns true(1) if we have some waiting, false(0) otherwise
*/
int ipfs_bitswap_peer_request_cids_waiting(struct Libp2pVector* cidEntries) {
if (cidEntries == NULL)
return 0;
for(int i = 0; i < cidEntries->total; i++) {
const struct CidEntry* entry = (const struct CidEntry*)libp2p_utils_vector_get(cidEntries, i);
if (entry != NULL && !entry->cancel)
return 1;
}
return 0;
}
/***
* Determine if there is something to process in this request
* @param entry the entry to look at
* @returns true(1) if there is something to do
*/
int ipfs_bitswap_peer_request_something_to_do(struct PeerRequestEntry* entry) {
if (entry != NULL) {
struct PeerRequest* request = entry->current;
if (request->blocks_we_want_to_send->total > 0)
return 1;
if (request->cids_we_want->total > 0)
return 1;
if (ipfs_bitswap_peer_request_cids_waiting(request->cids_they_want))
return 1;
}
return 0;
}
/** /**
* Pull a PeerRequest off the queue * Pull a PeerRequest off the queue
@ -171,13 +204,17 @@ struct PeerRequest* ipfs_bitswap_peer_request_queue_pop(struct PeerRequestQueue*
if (queue != NULL) { if (queue != NULL) {
pthread_mutex_lock(&queue->queue_mutex); pthread_mutex_lock(&queue->queue_mutex);
struct PeerRequestEntry* entry = queue->first; struct PeerRequestEntry* entry = queue->first;
if (entry != NULL) { if (entry != NULL && ipfs_bitswap_peer_request_something_to_do(entry)) {
retVal = entry->current; retVal = entry->current;
queue->first = queue->first->next; queue->first = queue->first->next;
} }
pthread_mutex_unlock(&queue->queue_mutex); pthread_mutex_unlock(&queue->queue_mutex);
// disable temporarily
// JMJ Debugging
/*
if (entry != NULL) if (entry != NULL)
ipfs_bitswap_peer_request_entry_free(entry); ipfs_bitswap_peer_request_entry_free(entry);
*/
} }
return retVal; return retVal;
} }
@ -246,22 +283,6 @@ int ipfs_bitswap_peer_request_get_blocks_they_want(const struct BitswapContext*
return 0; return 0;
} }
/***
* Determine if any of the cids in the list are waiting to be filled
* @param cidEntries a Vector of CidEntry objects
* @returns true(1) if we have some waiting, false(0) otherwise
*/
int ipfs_peer_request_cids_waiting(struct Libp2pVector* cidEntries) {
if (cidEntries == NULL)
return 0;
for(int i = 0; i < cidEntries->total; i++) {
const struct CidEntry* entry = (const struct CidEntry*)libp2p_utils_vector_get(cidEntries, i);
if (entry != NULL && !entry->cancel)
return 1;
}
return 0;
}
/**** /****
* Handle a PeerRequest * Handle a PeerRequest
* @param context the BitswapContext * @param context the BitswapContext
@ -281,7 +302,7 @@ int ipfs_bitswap_peer_request_process_entry(const struct BitswapContext* context
} }
// determine if we're connected // determine if we're connected
int connected = request->peer->is_local || request->peer->connection_type == CONNECTION_TYPE_CONNECTED; int connected = request->peer->is_local || request->peer->connection_type == CONNECTION_TYPE_CONNECTED;
int need_to_connect = request->cids_we_want->total != 0 || ipfs_peer_request_cids_waiting(request->cids_they_want) || request->blocks_we_want_to_send->total != 0; int need_to_connect = request->cids_we_want->total != 0 || ipfs_bitswap_peer_request_cids_waiting(request->cids_they_want) || request->blocks_we_want_to_send->total != 0;
// determine if we need to connect // determine if we need to connect
if (need_to_connect) { if (need_to_connect) {

View file

@ -604,7 +604,7 @@ int test_routing_retrieve_large_file() {
stat(temp_file_name, &buf); stat(temp_file_name, &buf);
if (buf.st_size != 1000000) { if (buf.st_size != 1000000) {
fprintf(stderr, "File size should be 1000000, but is %lu\n", buf.st_size); fprintf(stderr, "File size should be 1000000, but is %lu\n", (unsigned long)buf.st_size);
goto exit; goto exit;
} }

View file

@ -306,6 +306,10 @@ static void thread_hold(int sig_id) {
} }
#if defined(__APPLE__) && defined(__MACH__)
int pthread_setname_np(const char* name);
#endif
/* What each thread is doing /* What each thread is doing
* *
* In principle this is an endless loop. The only time this loop gets interuppted is once * In principle this is an endless loop. The only time this loop gets interuppted is once