diff --git a/plugins/Stats/StatsPlugin.py b/plugins/Stats/StatsPlugin.py
index 8ee87133..2961490d 100644
--- a/plugins/Stats/StatsPlugin.py
+++ b/plugins/Stats/StatsPlugin.py
@@ -143,8 +143,8 @@ class UiRequestPlugin(object):
connection_id = peer.connection.id
else:
connection_id = None
- yield "Optional files: %s " % len(peer.hashfield)
- yield "(#%s, err: %s, found: %s min ago) %22s -
" % (connection_id, peer.connection_error, time_found, key)
+ yield "Optional files: %4s " % len(peer.hashfield)
+ yield "(#%4s, err: %s, found: %5s min ago) %22s -
" % (connection_id, peer.connection_error, time_found, key)
yield "
"
yield ""
diff --git a/src/Config.py b/src/Config.py
index d26dd899..7cd71225 100644
--- a/src/Config.py
+++ b/src/Config.py
@@ -7,8 +7,8 @@ import ConfigParser
class Config(object):
def __init__(self, argv):
- self.version = "0.3.2"
- self.rev = 571
+ self.version = "0.3.3"
+ self.rev = 580
self.argv = argv
self.action = None
self.createParser()
diff --git a/src/Db/Db.py b/src/Db/Db.py
index 4a5b043c..591ee206 100644
--- a/src/Db/Db.py
+++ b/src/Db/Db.py
@@ -159,6 +159,8 @@ class Db:
cur.execute("COMMIT")
self.log.debug("Db check done in %.3fs, changed tables: %s" % (time.time() - s, changed_tables))
+ if changed_tables:
+ self.db_keyvalues = {} # Refresh table version cache
return changed_tables
diff --git a/src/File/FileServer.py b/src/File/FileServer.py
index 209c4a48..7e97b4e8 100644
--- a/src/File/FileServer.py
+++ b/src/File/FileServer.py
@@ -198,6 +198,7 @@ class FileServer(ConnectionServer):
if first_announce: # Send my optional files to peers
site.sendMyHashfield()
+ site.updateHashfield()
time.sleep(2) # Prevent too quick request
@@ -211,7 +212,8 @@ class FileServer(ConnectionServer):
config.loadTrackersFile()
for address, site in self.sites.items():
site.announce(num=1, pex=False)
- site.sendMyHashfield(num_send=1)
+ site.sendMyHashfield(3)
+ site.updateHashfield(1)
time.sleep(2)
first_announce = False
diff --git a/src/Site/Site.py b/src/Site/Site.py
index 4acd754a..8e91ed9c 100644
--- a/src/Site/Site.py
+++ b/src/Site/Site.py
@@ -131,6 +131,9 @@ class Site:
file_threads.append(res) # Append evt
# Optionals files
+ if inner_path == "content.json":
+ gevent.spawn(self.updateHashfield)
+
if self.settings.get("autodownloadoptional"):
for file_relative_path in self.content_manager.contents[inner_path].get("files_optional", {}).keys():
file_inner_path = content_inner_dir + file_relative_path
@@ -223,9 +226,10 @@ class Site:
if not self.peers:
self.announce()
for wait in range(10):
- time.sleep(5+wait)
+ time.sleep(5 + wait)
self.log.debug("Waiting for peers...")
- if self.peers: break
+ if self.peers:
+ break
peers = self.peers.values()
random.shuffle(peers)
@@ -247,7 +251,6 @@ class Site:
if not queried:
gevent.joinall(updaters, timeout=10) # Wait another 10 sec if none of updaters finished
-
time.sleep(0.1)
self.log.debug("Queried listModifications from: %s" % queried)
return queried
@@ -751,19 +754,39 @@ class Site:
self.log.debug("Cleanup peers result: Removed %s, left: %s" % (removed, len(self.peers)))
# Send hashfield to peers
- def sendMyHashfield(self, num_send=3):
+ def sendMyHashfield(self, limit=3):
if not self.content_manager.hashfield: # No optional files
return False
- num_sent = 0
+
+ sent = 0
connected_peers = self.getConnectedPeers()
for peer in connected_peers:
if peer.sendMyHashfield():
- num_sent += 1
- if num_sent >= num_send:
+ sent += 1
+ if sent >= limit:
break
- if num_sent:
- self.log.debug("Sent my hashfield to %s peers" % num_sent)
- return num_sent
+ if sent:
+ self.log.debug("Sent my hashfield to %s peers" % sent)
+ return sent
+
+ # Update hashfield
+ def updateHashfield(self, limit=3):
+ # Return if no optional files
+ if not self.content_manager.hashfield and not self.content_manager.contents.get("content.json", {}).get("files_optional", {}):
+ return False
+
+ queried = 0
+ connected_peers = self.getConnectedPeers()
+ for peer in connected_peers:
+ if peer.time_hashfield:
+ continue
+ if peer.updateHashfield():
+ queried += 1
+ if queried >= limit:
+ break
+ if queried:
+ self.log.debug("Queried hashfield from %s peers" % queried)
+ return queried
# - Events -
diff --git a/src/Site/SiteManager.py b/src/Site/SiteManager.py
index 19f8b44a..3890f8b1 100644
--- a/src/Site/SiteManager.py
+++ b/src/Site/SiteManager.py
@@ -77,6 +77,7 @@ class SiteManager(object):
# Lazy load sites
def list(self):
+ logging.debug("Loading sites...")
if self.sites is None: # Not loaded yet
self.load()
return self.sites
diff --git a/src/Worker/WorkerManager.py b/src/Worker/WorkerManager.py
index b969e07b..87ff5743 100644
--- a/src/Worker/WorkerManager.py
+++ b/src/Worker/WorkerManager.py
@@ -244,6 +244,7 @@ class WorkerManager:
gevent.joinall(threads, timeout=5)
found = self.findOptionalTasks(optional_tasks)
+ self.log.debug("Found optional files after query hashtable connected peers: %s/%s" % (len(found), len(optional_hash_ids)))
if found:
found_peers = set([peer for hash_id_peers in found.values() for peer in hash_id_peers])
@@ -265,6 +266,7 @@ class WorkerManager:
found_ips = helper.mergeDicts([thread.value for thread in threads if thread.value])
found = self.addOptionalPeers(found_ips)
+ self.log.debug("Found optional files after findhash connected peers: %s/%s" % (len(found), len(optional_hash_ids)))
if found:
found_peers = set([peer for hash_id_peers in found.values() for peer in hash_id_peers])