[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r34165 - gnunet/src/dht
From: |
gnunet |
Subject: |
[GNUnet-SVN] r34165 - gnunet/src/dht |
Date: |
Mon, 18 Aug 2014 12:52:40 +0200 |
Author: supriti
Date: 2014-08-18 12:52:40 +0200 (Mon, 18 Aug 2014)
New Revision: 34165
Modified:
gnunet/src/dht/gnunet-service-xdht_neighbours.c
Log:
xvine fixes
Modified: gnunet/src/dht/gnunet-service-xdht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-xdht_neighbours.c 2014-08-18 03:53:55 UTC
(rev 34164)
+++ gnunet/src/dht/gnunet-service-xdht_neighbours.c 2014-08-18 10:52:40 UTC
(rev 34165)
@@ -52,6 +52,13 @@
* hashing.
*/
+
+/**
+ * FIXME: URGENT
+ * We should have a message type like notify successor result. only when
+ * this message is being recvied by the new successor. we should schedule
+ * another round of verify successor.
+ */
#define DEBUG(...) \
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
@@ -2568,6 +2575,8 @@
uint64_t finger_id_value;
/* Schedule another send_find_finger_trail_message task. */
+ find_finger_trail_task_next_send_time =
+ GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
find_finger_trail_task =
GNUNET_SCHEDULER_add_delayed (find_finger_trail_task_next_send_time,
&send_find_finger_trail_message,
@@ -2616,18 +2625,19 @@
* 2. if the new trail is completely disjoint than the
* other trails, then may be choosing it is better.
*
- * @param existing_finger
- * @param new_finger_trail
- * @param new_finger_trail_length
- * @param new_finger_trail_id
+ * @param finger Finger
+ * @param new_finger_trail List of peers to reach from me to @a finger, NOT
+ * including the endpoints.
+ * @param new_finger_trail_length Total number of peers in @a new_finger_trail
+ * @param new_finger_trail_id Unique identifier of @a new_finger_trail.
*/
static void
-select_and_replace_trail (struct FingerInfo *existing_finger,
+select_and_replace_trail (struct FingerInfo *finger,
const struct GNUNET_PeerIdentity *new_trail,
unsigned int new_trail_length,
struct GNUNET_HashCode new_trail_id)
{
- struct Trail *trail_list_iterator;
+ struct Trail *trail;
unsigned int largest_trail_length;
unsigned int largest_trail_index;
struct Trail_Element *trail_element;
@@ -2636,14 +2646,14 @@
largest_trail_length = new_trail_length;
largest_trail_index = MAXIMUM_TRAILS_PER_FINGER + 1;
- GNUNET_assert (MAXIMUM_TRAILS_PER_FINGER == existing_finger->trails_count);
+ GNUNET_assert (MAXIMUM_TRAILS_PER_FINGER == finger->trails_count);
- for (i = 0; i < existing_finger->trails_count; i++)
+ for (i = 0; i < finger->trails_count; i++)
{
- trail_list_iterator = &existing_finger->trail_list[i];
- if (trail_list_iterator->trail_length > largest_trail_length)
+ trail = &finger->trail_list[i];
+ if (trail->trail_length > largest_trail_length)
{
- largest_trail_length = trail_list_iterator->trail_length;
+ largest_trail_length = trail->trail_length;
largest_trail_index = i;
}
}
@@ -2662,8 +2672,8 @@
}
/* Send trail teardown message across the replaced trail. */
- struct Trail *replace_trail =
&existing_finger->trail_list[largest_trail_index];
- existing_finger->trail_list[largest_trail_index].is_present = GNUNET_NO;
+ struct Trail *replace_trail = &finger->trail_list[largest_trail_index];
+
GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail
(replace_trail->trail_id));
GDS_NEIGHBOURS_send_trail_teardown (replace_trail->trail_id,
GDS_ROUTING_SRC_TO_DEST,
@@ -2680,9 +2690,8 @@
replace_trail->is_present = GNUNET_YES;
replace_trail->trail_length = new_trail_length;
replace_trail->trail_id = new_trail_id;
- //FIXME: Do we need to add pointers for head and tail.
- i = 0;
- while (i < new_trail_length)
+
+ for (i = 0; i < new_trail_length; i++)
{
struct Trail_Element *element = GNUNET_new (struct Trail_Element);
element->peer = new_trail[i];
@@ -2691,6 +2700,7 @@
replace_trail->trail_tail,
element);
}
+ /* FIXME: Are we adding the trail back to the list. */
}
@@ -2708,46 +2718,45 @@
const struct GNUNET_PeerIdentity *new_trail,
unsigned int trail_length)
{
- struct Trail *trail_list_iterator;
+ struct Trail *trail;
struct Trail_Element *trail_element;
int i;
int j;
- int trail_unique = GNUNET_NO;
-
+
GNUNET_assert (existing_finger->trails_count > 0);
/* Iterate over list of trails. */
for (i = 0; i < existing_finger->trails_count; i++)
{
- trail_list_iterator = &(existing_finger->trail_list[i]);
- GNUNET_assert (GNUNET_YES == trail_list_iterator->is_present);
+ trail = &(existing_finger->trail_list[i]);
+ GNUNET_assert (GNUNET_YES == trail->is_present);
/* New trail and existing trail length are not same. */
- if (trail_list_iterator->trail_length != trail_length)
+ if (trail->trail_length != trail_length)
{
- trail_unique = GNUNET_YES;
- break;
+ return GNUNET_YES;
}
- trail_element = trail_list_iterator->trail_head;
+ trail_element = trail->trail_head;
GNUNET_assert (trail_element != NULL);
- for (j = 0; j < trail_list_iterator->trail_length; j++)
+ for (j = 0; j < trail->trail_length; j++)
{
if (0 != GNUNET_CRYPTO_cmp_peer_identity (&new_trail[j],
&trail_element->peer))
{
- trail_unique = GNUNET_YES;
- break;
+ return GNUNET_YES;
}
trail_element = trail_element->next;
}
}
-
- return trail_unique;
+ return GNUNET_NO;
}
-/**
+/**
+ * FIXME; In case of multiple trails, we may have a case where a trail from in
+ * between has been removed, then we should try to find a free slot , not
simply
+ * add a trail at then end of the list.
* Add a new trail to existing finger. This function is called only when finger
* is not my own identity or a friend.
* @param existing_finger Finger
@@ -2761,22 +2770,24 @@
unsigned int new_trail_length,
struct GNUNET_HashCode new_trail_id)
{
- struct Trail *trail_list_iterator;
+ struct Trail *trail;
struct FriendInfo *first_friend;
int i;
-
+ int index;
+
if (GNUNET_NO == is_new_trail_unique (existing_finger, new_trail,
new_trail_length))
{
return;
}
-
- trail_list_iterator =
&existing_finger->trail_list[existing_finger->trails_count];
- GNUNET_assert (GNUNET_NO == trail_list_iterator->is_present);
- trail_list_iterator->trail_id = new_trail_id;
- trail_list_iterator->trail_length = new_trail_length;
+
+ index = existing_finger->trails_count;
+ trail = &existing_finger->trail_list[index];
+ GNUNET_assert (GNUNET_NO == trail->is_present);
+ trail->trail_id = new_trail_id;
+ trail->trail_length = new_trail_length;
existing_finger->trails_count++;
- trail_list_iterator->is_present = GNUNET_YES;
+ trail->is_present = GNUNET_YES;
GNUNET_assert (NULL == (GNUNET_CONTAINER_multipeermap_get (friend_peermap,
&existing_finger->finger_identity)));
@@ -2793,12 +2804,16 @@
element = GNUNET_new (struct Trail_Element);
element->peer = new_trail[i];
- GNUNET_CONTAINER_DLL_insert_tail (trail_list_iterator->trail_head,
- trail_list_iterator->trail_tail,
+ GNUNET_CONTAINER_DLL_insert_tail (trail->trail_head,
+ trail->trail_tail,
element);
}
/* Do we need to add trail head and trail tail in the trail list itearator.*/
-
+ existing_finger->trail_list[index].trail_head = trail->trail_head;
+ existing_finger->trail_list[index].trail_tail = trail->trail_tail;
+ existing_finger->trail_list[index].trail_length = new_trail_length;
+ existing_finger->trail_list[index].trail_id = new_trail_id;
+ existing_finger->trail_list[index].is_present = GNUNET_YES;
}
@@ -2829,10 +2844,19 @@
GNUNET_break(0);
return;
}
+
GNUNET_assert (0 != GNUNET_CRYPTO_cmp_peer_identity
(&finger->finger_identity,
&my_identity));
- GNUNET_assert (trail->is_present == GNUNET_YES);
+ /*FIXME: here was an assertion that trail->is_present = GNUNET_YES. But it
+ used to fail. We have removed assertion with a condition, just for now.
+ Find out the reason why assertion failed. */
+ if (trail->is_present == GNUNET_NO)
+ {
+ DEBUG(" trail id %s of peer %s is not present to send a trail teardown
message., line",
+ GNUNET_i2s(&my_identity), GNUNET_h2s(&trail->trail_id), __LINE__);
+ return;
+ }
/* Finger is not a friend. */
if (trail->trail_length > 0)
@@ -2848,7 +2872,7 @@
&finger->finger_identity)));
}
- GNUNET_assert (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop,
&friend->id)); //Fixme: assertion fails.
+ GNUNET_assert (0 == GNUNET_CRYPTO_cmp_peer_identity (next_hop,
&friend->id));
GNUNET_assert (GNUNET_YES == GDS_ROUTING_remove_trail (trail->trail_id));
friend->trails_count--;
GDS_NEIGHBOURS_send_trail_teardown (trail->trail_id,
@@ -2865,7 +2889,6 @@
send_all_finger_trails_teardown (struct FingerInfo *finger)
{
unsigned int i;
-
for (i = 0; i < finger->trails_count; i++)
{
struct Trail *trail;
@@ -2902,26 +2925,21 @@
/**
* Free finger and its trail.
* @param finger Finger to be freed.
+ * @param finger_table_index Index at which finger is stored.
*/
static void
free_finger (struct FingerInfo *finger, unsigned int finger_table_index)
{
struct Trail *trail;
unsigned int i;
-
- /* Free all the trails to reach to finger */
for (i = 0; i < finger->trails_count; i++)
{
trail = &finger->trail_list[i];
- //FIXME: Check if there are any missing entry in this list because of
- // how we insert. If not then no need of this check.
if (GNUNET_NO == trail->is_present)
continue;
if (trail->trail_length > 0)
- {
free_trail (trail);
- }
trail->is_present = GNUNET_NO;
}
@@ -3044,6 +3062,8 @@
unsigned int j = 0;
struct FingerInfo *successor;
+ verify_successor_next_send_time =
+ GNUNET_TIME_STD_BACKOFF(verify_successor_next_send_time);
/* Schedule another send_find_finger_trail_message task. */
verify_successor_next_send_time.rel_value_us =
DHT_SEND_VERIFY_SUCCESSOR_INTERVAL.rel_value_us +
@@ -3146,14 +3166,10 @@
if (0 != GNUNET_CRYPTO_cmp_peer_identity (&my_identity, &finger_identity))
{
if (GNUNET_SCHEDULER_NO_TASK == send_verify_successor_task)
+ {
+ DEBUG (" schedule");
send_verify_successor_task =
GNUNET_SCHEDULER_add_now (&send_verify_successor_message,
NULL);
- else
- {
- /* we already have scheduled a send_verify_sucessor_task, we should
slow
- it down now. */
- verify_successor_next_send_time =
- GNUNET_TIME_STD_BACKOFF(verify_successor_next_send_time);
}
}
return;
@@ -3238,15 +3254,14 @@
/**
* Remove finger and its associated data structures from finger table.
- * @param finger Finger to be removed.
+ * @param existing_finger Finger to be removed which is in finger table.
+ * @param finger_table_index Index in finger table where @a existing_finger
+ * is stored.
*/
static void
remove_existing_finger (struct FingerInfo *existing_finger,
unsigned int finger_table_index)
{
- if(0 == GNUNET_CRYPTO_cmp_peer_identity (&existing_finger->finger_identity,
- &my_identity));
- return;
GNUNET_assert (GNUNET_YES == existing_finger->is_present);
/* If I am my own finger, then we have no trails. */
@@ -3325,9 +3340,6 @@
&successor->finger_identity))
{
current_search_finger_index = 0;
- /* We slow down the find_finger_trail_task as we have completed the
circle. */
- find_finger_trail_task_next_send_time =
- GNUNET_TIME_STD_BACKOFF(find_finger_trail_task_next_send_time);
return;
}
@@ -5687,6 +5699,7 @@
/* got a first connection, good time to start with FIND FINGER TRAIL
requests...*/
if (GNUNET_SCHEDULER_NO_TASK == find_finger_trail_task)
{
+ DEBUG ("sCHEDULING FINGER TASK");
find_finger_trail_task_next_send_time.rel_value_us =
DHT_FIND_FINGER_TRAIL_INTERVAL.rel_value_us +
GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r34165 - gnunet/src/dht,
gnunet <=