Major Long term Systemic issue found to the game.db file

7700ks and fast SSDs do make a huge difference in performance, especially for single threaded operations. I doubt your hosting provider is using a consumer grade CPU in their servers, but maybe.

I tried to install in my slow SSD storage pool and was experiencing rubber banding really bad. So another issue I’d like to point out is that SQL updates are done synchronously during a tick and if the update/write doesn’t complete before the next tick, the client will rubberband.

So, if you’re not rubberbanding you can take comfort in the fact that your provider is using decently fast SSDs. I moved the install to my samsung pro m.2 storage pool and issues went away.

I’m also using 32gb of RAM, a fresh install is taking 4gb.

Please switch to Postgres! =) My cluster would be far more suited to handle this than sqlite.

wal, write ahead log. Trying to emulate Postgres I suppose.

Only if you’re running winblows, which shouldn’t even be called a server due to excessive vulnerabilities and being complete garbage in general. Linux rarely needs a restart, you can literally have years of uptime. Unless you want the latest kernel.

Another great thing about linux is I can see what packages actually are requesting the system to be rebooted due to security updates and that it will never take it upon itself to do so. cat /var/run/reboot-required.pkgs

Deduction brings reason and with both most likely possible facts.
Over time the 15 of us all reported specific things that we noticed.

Official Server Clues:
Clue 1: Some servers in the game are older than others, don’t forget this and also that some are used far more due to ping and localized popularity based of location and population density. We all crash on the official servers, no servers list whats so ever. 4-6 hours later, servers list again attesting to some sort of master switch that either funcom has or gportal. I am guessing funcom since it also effects private hosted servers.

Clue 2: Some of us Crash on official servers and it comes up in the list when we refresh however we are never able to log on despite it coming up in the list and showing active gamers online even when those same gamers, 15 of them are on discord claiming they cant get in. This activity of refreshing and attempting to log back in continues for 4-6 hours. During this scenario other servers are functioning and we were able to create a character and log in without an issue.

Clue 3: Numerous times on official servers I would place a camp fire/bedroll down only to find days later it has vanished attesting to the fact that either funcom or gportal is till this day using the same SQL script that Pit recommended to use earlier found and used by a private host admin.

Hosted Server Clues:

Clue 1: I notice how long the server takes to come online in the refreshing of the games servers list, from its inception until today’s 35MB file size spanning 5 weeks now and the load times has been increasing exponentially.

Clue 2: Our server service goes down during the day most likely due to memory leaks and I watch it go down and come back up all on its own, kicking out all gamers and then instantly coming back on in the list after a short while, also dictated by the length and size of the game.db file. Basically a systems crash.

It is clear that the game.db file is the main cause of the issue. I agree that poor administration of gportal being able to react to server service malfunctions in a timely manner is murky at best but I cant blame a hosting company for the development of a game they did not create in the first place. Both are at fault here. The mystery surrounding the master flip switch where all server become offline, including those that are privately hosted is a mystery that plagues my thoughts till this day. During this mysterious event, no tweets from anyone, no patch notes, no server or client updates are provided. Servers all become available in the list shortly after around 5 to sometimes 30 min later and this happened often enough as it is. Why my privately hosted game has anything to do with this master switch or master death switch is also beyond my comprehension. We should solely rely on this only in the case of a server update. Clients should have to download patches separately but he server should remain up if the server doesn’t need any updates.

We can talk about hard drives and hosting companies all day long, same as I can talk about a certain french car manufacturer but at the end of the day, if the car itself is broken, what is there to talk about honestly. My private hosting company is literally one of the best if not the best in the business, using only top shelf servers, providing an extremely low ping, redundancies for all measures, including 5 separate IP nodes and power, and bar non the strongest SLA agreement in the business. These guys are very professional and their CS is also on point responding quickly. If they behaved how gportal should, perhaps some of these issues would be resolved but in the end its the actual game itself. The crashing, the inconstant game play, the plaguing updates that fix 1 thing and break 10 other things every single time. Our guessing games here is a testament on how alone we actually are also the main fact that we chose to pay for and host our own servers because we simply couldn’t take it anymore thinking that would be a solution but the solution is far from this. The solution is that funcom needs to address these very major core issues and instead their tweeting about fan art daily for the past 5 days, talking about taking vacations and submitting untested patches breaking numerous things and fixing only a few.

No specific order here game.db issues and complaints:
game.db stability is frankly sh** and cant survive beyond 24 hours without being reset, all the while internally causing numerous issues while it runs forcing intervention of a script to vacuum and whatever the f*** those other commands are.

Thralls continue to fall through the world as your dragging them back to your wheel.

I place a thall because I want it where I want it exactly for a reason and a friend during non pvp hours comes over and they all react and move around like dumba**es blocking doorways and of course never returning to the exact location i sent them to. Have too many thralls? After combat ends of a purge given their amount, some of them cant get back to their original placement because another thrall is now standing there. SO instead of picking a location to stand they pace back and forth forever.

Some bows/arrow combinations on archer thralls end up looking like their shooting but no arrows actually shoot. the combinations vary.

The in game broadcast feature is like a child wrote it. It literal puts a popup smack in the middle of the screen forcing the gamer to click to dismiss it, most of the time having to take damage and or die because they were in combat during this. Instead of simply making this message appear in global chat in a specific color and boldness and forcing the chat to pop up if it has been minimized would have been a far simpler.

Rock Ore is now difficult to pick, swinging at rocks directly on top of them and moving around them missing swings numerous times.

Some flowers require a sickle, while others a pick is just the dumbest thing I have seen so far.

Server restarts and or crashes stop the progress of all furnaces, thrall wheel and other stations.

Star metal drops are rare as they are and now they vanish even quicker than before. Why?

Its now easier to make Black Ice structure then reinforced stone? Seriously?

The volcano is lag city enough so to take down the game.db service all together since last week including some dungeons. most times…

Upon death there is always a lag spike that you may or may not notice where everything freezes and then comes back and your dead with a countdown to a bed roll.

After a service restart rolling over your bed it doesn’t say that its your spawn location although it still does work if you die.

Chests throughout the world are plagued, usually broken and your unable to see the loot entirely. The only solution we found was to destroy it and wait for it to respawn only to break again the next time. The ghost bear treasure also hasn’t worked for over a month now.

Dregs boss leaps out and vanishes like magic while your friend can see him and are able to attack, 3 leaps later your able to see and attack him but your friends cant all in the same fight.

Building has its own annoyances where certain pieces wont snap unless dropped and given to a friend who can place them. Numerous times your forced to destroy a foundation to only then be able to replace it and then to proceed upward with another.

A completely closed structure built over an object like a rock or world object, even though sealed still brings rain indoors despite all walls having no windows.

Numerous objects in the game thankfully have the ability to be taken back to your inventory while others cant. This stupidity is quite annoying. Something as difficult to build as a map room can be returned to your inventory but something as a furnace cant.

If you build a structure and surround it with a wall sealed, purges spawn inside your base, talk about moronic.

Purge levels are announced.

If your non clan friends join to assist you in the purge they should also hear the horns, and see the broadcasts the second they attack anything spawned from the purge and get the XP for completing it as well as the journey. The purge is a fantastic idea to bring the server and its gamers together as a community.

Fingers hurting
I can honestly go on and on for another hour sitting here but my point is clear. We are not the issue and most likely neither is our equipment. The issue is the new standard these days calling a game released when it is clearly still in Beta. The simple fact that all these things are still broken and yet they work on DLC releases for new content is literally the dumbest thing I can think of. Despite the need for funding, I can understand that part but then direct that funding to hire additional professionals to fix the looming issues but instead, we are getting pretty new outfits. Without a strong foundation of a game why continue to develop new? They need to fix the game as it is now, create a sustainable community that doesn’t have these plaguing issues and then develop upon that.

All good valid points, how about a non-test build of the server to start with?

I can tell you why you lag upon death. It’s in the server logs.

The game is iterating over all possible spawn locations, garbage collecting your old actor components (inventory, feats, etc).

Finding a random spawn location in the desert and recreating actor components. Likely performing a write to SQL as well, along with a read or two to find your bedroll and bed if any.

It’s is also writing to disk in the log file all of this and unless you’ve symlinked your db file to a separate disk, it’s being written close to the same time as the SQL write on the same disk. I suppose you could symlink the log somewhere else instead.

Death Event IOStat:
%user %nice %system %iowait %steal %idle
9.90 0.00 8.38 2.54 0.00 79.19

Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sdb 53.00 0.00 668.00 0 668

Would you believe that eating bugs triggers an even greater amount of writes?? lol. It does.

That slight glitching you feel, happens when iowait percent exceeds 2.5/3%. Really they shouldn’t be persisting immediately but because they are the server has to wait for all of these transactions which ultimately leads to most of the AI bugs, corruption, etc so on and so forth.

Ark for example uses a fixed time interval to save, which is why the lag spike on world save. We experience that spike every write, wether we notice it or not. Most will blame on frame lag, but it’s not.

One player farming a tree ~555kbps written to disk.

One player spamming e on a box ~1Mbps written to disk.

In the interest of saving the world some SSDs I would recommend writing to an in-memory database and persisting that at a fixed time, faster operations all around.

More interesting sutff:

(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp’>)
e= <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp’>
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-journal’>)
e= <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-journal’>
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-journal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp’>)
(‘e=’, <FileDeletedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-journal’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-wal’>)
e= <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-wal’>
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-shm’>)
e= <FileCreatedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-shm’>
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-shm’>)
(‘e=’, <FileDeletedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-shm’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileDeletedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp-wal’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_2.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_2tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_3.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_3tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_4.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_4tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_5.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_5tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_6.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_6tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_7.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_7tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_8.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_8tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_9.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_9tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_10.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_10tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_11.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_11tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_12.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_12tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_13.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_13tmp.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/Logs/ConanSandbox.log’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_2.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_2tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_3.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_3tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_4.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_4tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_5.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_5tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_6.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_6tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_7.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_7tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_8.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_8tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_9.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_9tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_10.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_10tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_11.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_11tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_12.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_12tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_13.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_13tmp.db’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_14.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileMovedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.dbtmp’, dest_path=’/home/steam/exiles/ConanSandbox/Saved/game_backup_1.db’>)
(‘e=’, <DirModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/Logs/ConanSandbox.log’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/Logs/ConanSandbox.log’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db-wal’>)
(‘e=’, <FileModifiedEvent: src_path=’/home/steam/exiles/ConanSandbox/Saved/game.db’>)

Just for those who are following along, the game creates a temporary database file for the new backup and for all previous backups, moves the existing file and then moves the old file down a name.

Please save us the IOPS! Use date and time instead of this nonsense, like wtf…

1 Like

Yeah, there were people that suggested that in the past… they are hesitant to change it, for some reason :confused:

I have personally put my Saved folder on a ram disk (1GB) and point the Saved directory to that using a link.

1 Like

Lol, I did the same thing.

1 Like

I’m also running this python script to make a backup with datetime and deleting all these old backups on my ramdisk, along with modified config files so that I can restore everything on reboot.

Requires the watchdog python package, and a directory named /conan with a current copy of the saves directory.

# Backup new conan files...
import time
from import FileSystemEventHandler
from watchdog.observers import Observer
import os
import datetime

class MyEventHandler(FileSystemEventHandler):
    def __init__(self, observer, filename): = observer
        self.filename = filename

    def on_created(self, event):
        if '.log' in event.src_path:
            os.system("cp {0} /conan/Logs/.".format(event.src_path))
            print("Copied backup log file...")

    def on_moved(self, event):
        if event.dest_path == "/home/steam/exiles/ConanSandbox/Saved/game_backup_1.db":
            os.system("cp {0} /conan/game_backup_{1}.db".format(event.dest_path,
            print("Copied database backup file...")
            os.system("rm /home/steam/exiles/ConanSandbox/Saved/game_backup_*")
            print("Deleted old backups on ramdisk...")

    def on_modified(self, event):
        if '/home/steam/exiles/ConanSandbox/Saved/Config/WindowsServer' in event.src_path:
            os.system("cp {0} /conan/Config/WindowsServer/.".format(event.src_path))
            print("Copied modified config file...")

def main():
    observer = Observer()
    event_handler = MyEventHandler(observer, '/home/steam/exiles/ConanSandbox/Saved/game')
    observer.schedule(event_handler, '/home/steam/exiles/ConanSandbox/Saved/', recursive=True)
        while True:
    except KeyboardInterrupt:

if __name__ == "__main__":
1 Like

And does help with random crashes?
How many players do you have connected on average?
How do you manage with a hardware or OS crash, or what precautions do you have in place for such an event to prevent data loss?

1 Like

Cool! Looks good! Thank you for that :slight_smile:

I make backups by hand each time I restart the service, which is once per week or something, or when a mod needs updating, or I want to add mods.

I’m on windows myself, but I can probably adapt it :smiley:

1 Like

(2) No, I play solo on my local server. The idea was to play with another friend, but he wasn’t interested in the end, so I kept at it :smiley:

(1) I haven’t had crashes myself that weren’t tied to mods… but, and it’s a big BUT, I haven’t updated the game since last June’s build :blush:
Partially due to the big issues the game has atm, I want to keep playing and not much have been added that I can’t live without :smile:

(3) I use the software from Softperfect RAMdisk, that allows you to create a persistent raw image on your actual hard disk and it handles syncing on the background… I haven’t had an OS crash, but it’d probably mean a rollback to the last sync before the crash.

1 Like

Linux FTW bro! Lol, nah you should be good. Fix the slashes/paths and such.

1 Like

I’m assuming this would help with crashes, most likely an access violation, however I just started my server and have no player base. I do know that it will speed up your server 10s of times as far as DB writes are concerned.

I’m using fstab to recreate my tmpfs on linux and custom scripts for backup/restore with a symbolic link to the Saves folder.

If you’re running a linux box, I could do a write up if you like.

1 Like