Procházet 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 před 13 roky
rodič
revize
b2893f1e31
2 změnil soubory, kde provedl 15 přidání a 5 odebrání
  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_;