mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 20:36:16 +01:00 
			
		
		
		
	Added support to BACKUP STAGE to maria-backup
This is a port of the code from ES 10.6
See MDEV-5336 for backup stages description.
The following old options are not supported by the new code:
--rsync             ; This is because rsync will not work on tables
                      that are in used.
--no-backup-locks   ; This is disabled as mariadb-backup will always
                      use backup locks for better performance.
		
	
			
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "thread_pool.h"
 | 
						|
#include "common.h"
 | 
						|
 | 
						|
bool ThreadPool::start(size_t threads_count) {
 | 
						|
	if (!m_stopped)
 | 
						|
		return false;
 | 
						|
	m_stopped = false;
 | 
						|
	for (unsigned i = 0; i < threads_count; ++i)
 | 
						|
		m_threads.emplace_back(&ThreadPool::thread_func, this, i);
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
void ThreadPool::stop() {
 | 
						|
	if (m_stopped)
 | 
						|
		return;
 | 
						|
	m_stop = true;
 | 
						|
	m_cv.notify_all();
 | 
						|
	for (auto &t : m_threads)
 | 
						|
		t.join();
 | 
						|
	m_stopped = true;
 | 
						|
};
 | 
						|
 | 
						|
void ThreadPool::push(ThreadPool::job_t &&j) {
 | 
						|
	std::unique_lock<std::mutex> lock(m_mutex);
 | 
						|
	m_jobs.push(j);
 | 
						|
	lock.unlock();
 | 
						|
	m_cv.notify_one();
 | 
						|
}
 | 
						|
 | 
						|
void ThreadPool::thread_func(unsigned thread_num) {
 | 
						|
	if (my_thread_init())
 | 
						|
		die("Can't init mysql thread");
 | 
						|
	std::unique_lock<std::mutex> lock(m_mutex);
 | 
						|
	while(true) {
 | 
						|
		if (m_stop)
 | 
						|
			goto exit;
 | 
						|
		while (!m_jobs.empty()) {
 | 
						|
			if (m_stop)
 | 
						|
				goto exit;
 | 
						|
			job_t j = std::move(m_jobs.front());
 | 
						|
			m_jobs.pop();
 | 
						|
			lock.unlock();
 | 
						|
			j(thread_num);
 | 
						|
			lock.lock();
 | 
						|
		}
 | 
						|
		m_cv.wait(lock, [&] { return m_stop || !m_jobs.empty(); });
 | 
						|
	}
 | 
						|
exit:
 | 
						|
	my_thread_end();
 | 
						|
}
 |