Skip to content

Commit e988df0

Browse files
committedJun 3, 2013
Add and implement setting max_clearobjects_extra_loaded_blocks.
Now Environment::clearAllObjects() unloads unused blocks in an interval defined by max_clearobjects_extra_loaded_blocks (default 4096).
1 parent b89c79e commit e988df0

File tree

5 files changed

+76
-1
lines changed

5 files changed

+76
-1
lines changed
 

‎minetest.conf.example

+4
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@
254254
#max_block_send_distance = 10
255255
# From how far blocks are generated for clients (value * 16 nodes)
256256
#max_block_generate_distance = 6
257+
# Number of extra blocks that can be loaded by /clearobjects at once
258+
# This is a trade-off between sqlite transaction overhead and
259+
# memory consumption (4096=100MB, as a rule of thumb)
260+
#max_clearobjects_extra_loaded_blocks = 4096
257261
# Interval of sending time of day to clients
258262
#time_send_interval = 5
259263
# Length of day/night cycle. 72=20min, 360=4min, 1=24hour, 0=day/night/whatever stays unchanged

‎src/defaultsettings.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ void set_default_settings(Settings *settings)
175175
settings->setDefault("max_simultaneous_block_sends_server_total", "20");
176176
settings->setDefault("max_block_send_distance", "9");
177177
settings->setDefault("max_block_generate_distance", "7");
178+
settings->setDefault("max_clearobjects_extra_loaded_blocks", "4096");
178179
settings->setDefault("time_send_interval", "5");
179180
settings->setDefault("time_speed", "72");
180181
settings->setDefault("server_unload_unused_data_timeout", "29");

‎src/environment.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,16 @@ void ServerEnvironment::clearAllObjects()
945945
m_active_objects.erase(*i);
946946
}
947947

948+
// Get list of loaded blocks
949+
std::list<v3s16> loaded_blocks;
950+
infostream<<"ServerEnvironment::clearAllObjects(): "
951+
<<"Listing all loaded blocks"<<std::endl;
952+
m_map->listAllLoadedBlocks(loaded_blocks);
953+
infostream<<"ServerEnvironment::clearAllObjects(): "
954+
<<"Done listing all loaded blocks: "
955+
<<loaded_blocks.size()<<std::endl;
956+
957+
// Get list of loadable blocks
948958
std::list<v3s16> loadable_blocks;
949959
infostream<<"ServerEnvironment::clearAllObjects(): "
950960
<<"Listing all loadable blocks"<<std::endl;
@@ -953,6 +963,20 @@ void ServerEnvironment::clearAllObjects()
953963
<<"Done listing all loadable blocks: "
954964
<<loadable_blocks.size()
955965
<<", now clearing"<<std::endl;
966+
967+
// Grab a reference on each loaded block to avoid unloading it
968+
for(std::list<v3s16>::iterator i = loaded_blocks.begin();
969+
i != loaded_blocks.end(); ++i)
970+
{
971+
v3s16 p = *i;
972+
MapBlock *block = m_map->getBlockNoCreateNoEx(p);
973+
assert(block);
974+
block->refGrab();
975+
}
976+
977+
// Remove objects in all loadable blocks
978+
u32 unload_interval = g_settings->getS32("max_clearobjects_extra_loaded_blocks");
979+
unload_interval = MYMAX(unload_interval, 1);
956980
u32 report_interval = loadable_blocks.size() / 10;
957981
u32 num_blocks_checked = 0;
958982
u32 num_blocks_cleared = 0;
@@ -987,7 +1011,22 @@ void ServerEnvironment::clearAllObjects()
9871011
<<" in "<<num_blocks_cleared<<" blocks ("
9881012
<<percent<<"%)"<<std::endl;
9891013
}
1014+
if(num_blocks_checked % unload_interval == 0){
1015+
m_map->unloadUnreferencedBlocks();
1016+
}
9901017
}
1018+
m_map->unloadUnreferencedBlocks();
1019+
1020+
// Drop references that were added above
1021+
for(std::list<v3s16>::iterator i = loaded_blocks.begin();
1022+
i != loaded_blocks.end(); ++i)
1023+
{
1024+
v3s16 p = *i;
1025+
MapBlock *block = m_map->getBlockNoCreateNoEx(p);
1026+
assert(block);
1027+
block->refDrop();
1028+
}
1029+
9911030
infostream<<"ServerEnvironment::clearAllObjects(): "
9921031
<<"Finished: Cleared "<<num_objs_cleared<<" objects"
9931032
<<" in "<<num_blocks_cleared<<" blocks"<<std::endl;

‎src/map.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -1510,6 +1510,11 @@ void Map::timerUpdate(float dtime, float unload_timeout,
15101510
}
15111511
}
15121512

1513+
void Map::unloadUnreferencedBlocks(std::list<v3s16> *unloaded_blocks)
1514+
{
1515+
timerUpdate(0.0, -1.0, unloaded_blocks);
1516+
}
1517+
15131518
void Map::deleteSectors(std::list<v2s16> &list)
15141519
{
15151520
for(std::list<v2s16>::iterator j = list.begin();
@@ -3409,6 +3414,26 @@ void ServerMap::listAllLoadableBlocks(std::list<v3s16> &dst)
34093414
}
34103415
}
34113416

3417+
void ServerMap::listAllLoadedBlocks(std::list<v3s16> &dst)
3418+
{
3419+
for(std::map<v2s16, MapSector*>::iterator si = m_sectors.begin();
3420+
si != m_sectors.end(); ++si)
3421+
{
3422+
MapSector *sector = si->second;
3423+
3424+
std::list<MapBlock*> blocks;
3425+
sector->getBlocks(blocks);
3426+
3427+
for(std::list<MapBlock*>::iterator i = blocks.begin();
3428+
i != blocks.end(); ++i)
3429+
{
3430+
MapBlock *block = (*i);
3431+
v3s16 p = block->getPos();
3432+
dst.push_back(p);
3433+
}
3434+
}
3435+
}
3436+
34123437
void ServerMap::saveMapMeta()
34133438
{
34143439
DSTACK(__FUNCTION_NAME);

‎src/map.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,12 @@ class Map /*: public NodeContainer*/
279279
void timerUpdate(float dtime, float unload_timeout,
280280
std::list<v3s16> *unloaded_blocks=NULL);
281281

282+
/*
283+
Unloads all blocks with a zero refCount().
284+
Saves modified blocks before unloading on MAPTYPE_SERVER.
285+
*/
286+
void unloadUnreferencedBlocks(std::list<v3s16> *unloaded_blocks=NULL);
287+
282288
// Deletes sectors and their blocks from memory
283289
// Takes cache into account
284290
// If deleted sector is in sector cache, clears cache
@@ -433,8 +439,8 @@ class ServerMap : public Map
433439
void endSave();
434440

435441
void save(ModifiedState save_level);
436-
//void loadAll();
437442
void listAllLoadableBlocks(std::list<v3s16> &dst);
443+
void listAllLoadedBlocks(std::list<v3s16> &dst);
438444
// Saves map seed and possibly other stuff
439445
void saveMapMeta();
440446
void loadMapMeta();

0 commit comments

Comments
 (0)