* PostgreSQL & SQLite3 doesn't setModified(false) on RemotePlayer, then player is saved on each server save call. This results in heavy useless writes.
* PostgreSQL & SQLite3 ack engine meta write whereas db commit hasn't been performed. If commit failed write has failed. We mustn't notify engine write is done.
* serializing player meta must not setModified(false) because it didn't ensure write has been done
* add RemotePlayer::on_successfull_save callback to do the flag update on a successful save
if (!fs::safeWriteToFile(path, ss.str())) {
infostream << "Failed to write " << path << std::endl;
}
- player->setModified(false);
+
+ player->on_successful_save();
}
bool PlayerDatabaseFiles::removePlayer(const std::string &name)
};
execPrepared("save_player_metadata", 3, meta_values);
}
- sao->getMeta().setModified(false);
endSave();
+
+ player->on_successful_save();
}
bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
sqlite3_vrfy(sqlite3_step(m_stmt_player_metadata_add), SQLITE_DONE);
sqlite3_reset(m_stmt_player_metadata_add);
}
- sao->getMeta().setModified(false);
endSave();
+
+ player->on_successful_save();
}
bool PlayerDatabaseSQLite3::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
}
output = fastWriteJson(json_root);
-
- m_sao->getMeta().setModified(false);
}
m_chat_message_allowance -= 1.0f;
return RPLAYER_CHATRESULT_OK;
}
+
+void RemotePlayer::on_successful_save()
+{
+ setModified(false);
+ if (m_sao)
+ m_sao->getMeta().setModified(false);
+}
void setPeerId(session_t peer_id) { m_peer_id = peer_id; }
+ void on_successful_save();
+
private:
/*
serialize() writes a bunch of text that can contain