Prechádzať zdrojové kódy

Get the correct uploaded data size

Subtract msgHdrLen_ from writtenLength to get the uploaded data size.
Without this correction, the seeder assumes it has uploaded more data
than it actually has.
Tatsuhiro Tsujikawa 13 rokov pred
rodič
commit
b2893f1e31
2 zmenil súbory, kde vykonal 15 pridanie a 5 odobranie
  1. 14 5
      src/BtPieceMessage.cc
  2. 1 0
      src/BtPieceMessage.h

+ 14 - 5
src/BtPieceMessage.cc

@@ -67,6 +67,7 @@ BtPieceMessage::BtPieceMessage
     index_(index),
     begin_(begin),
     blockLength_(blockLength),
+    msgHdrLen_(0),
     data_(0)
 {
   setUploading(true);
@@ -179,17 +180,25 @@ void BtPieceMessage::send()
                     getPeer()->getPort(),
                     toString().c_str()));
     unsigned char* msgHdr = createMessageHeader();
-    size_t msgHdrLen = getMessageHeaderLength();
+    msgHdrLen_ = getMessageHeaderLength();
     A2_LOG_DEBUG(fmt("msglength = %lu bytes",
-                     static_cast<unsigned long>(msgHdrLen+blockLength_)));
-    getPeerConnection()->pushBytes(msgHdr, msgHdrLen);
+                     static_cast<unsigned long>(msgHdrLen_+blockLength_)));
+    getPeerConnection()->pushBytes(msgHdr, msgHdrLen_);
     int64_t pieceDataOffset =
       static_cast<int64_t>(index_)*downloadContext_->getPieceLength()+begin_;
     pushPieceData(pieceDataOffset, blockLength_);
   }
   writtenLength = getPeerConnection()->sendPendingData();
-  getPeer()->updateUploadLength(writtenLength);
-  downloadContext_->updateUploadLength(writtenLength);
+  // Subtract msgHdrLen_ from writtenLength to get the uploaded data
+  // size.
+  if(writtenLength > msgHdrLen_) {
+    writtenLength -= msgHdrLen_;
+    msgHdrLen_ = 0;
+    getPeer()->updateUploadLength(writtenLength);
+    downloadContext_->updateUploadLength(writtenLength);
+  } else {
+    msgHdrLen_ -= writtenLength;
+  }
   setSendingInProgress(!getPeerConnection()->sendBufferIsEmpty());
 }
 

+ 1 - 0
src/BtPieceMessage.h

@@ -48,6 +48,7 @@ private:
   size_t index_;
   int32_t begin_;
   int32_t blockLength_;
+  size_t msgHdrLen_;
   const unsigned char* data_;
   SharedHandle<DownloadContext> downloadContext_;
   SharedHandle<PeerStorage> peerStorage_;