From 34f5bc93ae256c92b6a6ced5bc542a2339df5c44 Mon Sep 17 00:00:00 2001
From: Kay Kurokawa <kay@lbry.io>
Date: Thu, 9 Feb 2017 10:09:58 -0500
Subject: [PATCH] adding immediate announce option to hash announce

---
 lbrynet/core/server/DHTHashAnnouncer.py         | 9 ++++++---
 tests/unit/core/server/test_DHTHashAnnouncer.py | 9 ++++++++-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/lbrynet/core/server/DHTHashAnnouncer.py b/lbrynet/core/server/DHTHashAnnouncer.py
index 98e5a24bb..a68a97d0f 100644
--- a/lbrynet/core/server/DHTHashAnnouncer.py
+++ b/lbrynet/core/server/DHTHashAnnouncer.py
@@ -39,7 +39,7 @@ class DHTHashAnnouncer(object):
 
     def immediate_announce(self, blob_hashes):
         if self.peer_port is not None:
-            return self._announce_hashes(blob_hashes)
+            return self._announce_hashes(blob_hashes, immediate=True)
         else:
             return defer.succeed(False)
 
@@ -56,7 +56,7 @@ class DHTHashAnnouncer(object):
         dl = defer.DeferredList(ds)
         return dl
 
-    def _announce_hashes(self, hashes):
+    def _announce_hashes(self, hashes, immediate=False):
         if not hashes:
             return
         log.debug('Announcing %s hashes', len(hashes))
@@ -67,7 +67,10 @@ class DHTHashAnnouncer(object):
         for h in hashes:
             announce_deferred = defer.Deferred()
             ds.append(announce_deferred)
-            self.hash_queue.append((h, announce_deferred))
+            if immediate:
+                self.hash_queue.appendleft((h, announce_deferred))
+            else:
+                self.hash_queue.append((h, announce_deferred))
         log.debug('There are now %s hashes remaining to be announced', self.hash_queue_size())
 
         def announce():
diff --git a/tests/unit/core/server/test_DHTHashAnnouncer.py b/tests/unit/core/server/test_DHTHashAnnouncer.py
index 726f03749..c6bb05967 100644
--- a/tests/unit/core/server/test_DHTHashAnnouncer.py
+++ b/tests/unit/core/server/test_DHTHashAnnouncer.py
@@ -42,9 +42,16 @@ class DHTHashAnnouncerTest(unittest.TestCase):
 
     def test_basic(self):
         self.announcer._announce_available_hashes()
+        self.assertEqual(self.announcer.hash_queue_size(),self.announcer.CONCURRENT_ANNOUNCERS)
         self.clock.advance(1)
         self.assertEqual(self.dht_node.blobs_announced, self.num_blobs)
         self.assertEqual(self.announcer.hash_queue_size(), 0)
 
-
+    def test_immediate_announce(self):
+        # Test that immediate announce puts a hash at the front of the queue
+        self.announcer._announce_available_hashes()
+        blob_hash = binascii.b2a_hex(os.urandom(32))
+        self.announcer.immediate_announce([blob_hash])
+        self.assertEqual(self.announcer.hash_queue_size(),self.announcer.CONCURRENT_ANNOUNCERS+1)
+        self.assertEqual(blob_hash, self.announcer.hash_queue[0][0])