Commit Diff


commit - 7a81625cd44bc65356b3e5889682eeee31f90cf8
commit + 64846381f41e1779f93e6d7e79dc4946430f5f9e
blob - 2a2392f5144acbea765eeb7bbc2547bb146497a8
blob + 1ae63bf9dd3538c263b2cf45c1263641440e2058
--- include/globals.h
+++ include/globals.h
@@ -49,10 +49,15 @@
   #define SYNC_WORLD_TO_DISK
 #endif
 // The minimum interval (in microseconds) at which certain data is written
-// to disk/flash. Bounded on the low end by TIME_BETWEEN_TICKS. Currently
-// only applies to player data. Block changes are written as soon as they
-// are made, but in much smaller portions.
+// to disk/flash. Bounded on the low end by TIME_BETWEEN_TICKS. By default,
+// applies only to player data. Block changes are written as soon as they
+// are made, but in much smaller portions. Set DISK_SYNC_BLOCKS_ON_INTERVAL
+// to make this apply to block changes as well.
 #define DISK_SYNC_INTERVAL 15000000
+// Whether to sync block changes to disk on an interval, instead of syncing
+// on each change. On systems with fast random disk access, this shouldn't
+// be necessary.
+// #define DISK_SYNC_BLOCKS_ON_INTERVAL
 // Time in microseconds to spend waiting for data transmission before
 // timing out. Default is 15s, which leaves 5s to prevent starving other
 // clients from Keep Alive packets.
blob - f0bbe086ad4cb06de27d563e9f74cc7656da4560
blob + c07e16e52040c3027c87056de820bc353342ca4b
--- src/procedures.c
+++ src/procedures.c
@@ -412,7 +412,9 @@ uint8_t makeBlockChange (short x, uint8_t y, short z, 
       #endif
       if (is_base_block) block_changes[i].block = 0xFF;
       else block_changes[i].block = block;
+      #ifndef DISK_SYNC_BLOCKS_ON_INTERVAL
       writeBlockChangesToDisk(i, i);
+      #endif
       return 0;
     }
   }
@@ -450,7 +452,9 @@ uint8_t makeBlockChange (short x, uint8_t y, short z, 
         block_changes_count = i + 1;
       }
       // Write changes to disk (if applicable)
+      #ifndef DISK_SYNC_BLOCKS_ON_INTERVAL
       writeBlockChangesToDisk(last_real_entry + 1, last_real_entry + 15);
+      #endif
       return 0;
     }
     // If we're here, no changes were made
@@ -471,7 +475,9 @@ uint8_t makeBlockChange (short x, uint8_t y, short z, 
   block_changes[first_gap].z = z;
   block_changes[first_gap].block = block;
   // Write change to disk (if applicable)
+  #ifndef DISK_SYNC_BLOCKS_ON_INTERVAL
   writeBlockChangesToDisk(first_gap, first_gap);
+  #endif
   // Extend future search range if we've appended to the end
   if (first_gap == block_changes_count) {
     block_changes_count ++;
@@ -1441,8 +1447,11 @@ void handleServerTick (int64_t time_since_last_tick) {
     sc_setHealth(player->client_fd, player->health, player->hunger, player->saturation);
   }
 
-  // Write player data to file (if applicable)
+  // Write data to file (if applicable)
   writePlayerDataToDisk();
+  #ifdef DISK_SYNC_BLOCKS_ON_INTERVAL
+  writeBlockChangesToDisk(0, block_changes_count);
+  #endif
 
   /**
    * If the RNG seed ever hits 0, it'll never generate anything
@@ -1618,7 +1627,9 @@ void broadcastChestUpdate (int origin_fd, uint8_t *sto
     sc_setContainerSlot(player_data[i].client_fd, 2, slot, count, item);
   }
 
+  #ifndef DISK_SYNC_BLOCKS_ON_INTERVAL
   writeChestChangesToDisk(storage_ptr, slot);
+  #endif
 
 }
 #endif
blob - 422fb0cce57c15546a9ca18576166dc5540eb821
blob + 5ba2cf2964b8f27c1fee3ea259ea0627570197bc
--- src/serialize.c
+++ src/serialize.c
@@ -115,6 +115,12 @@ int initSerializer () {
 // Writes a range of block change entries to disk
 void writeBlockChangesToDisk (int from, int to) {
 
+  #ifdef DISK_SYNC_BLOCKS_ON_INTERVAL
+    // Skip this write if enough time hasn't passed since the last one
+    if (get_program_time() - last_disk_sync_time < DISK_SYNC_INTERVAL) return;
+    last_disk_sync_time = get_program_time();
+  #endif
+
   // Try to open the file in rw (without overwriting)
   FILE *file = fopen(FILE_PATH, "r+b");
   if (!file) {