From 6418f430f9cf72930abb6610c0665f35b13c92da Mon Sep 17 00:00:00 2001 From: DarthArgus Date: Fri, 9 Dec 2016 03:37:21 +0000 Subject: [PATCH] this should let us delete snapshots at the cost of latency --- .../src/shared/ConfigServerDatabase.cpp | 14 +++++----- .../src/shared/DatabaseProcess.cpp | 8 +++--- .../serverDatabase/src/shared/Persister.cpp | 26 +++++++++++++------ .../serverDatabase/src/shared/Persister.h | 6 +++++ .../src/shared/core/SwgDatabaseServer.cpp | 2 -- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/engine/server/library/serverDatabase/src/shared/ConfigServerDatabase.cpp b/engine/server/library/serverDatabase/src/shared/ConfigServerDatabase.cpp index b0f0891f..9379508b 100755 --- a/engine/server/library/serverDatabase/src/shared/ConfigServerDatabase.cpp +++ b/engine/server/library/serverDatabase/src/shared/ConfigServerDatabase.cpp @@ -34,12 +34,12 @@ void ConfigServerDatabase::install(void) ConfigServerUtility::install(); data = &staticData; - KEY_INT (objvarNameCleanupTime, 60); - KEY_INT (orphanedObjectCleanupTime, 60); - KEY_INT (marketAttributesCleanupTime, 60); - KEY_INT (messagesCleanupTime, 60); - KEY_INT (brokenObjectCleanupTime, 60); - KEY_INT (vendorObjectCleanupTime, 60); + KEY_INT (objvarNameCleanupTime, 10); + KEY_INT (orphanedObjectCleanupTime, 10); + KEY_INT (marketAttributesCleanupTime, 10); + KEY_INT (messagesCleanupTime, 10); + KEY_INT (brokenObjectCleanupTime, 10); + KEY_INT (vendorObjectCleanupTime, 10); KEY_STRING (customSQLFilename,""); KEY_BOOL (enableFixBadCells, true); KEY_STRING (objectTemplateListUpdateFilename,""); @@ -97,7 +97,7 @@ void ConfigServerDatabase::install(void) KEY_BOOL (enableGoldDatabase, false); KEY_STRING (maxGoldNetworkId, "10000000"); KEY_FLOAT (defaultQueueUpdateTimeLimit, 0.25f); - KEY_BOOL (enableDataCleanup, true); + KEY_BOOL (enableDataCleanup, false); KEY_INT (defaultLazyDeleteBulkBindSize, 100); KEY_INT (defaultLazyDeleteSleepTime, 1000); KEY_INT (writeDelay, 0); diff --git a/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp b/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp index f5dcb25c..5b097f2c 100755 --- a/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp +++ b/engine/server/library/serverDatabase/src/shared/DatabaseProcess.cpp @@ -91,13 +91,13 @@ m_queryFetchCount(0) centralServerConnection = new CentralServerConnection(ConfigServerDatabase::getCentralServerAddress(), ConfigServerDatabase::getCentralServerPort()); NetworkSetupData setup; - setup.maxConnections = 100; + setup.maxConnections = 300; setup.port = 0; setup.bindInterface = ConfigServerDatabase::getGameServiceBindInterface(); gameService = new Service(ConnectionAllocator(), setup); NetworkSetupData cmSetup; - cmSetup.maxConnections = 100; + cmSetup.maxConnections = 300; cmSetup.port = ConfigServerDatabase::getCommoditiesServerPort(); cmSetup.bindInterface = ConfigServerDatabase::getCommoditiesServerAddress(); commoditiesService = new Service(ConnectionAllocator(), cmSetup); @@ -128,7 +128,7 @@ m_queryFetchCount(0) DB::Server::setDisconnectSleepTime(ConfigServerDatabase::getDisconnectSleepTime()); DB::Server::setFatalOnDataError(ConfigServerDatabase::getFatalOnDataError()); - // the DatabaseProcess singleton will want to know when major, connection + // the DatabaseProcess singleton will want to know when major, connection // oriented events occur. These events are defined in Game, Task and Central // connection classes. connectToMessage("CentralConnectionOpened"); @@ -252,7 +252,7 @@ void DatabaseProcess::run(void) // TODO: sleep longer if idle if (shouldSleep) { - Os::sleep(1); + Os::sleep(3); } NetworkHandler::dispatch(); diff --git a/engine/server/library/serverDatabase/src/shared/Persister.cpp b/engine/server/library/serverDatabase/src/shared/Persister.cpp index 2d013510..f4fd85b3 100755 --- a/engine/server/library/serverDatabase/src/shared/Persister.cpp +++ b/engine/server/library/serverDatabase/src/shared/Persister.cpp @@ -617,15 +617,23 @@ void Persister::endBaselines(const NetworkId &objectId, uint32 serverId) void Persister::saveCompleted(Snapshot *completedSnapshot) { - if (completedSnapshot) { + { + std::lock_guard lck(m_savingDeleting_mtx); + delete completedSnapshot; completedSnapshot = nullptr; } + auto i=std::remove(m_savingSnapshots.begin(),m_savingSnapshots.end(),completedSnapshot); - SnapshotListType::iterator i=std::remove(m_savingSnapshots.begin(),m_savingSnapshots.end(),completedSnapshot); if (i!=m_savingSnapshots.end()) { - m_savingSnapshots.erase(i, m_savingSnapshots.end()); + + { + std::lock_guard lck(m_savingDeleting_mtx); + WARNING(true, ("m_SavingSnapshots is not empty and we're nuking everything for some reason. Is this a leak?")); + m_savingSnapshots.erase(i, m_savingSnapshots.end()); + } + if (m_savingSnapshots.empty() && ConfigServerDatabase::getReportSaveTimes()) { int saveTime = Clock::timeMs() - m_saveStartTime; @@ -633,7 +641,7 @@ void Persister::saveCompleted(Snapshot *completedSnapshot) m_totalSaveTime += saveTime; if (saveTime > m_maxSaveTime) m_maxSaveTime = saveTime; - + DEBUG_REPORT_LOG(true,("Save completed in %i. (Average %i, max %i)\n", saveTime, m_totalSaveTime/m_saveCount, m_maxSaveTime)); LOG("SaveTimes",("Save completed in %i. (Average %i, max %i)", saveTime, m_totalSaveTime/m_saveCount, m_maxSaveTime)); m_lastSaveTime = saveTime; @@ -646,7 +654,7 @@ void Persister::saveCompleted(Snapshot *completedSnapshot) DatabaseProcess::getInstance().sendToCentralServer(saveCompleteMessage, true); LOG("Database",("Sending DatabaseSaveComplete network message to Central.")); } - + { // set the last save completion time (for the monitoring program) time_t theTime = time(0); @@ -655,11 +663,13 @@ void Persister::saveCompleted(Snapshot *completedSnapshot) } else { - SnapshotListType::iterator j=std::remove(m_savingCharacterSnapshots.begin(),m_savingCharacterSnapshots.end(),completedSnapshot); -DEBUG_FATAL(i==m_savingCharacterSnapshots.end(),("Programmer bug: SaveCompleted() called with a snapshot that wasn't in m_savingSnapshots or m_savingCharacterSnapshots.")); + std::lock_guard lck(m_savingDeleting_mtx); + auto j=std::remove(m_savingCharacterSnapshots.begin(),m_savingCharacterSnapshots.end(),completedSnapshot); + + WARNING(j==m_savingCharacterSnapshots.end(),("saveCompleted() called w/o snap in m_savingSnapshots or m_savingCharacterSnapshots.")); + m_savingCharacterSnapshots.erase(j, m_savingCharacterSnapshots.end()); - DEBUG_REPORT_LOG(ConfigServerDatabase::getReportSaveTimes(),("New character save completed\n")); } } diff --git a/engine/server/library/serverDatabase/src/shared/Persister.h b/engine/server/library/serverDatabase/src/shared/Persister.h index 9cc76ac8..24cf49b7 100755 --- a/engine/server/library/serverDatabase/src/shared/Persister.h +++ b/engine/server/library/serverDatabase/src/shared/Persister.h @@ -16,6 +16,8 @@ #include #include //TODO: remove when we clean up newCharacterLock hack +#include + #include "Unicode.h" #include "serverNetworkMessages/MessageToPayload.h" #include "sharedDatabaseInterface/DbModeQuery.h" @@ -116,8 +118,12 @@ class Persister : public MessageDispatch::Receiver ServerSnapshotMap m_newCharacterSnapshots; ObjectSnapshotMap m_objectSnapshotMap; PendingCharactersType m_pendingCharacters; + SnapshotListType m_savingSnapshots; SnapshotListType m_savingCharacterSnapshots; + + std::mutex m_savingDeleting_mtx; + NewCharacterLockType m_newCharacterLock; CharactersToDeleteType * m_charactersToDeleteThisSaveCycle; CharactersToDeleteType * m_charactersToDeleteNextSaveCycle; diff --git a/game/server/application/SwgDatabaseServer/src/shared/core/SwgDatabaseServer.cpp b/game/server/application/SwgDatabaseServer/src/shared/core/SwgDatabaseServer.cpp index 0e331f8c..10e89ee3 100755 --- a/game/server/application/SwgDatabaseServer/src/shared/core/SwgDatabaseServer.cpp +++ b/game/server/application/SwgDatabaseServer/src/shared/core/SwgDatabaseServer.cpp @@ -61,8 +61,6 @@ void SwgDatabaseServer::run() DataCleanupManager cleanupManager; cleanupManager.runDailyCleanup(); - - DatabaseProcess::run(); }