Browse Source

Limit size of sent indexes a bit, taking number of blocks into account

Jakob Borg 11 years ago
parent
commit
60da59623e
1 changed files with 12 additions and 4 deletions
  1. 12 4
      model/model.go

+ 12 - 4
model/model.go

@@ -56,7 +56,12 @@ func (s repoState) String() string {
 const zeroEntrySize = 128
 
 // How many files to send in each Index/IndexUpdate message.
-const indexBatchSize = 1000
+const (
+	indexTargetSize   = 250 * 1024 // Aim for making index messages no larger than 250 KiB (uncompressed)
+	indexPerFileSize  = 250        // Each FileInfo is approximately this big, in bytes, excluding BlockInfos
+	IndexPerBlockSize = 40         // Each BlockInfo is approximately this big
+	indexBatchSize    = 1000       // Either way, don't include more files than this
+)
 
 type Model struct {
 	indexDir string
@@ -593,6 +598,7 @@ func sendIndexTo(initial bool, minLocalVer uint64, conn protocol.Connection, rep
 	nodeID := conn.ID()
 	name := conn.Name()
 	batch := make([]protocol.FileInfo, 0, indexBatchSize)
+	currentBatchSize := 0
 	maxLocalVer := uint64(0)
 	var err error
 
@@ -605,13 +611,13 @@ func sendIndexTo(initial bool, minLocalVer uint64, conn protocol.Connection, rep
 			maxLocalVer = f.LocalVersion
 		}
 
-		if len(batch) == indexBatchSize {
+		if len(batch) == indexBatchSize || currentBatchSize > indexTargetSize {
 			if initial {
 				if err = conn.Index(repo, batch); err != nil {
 					return false
 				}
 				if debug {
-					l.Debugf("sendIndexes for %s-%s/%q: %d files (initial index)", nodeID, name, repo, len(batch))
+					l.Debugf("sendIndexes for %s-%s/%q: %d files (<%d bytes) (initial index)", nodeID, name, repo, len(batch), currentBatchSize)
 				}
 				initial = false
 			} else {
@@ -619,14 +625,16 @@ func sendIndexTo(initial bool, minLocalVer uint64, conn protocol.Connection, rep
 					return false
 				}
 				if debug {
-					l.Debugf("sendIndexes for %s-%s/%q: %d files (batched update)", nodeID, name, repo, len(batch))
+					l.Debugf("sendIndexes for %s-%s/%q: %d files (<%d bytes) (batched update)", nodeID, name, repo, len(batch), currentBatchSize)
 				}
 			}
 
 			batch = make([]protocol.FileInfo, 0, indexBatchSize)
+			currentBatchSize = 0
 		}
 
 		batch = append(batch, f)
+		currentBatchSize += indexPerFileSize + len(f.Blocks)*IndexPerBlockSize
 		return true
 	})