Skip to content

Commit

Permalink
Server: Calculate maximal total block sends dynamically (minetest#6393)
Browse files Browse the repository at this point in the history
The block sends per client is 1/2 when reaching the maximal player count.
  • Loading branch information
SmallJoker authored and nerzhul committed Sep 8, 2017
1 parent 1105a14 commit 745a90d
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 17 deletions.
5 changes: 2 additions & 3 deletions builtin/settingtypes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -865,11 +865,10 @@ ipv6_server (IPv6 server) bool false
[**Advanced]

# Maximum number of blocks that are simultaneously sent per client.
# The maximum total count is calculated dynamically:
# max_total = ceil((#clients + max_users) * per_client / 4)
max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 10

# Maximum number of blocks that are simultaneously sent in total.
max_simultaneous_block_sends_server_total (Maximum simultaneous block sends total) int 40

# To reduce lag, block transfers are slowed down when a player is building something.
# This determines how long they are slowed down after placing or removing a node.
full_block_send_enable_min_time_from_building (Delay in sending blocks after building) float 2.0
Expand Down
6 changes: 2 additions & 4 deletions minetest.conf.example
Original file line number Diff line number Diff line change
Expand Up @@ -1049,13 +1049,11 @@
### Advanced

# Maximum number of blocks that are simultaneously sent per client.
# The maximum total count is calculated dynamically:
# max_total = ceil((#clients + max_users) * per_client / 4)
# type: int
# max_simultaneous_block_sends_per_client = 10

# Maximum number of blocks that are simultaneously sent in total.
# type: int
# max_simultaneous_block_sends_server_total = 40

# To reduce lag, block transfers are slowed down when a player is building something.
# This determines how long they are slowed down after placing or removing a node.
# type: float
Expand Down
5 changes: 1 addition & 4 deletions src/clientiface.h
Original file line number Diff line number Diff line change
Expand Up @@ -272,10 +272,7 @@ class RemoteClient
*/
void ResendBlockIfOnWire(v3s16 p);

s32 SendingCount()
{
return m_blocks_sending.size();
}
u32 getSendingCount() const { return m_blocks_sending.size(); }

// Increments timeouts and removes timed-out blocks from list
// NOTE: This doesn't fix the server-not-sending-block bug
Expand Down
1 change: 0 additions & 1 deletion src/defaultsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,6 @@ void set_default_settings(Settings *settings)
settings->setDefault("strict_protocol_version_checking", "false");
settings->setDefault("player_transfer_distance", "0");
settings->setDefault("max_simultaneous_block_sends_per_client", "10");
settings->setDefault("max_simultaneous_block_sends_server_total", "40");
settings->setDefault("time_send_interval", "5");

settings->setDefault("default_game", "minetest");
Expand Down
12 changes: 7 additions & 5 deletions src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2181,7 +2181,7 @@ void Server::SendBlocks(float dtime)

std::vector<PrioritySortedBlockTransfer> queue;

s32 total_sending = 0;
u32 total_sending = 0;

{
ScopeProfiler sp2(g_profiler, "Server: selecting blocks for sending");
Expand All @@ -2195,7 +2195,7 @@ void Server::SendBlocks(float dtime)
if (!client)
continue;

total_sending += client->SendingCount();
total_sending += client->getSendingCount();
client->GetNextBlocks(m_env,m_emerge, dtime, queue);
}
m_clients.unlock();
Expand All @@ -2207,11 +2207,13 @@ void Server::SendBlocks(float dtime)
std::sort(queue.begin(), queue.end());

m_clients.lock();
s32 max_blocks_to_send =
g_settings->getS32("max_simultaneous_block_sends_server_total");

// Maximal total count calculation
// The per-client block sends is halved with the maximal online users
u32 max_blocks_to_send = (m_env->getPlayerCount() + g_settings->getU32("max_users")) *
g_settings->getU32("max_simultaneous_block_sends_per_client") / 4 + 1;

for (const PrioritySortedBlockTransfer &block_to_send : queue) {
//TODO: Calculate limit dynamically
if (total_sending >= max_blocks_to_send)
break;

Expand Down
1 change: 1 addition & 0 deletions src/serverenvironment.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ class ServerEnvironment : public Environment

RemotePlayer *getPlayer(const u16 peer_id);
RemotePlayer *getPlayer(const char* name);
u32 getPlayerCount() const { return m_players.size(); }

static bool migratePlayersDatabase(const GameParams &game_params,
const Settings &cmd_args);
Expand Down

0 comments on commit 745a90d

Please sign in to comment.