فهرست منبع

2009-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Fixed the bug that slow server is not knocked down in favor of
	faster one.
	* src/AbstractCommand.cc
	* src/DefaultPieceStorage.cc
	* src/DefaultPieceStorage.h
	* src/PieceStorage.h
	* src/UnknownLengthPieceStorage.cc
	* src/UnknownLengthPieceStorage.h
	* test/MockPieceStorage.h
Tatsuhiro Tsujikawa 16 سال پیش
والد
کامیت
60e3e46c52

+ 12 - 0
ChangeLog

@@ -1,3 +1,15 @@
+2009-11-20  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Fixed the bug that slow server is not knocked down in favor of
+	faster one.
+	* src/AbstractCommand.cc
+	* src/DefaultPieceStorage.cc
+	* src/DefaultPieceStorage.h
+	* src/PieceStorage.h
+	* src/UnknownLengthPieceStorage.cc
+	* src/UnknownLengthPieceStorage.h
+	* test/MockPieceStorage.h
+
 2009-11-20  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Fixed the bug that Request object is not added to

+ 3 - 3
src/AbstractCommand.cc

@@ -105,9 +105,9 @@ bool AbstractCommand::execute() {
       return true;
     }
     // TODO it is not needed to check other PeerStats every time.
-    // Find faster Request when this is the only active Request
-    if(!req.isNull() && _requestGroup->getNumStreamConnection() == 1 &&
-       _fileEntry->countPooledRequest() > 0) {
+    // Find faster Request when no segment is available.
+    if(!req.isNull() && _fileEntry->countPooledRequest() > 0 &&
+       !_requestGroup->getPieceStorage()->hasMissingUnusedPiece()) {
       SharedHandle<Request> fasterRequest = _fileEntry->findFasterRequest(req);
       if(!fasterRequest.isNull()) {
 	logger->info("CUID#%d - Use faster Request hostname=%s, port=%u",

+ 6 - 0
src/DefaultPieceStorage.cc

@@ -196,6 +196,12 @@ bool DefaultPieceStorage::hasMissingPiece(const PeerHandle& peer)
 				      peer->getBitfieldLength());
 }
 
+bool DefaultPieceStorage::hasMissingUnusedPiece()
+{
+  size_t index;
+  return bitfieldMan->getFirstMissingUnusedIndex(index);
+}
+
 PieceHandle DefaultPieceStorage::getMissingPiece(const SharedHandle<Peer>& peer)
 {
   return getMissingPiece(peer->getBitfield(), peer->getBitfieldLength());

+ 2 - 0
src/DefaultPieceStorage.h

@@ -121,6 +121,8 @@ public:
 
   virtual bool hasMissingPiece(const SharedHandle<Peer>& peer);
 
+  virtual bool hasMissingUnusedPiece();
+
   virtual SharedHandle<Piece> getMissingPiece(const SharedHandle<Peer>& peer);
 
   virtual SharedHandle<Piece> getMissingFastPiece(const SharedHandle<Peer>& peer);

+ 2 - 0
src/PieceStorage.h

@@ -62,6 +62,8 @@ public:
    */
   virtual bool hasMissingPiece(const SharedHandle<Peer>& peer) = 0;
 
+  virtual bool hasMissingUnusedPiece() = 0;
+
   /**
    * Returns a piece that the peer has but localhost doesn't.
    * The piece will be marked "used" status in order to prevent other command

+ 5 - 0
src/UnknownLengthPieceStorage.cc

@@ -78,6 +78,11 @@ bool UnknownLengthPieceStorage::hasMissingPiece(const SharedHandle<Peer>& peer)
   abort();
 }
 
+bool UnknownLengthPieceStorage::hasMissingUnusedPiece()
+{
+  abort();
+}
+
 SharedHandle<Piece> UnknownLengthPieceStorage::getMissingPiece(const SharedHandle<Peer>& peer)
 {
   abort();

+ 2 - 0
src/UnknownLengthPieceStorage.h

@@ -73,6 +73,8 @@ public:
    */
   virtual bool hasMissingPiece(const SharedHandle<Peer>& peer);
 
+  virtual bool hasMissingUnusedPiece();
+
   /**
    * Returns a piece that the peer has but localhost doesn't.
    * The piece will be marked "used" status in order to prevent other command

+ 5 - 0
test/MockPieceStorage.h

@@ -44,6 +44,11 @@ public:
     return false;
   }
 
+  virtual bool hasMissingUnusedPiece()
+  {
+    return false;
+  }
+
   virtual SharedHandle<Piece> getMissingPiece(const SharedHandle<Peer>& peer) {
     return SharedHandle<Piece>(new Piece());
   }