From 76217939e05bdd8d06fa7113902a74b02deeb915 Mon Sep 17 00:00:00 2001
From: kwolekr <mirrorisim@gmail.com>
Date: Thu, 14 Feb 2013 20:36:58 -0500
Subject: [PATCH] Add emerge queue limit configuration

---
 src/defaultsettings.cpp |  4 ++++
 src/emerge.cpp          | 17 +++++++----------
 src/emerge.h            | 13 +++++++++----
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 610dd65a4..f18e9b1e0 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -184,6 +184,10 @@ void set_default_settings(Settings *settings)
 	settings->setDefault("congestion_control_min_rate", "10");
 	settings->setDefault("remote_media", "");
 	settings->setDefault("debug_log_level", "0");
+	settings->setDefault("emergequeue_limit_total", "256");
+	settings->setDefault("emergequeue_limit_diskonly", "5");
+	settings->setDefault("emergequeue_limit_generate", "1");
+	
 	// physics stuff
 	settings->setDefault("movement_acceleration_default", "3");
 	settings->setDefault("movement_acceleration_air", "2");
diff --git a/src/emerge.cpp b/src/emerge.cpp
index e2b9e5a6c..b785c8688 100644
--- a/src/emerge.cpp
+++ b/src/emerge.cpp
@@ -49,6 +49,10 @@ EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) {
 	this->params   = NULL;
 	this->mapgen   = NULL;
 	
+	qlimit_total    = g_settings->getU16("emergequeue_limit_total");
+	qlimit_diskonly = g_settings->getU16("emergequeue_limit_diskonly");
+	qlimit_generate = g_settings->getU16("emergequeue_limit_generate");
+
 	queuemutex.Init();
 	emergethread = new EmergeThread((Server *)gamedef);
 }
@@ -98,23 +102,16 @@ bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate
 	if (allow_generate)
 		flags |= BLOCK_EMERGE_ALLOWGEN;
 
-	//TODO:
-	// add logic to select which emergethread to add it to
-	//  - one with the least queue contents?
-	//  - if a queue is too full, move onto another one
-	//  - use the peer id sometime
-
 	{
 		JMutexAutoLock queuelock(queuemutex);
 		
 		count = blocks_enqueued.size();
-		u16 queuelimit_total = 256;
-		if (count >= queuelimit_total)
+		if (count >= qlimit_total)
 			return false;
 
 		count = peer_queue_count[peer_id];
-		u16 queuelimit_peer = allow_generate ? 1 : 5;
-		if (count >= queuelimit_peer)
+		u16 qlimit_peer = allow_generate ? qlimit_generate : qlimit_diskonly;
+		if (count >= qlimit_peer)
 			return false;
 		
 		iter = blocks_enqueued.find(p);
diff --git a/src/emerge.h b/src/emerge.h
index 5f73dcd86..b4461ae61 100644
--- a/src/emerge.h
+++ b/src/emerge.h
@@ -45,15 +45,20 @@ struct BlockEmergeData {
 class EmergeManager {
 public:
 	std::map<std::string, MapgenFactory *> mglist;
-
+	
+	Mapgen *mapgen;
+	EmergeThread *emergethread;
+	
 	//settings
 	MapgenParams *params;
-
+	u16 qlimit_total;
+	u16 qlimit_diskonly;
+	u16 qlimit_generate;
+	
+	//block emerge queue data structures
 	JMutex queuemutex;
 	std::map<v3s16, BlockEmergeData *> blocks_enqueued;
 	std::map<u16, u16> peer_queue_count;
-	Mapgen *mapgen;
-	EmergeThread *emergethread;
 
 	//biome manager
 	BiomeDefManager *biomedef;
-- 
GitLab