1
0

Statistics.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # Written by Edward Keyes
  2. # see LICENSE.txt for license information
  3. from threading import Event
  4. try:
  5. True
  6. except:
  7. True = 1
  8. False = 0
  9. class Statistics_Response:
  10. pass # empty class
  11. class Statistics:
  12. def __init__(self, upmeasure, downmeasure, connecter, httpdl,
  13. ratelimiter, rerequest_lastfailed, fdatflag):
  14. self.upmeasure = upmeasure
  15. self.downmeasure = downmeasure
  16. self.connecter = connecter
  17. self.httpdl = httpdl
  18. self.ratelimiter = ratelimiter
  19. self.downloader = connecter.downloader
  20. self.picker = connecter.downloader.picker
  21. self.storage = connecter.downloader.storage
  22. self.torrentmeasure = connecter.downloader.totalmeasure
  23. self.rerequest_lastfailed = rerequest_lastfailed
  24. self.fdatflag = fdatflag
  25. self.fdatactive = False
  26. self.piecescomplete = None
  27. self.placesopen = None
  28. self.storage_totalpieces = len(self.storage.hashes)
  29. def set_dirstats(self, files, piece_length):
  30. self.piecescomplete = 0
  31. self.placesopen = 0
  32. self.filelistupdated = Event()
  33. self.filelistupdated.set()
  34. frange = xrange(len(files))
  35. self.filepieces = [[] for x in frange]
  36. self.filepieces2 = [[] for x in frange]
  37. self.fileamtdone = [0.0 for x in frange]
  38. self.filecomplete = [False for x in frange]
  39. self.fileinplace = [False for x in frange]
  40. start = 0L
  41. for i in frange:
  42. l = files[i][1]
  43. if l == 0:
  44. self.fileamtdone[i] = 1.0
  45. self.filecomplete[i] = True
  46. self.fileinplace[i] = True
  47. else:
  48. fp = self.filepieces[i]
  49. fp2 = self.filepieces2[i]
  50. for piece in range(int(start/piece_length),
  51. int((start+l-1)/piece_length)+1):
  52. fp.append(piece)
  53. fp2.append(piece)
  54. start += l
  55. def update(self):
  56. s = Statistics_Response()
  57. s.upTotal = self.upmeasure.get_total()
  58. s.downTotal = self.downmeasure.get_total()
  59. s.last_failed = self.rerequest_lastfailed()
  60. s.external_connection_made = self.connecter.external_connection_made
  61. if s.downTotal > 0:
  62. s.shareRating = float(s.upTotal)/s.downTotal
  63. elif s.upTotal == 0:
  64. s.shareRating = 0.0
  65. else:
  66. s.shareRating = -1.0
  67. s.torrentRate = self.torrentmeasure.get_rate()
  68. s.torrentTotal = self.torrentmeasure.get_total()
  69. s.numSeeds = self.picker.seeds_connected
  70. s.numOldSeeds = self.downloader.num_disconnected_seeds()
  71. s.numPeers = len(self.downloader.downloads)-s.numSeeds
  72. s.numCopies = 0.0
  73. for i in self.picker.crosscount:
  74. if i==0:
  75. s.numCopies+=1
  76. else:
  77. s.numCopies+=1-float(i)/self.picker.numpieces
  78. break
  79. if self.picker.done:
  80. s.numCopies2 = s.numCopies + 1
  81. else:
  82. s.numCopies2 = 0.0
  83. for i in self.picker.crosscount2:
  84. if i==0:
  85. s.numCopies2+=1
  86. else:
  87. s.numCopies2+=1-float(i)/self.picker.numpieces
  88. break
  89. s.discarded = self.downloader.discarded
  90. s.numSeeds += self.httpdl.seedsfound
  91. s.numOldSeeds += self.httpdl.seedsfound
  92. if s.numPeers == 0 or self.picker.numpieces == 0:
  93. s.percentDone = 0.0
  94. else:
  95. s.percentDone = 100.0*(float(self.picker.totalcount)/self.picker.numpieces)/s.numPeers
  96. s.backgroundallocating = self.storage.bgalloc_active
  97. s.storage_totalpieces = len(self.storage.hashes)
  98. s.storage_active = len(self.storage.stat_active)
  99. s.storage_new = len(self.storage.stat_new)
  100. s.storage_dirty = len(self.storage.dirty)
  101. numdownloaded = self.storage.stat_numdownloaded
  102. s.storage_justdownloaded = numdownloaded
  103. s.storage_numcomplete = self.storage.stat_numfound + numdownloaded
  104. s.storage_numflunked = self.storage.stat_numflunked
  105. s.storage_isendgame = self.downloader.endgamemode
  106. s.peers_kicked = self.downloader.kicked.items()
  107. s.peers_banned = self.downloader.banned.items()
  108. try:
  109. s.upRate = int(self.ratelimiter.upload_rate/1000)
  110. assert s.upRate < 5000
  111. except:
  112. s.upRate = 0
  113. s.upSlots = self.ratelimiter.slots
  114. if self.piecescomplete is None: # not a multi-file torrent
  115. return s
  116. if self.fdatflag.isSet():
  117. if not self.fdatactive:
  118. self.fdatactive = True
  119. else:
  120. self.fdatactive = False
  121. if self.piecescomplete != self.picker.numgot:
  122. for i in xrange(len(self.filecomplete)):
  123. if self.filecomplete[i]:
  124. continue
  125. oldlist = self.filepieces[i]
  126. newlist = [ piece
  127. for piece in oldlist
  128. if not self.storage.have[piece] ]
  129. if len(newlist) != len(oldlist):
  130. self.filepieces[i] = newlist
  131. self.fileamtdone[i] = (
  132. (len(self.filepieces2[i])-len(newlist))
  133. /float(len(self.filepieces2[i])) )
  134. if not newlist:
  135. self.filecomplete[i] = True
  136. self.filelistupdated.set()
  137. self.piecescomplete = self.picker.numgot
  138. if ( self.filelistupdated.isSet()
  139. or self.placesopen != len(self.storage.places) ):
  140. for i in xrange(len(self.filecomplete)):
  141. if not self.filecomplete[i] or self.fileinplace[i]:
  142. continue
  143. while self.filepieces2[i]:
  144. piece = self.filepieces2[i][-1]
  145. if self.storage.places[piece] != piece:
  146. break
  147. del self.filepieces2[i][-1]
  148. if not self.filepieces2[i]:
  149. self.fileinplace[i] = True
  150. self.storage.set_file_readonly(i)
  151. self.filelistupdated.set()
  152. self.placesopen = len(self.storage.places)
  153. s.fileamtdone = self.fileamtdone
  154. s.filecomplete = self.filecomplete
  155. s.fileinplace = self.fileinplace
  156. s.filelistupdated = self.filelistupdated
  157. return s