DDNet documentation
Loading...
Searching...
No Matches
connection_pool.h
Go to the documentation of this file.
1#ifndef ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
2#define ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
3
4#include <base/sphore.h>
5#include <base/types.h>
6
7#include <atomic>
8#include <memory>
9#include <vector>
10
11class IDbConnection;
12
14{
15 // using atomic_bool to indicate completed sql query since usage_count
16 // from shard_ptr isn't safe in multithreaded environment
17 // the main thread must only access the remaining result data if set to true
18 std::atomic_bool m_Completed{false};
19 // indicate whether the thread indicated a successful completion (returned true)
20 bool m_Success = false;
21
22 virtual ~ISqlResult() = default;
23};
24
26{
27 ISqlData(std::shared_ptr<ISqlResult> pResult) :
28 m_pResult(std::move(pResult))
29 {
30 }
31 virtual ~ISqlData() = default;
32
33 mutable std::shared_ptr<ISqlResult> m_pResult;
34};
35
37{
38 // write everything into the backup db first
40 // now try to write it into remote db
42 // succeeded writing -> remove copy from backup
44 // failed writing -> notify about failure
46};
47
63
65{
66public:
70
71 // Returns false on success.
72 typedef bool (*FRead)(IDbConnection *, const ISqlData *, char *pError, int ErrorSize);
73 typedef bool (*FWrite)(IDbConnection *, const ISqlData *, Write, char *pError, int ErrorSize);
74
82
83 void Print(Mode DatabaseMode);
84
85 void RegisterSqliteDatabase(Mode DatabaseMode, const char aFilename[64]);
86 void RegisterMysqlDatabase(Mode DatabaseMode, const CMysqlConfig *pMysqlConfig);
87
88 void Execute(
89 FRead pFunc,
90 std::unique_ptr<const ISqlData> pSqlRequestData,
91 const char *pName);
92 // writes to WRITE_BACKUP first and removes it from there when successfully
93 // executed on WRITE server
94 void ExecuteWrite(
95 FWrite pFunc,
96 std::unique_ptr<const ISqlData> pSqlRequestData,
97 const char *pName);
98
99 void OnShutdown();
100
101 friend class CWorker;
102 friend class CBackup;
103
104private:
105 static bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, Write w);
106
107 // Only the main thread accesses this variable. It points to the index,
108 // where the next query is added to the queue.
109 int m_InsertIdx = 0;
110
111 bool m_Shutdown = false;
112
114 {
115 // Used as signal that shutdown is in progress from main thread to
116 // speed up the queries by discarding read queries and writing to
117 // the sqlite file instead of the remote mysql server.
118 // The worker thread signals the main thread that all queries are
119 // processed by setting this variable to false again.
120 std::atomic_bool m_Shutdown{false};
121 // Queries go first to the backup thread. This semaphore signals about
122 // new queries.
124 // When the backup thread processed the query, it signals the main
125 // thread with this semaphore about the new query
127
128 // spsc queue with additional backup worker to look at queries first.
129 std::unique_ptr<struct CSqlExecData> m_aQueries[512];
130 };
131
132 std::shared_ptr<CSharedData> m_pShared;
133 void *m_pWorkerThread = nullptr;
134 void *m_pBackupThread = nullptr;
135};
136
137#endif // ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
void Print(Mode DatabaseMode)
Definition connection_pool.cpp:124
Mode
Definition connection_pool.h:76
@ NUM_MODES
Definition connection_pool.h:80
@ READ
Definition connection_pool.h:77
@ WRITE_BACKUP
Definition connection_pool.h:79
@ WRITE
Definition connection_pool.h:78
CDbConnectionPool & operator=(const CDbConnectionPool &)=delete
int m_InsertIdx
Definition connection_pool.h:109
friend class CWorker
Definition connection_pool.h:101
void * m_pBackupThread
Definition connection_pool.h:134
void * m_pWorkerThread
Definition connection_pool.h:133
std::shared_ptr< CSharedData > m_pShared
Definition connection_pool.h:132
friend class CBackup
Definition connection_pool.h:102
~CDbConnectionPool()
Definition connection_pool.cpp:486
bool m_Shutdown
Definition connection_pool.h:111
void Execute(FRead pFunc, std::unique_ptr< const ISqlData > pSqlRequestData, const char *pName)
Definition connection_pool.cpp:145
CDbConnectionPool()
Definition connection_pool.cpp:479
void ExecuteWrite(FWrite pFunc, std::unique_ptr< const ISqlData > pSqlRequestData, const char *pName)
Definition connection_pool.cpp:155
static bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, Write w)
Definition connection_pool.cpp:446
bool(* FWrite)(IDbConnection *, const ISqlData *, Write, char *pError, int ErrorSize)
Definition connection_pool.h:73
bool(* FRead)(IDbConnection *, const ISqlData *, char *pError, int ErrorSize)
Definition connection_pool.h:72
void RegisterSqliteDatabase(Mode DatabaseMode, const char aFilename[64])
Definition connection_pool.cpp:131
void RegisterMysqlDatabase(Mode DatabaseMode, const CMysqlConfig *pMysqlConfig)
Definition connection_pool.cpp:138
void OnShutdown()
Definition connection_pool.cpp:165
Definition sphore.h:62
Definition connection.h:19
Write
Definition connection_pool.h:37
@ NORMAL_FAILED
Definition connection_pool.h:45
@ NORMAL
Definition connection_pool.h:41
@ BACKUP_FIRST
Definition connection_pool.h:39
@ NORMAL_SUCCEEDED
Definition connection_pool.h:43
constexpr auto IO_MAX_PATH_LENGTH
Definition types.h:26
Definition connection_pool.h:114
std::unique_ptr< struct CSqlExecData > m_aQueries[512]
Definition connection_pool.h:129
std::atomic_bool m_Shutdown
Definition connection_pool.h:120
CSemaphore m_NumBackup
Definition connection_pool.h:123
CSemaphore m_NumWorker
Definition connection_pool.h:126
Definition connection_pool.h:49
char m_aPass[64]
Definition connection_pool.h:53
bool m_Setup
Definition connection_pool.h:57
char m_aSslKey[IO_MAX_PATH_LENGTH]
Definition connection_pool.h:61
char m_aDatabase[64]
Definition connection_pool.h:50
char m_aPrefix[64]
Definition connection_pool.h:51
char m_aIp[64]
Definition connection_pool.h:54
char m_aBindaddr[128]
Definition connection_pool.h:55
bool m_UseSsl
Definition connection_pool.h:58
char m_aUser[64]
Definition connection_pool.h:52
char m_aSslCa[IO_MAX_PATH_LENGTH]
Definition connection_pool.h:59
int m_Port
Definition connection_pool.h:56
char m_aSslCert[IO_MAX_PATH_LENGTH]
Definition connection_pool.h:60
Definition connection_pool.cpp:24
Definition connection_pool.h:26
virtual ~ISqlData()=default
std::shared_ptr< ISqlResult > m_pResult
Definition connection_pool.h:33
ISqlData(std::shared_ptr< ISqlResult > pResult)
Definition connection_pool.h:27
Definition connection_pool.h:14
std::atomic_bool m_Completed
Definition connection_pool.h:18
virtual ~ISqlResult()=default
bool m_Success
Definition connection_pool.h:20