mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +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.
		
	
			
		
			
				
	
	
		
			62 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
#include <queue>
 | 
						|
#include <vector>
 | 
						|
#include <functional>
 | 
						|
#include <thread>
 | 
						|
#include <mutex>
 | 
						|
#include <condition_variable>
 | 
						|
#include <atomic>
 | 
						|
#include "trx0sys.h"
 | 
						|
 | 
						|
class ThreadPool {
 | 
						|
public:
 | 
						|
	typedef std::function<void(unsigned)> job_t;
 | 
						|
 | 
						|
	ThreadPool() { m_stop = false; m_stopped = true; }
 | 
						|
	ThreadPool (ThreadPool &&other) = delete;
 | 
						|
	ThreadPool &  operator= (ThreadPool &&other) = delete;
 | 
						|
	ThreadPool(const ThreadPool &) = delete;
 | 
						|
	ThreadPool & operator= (const ThreadPool &) = delete;
 | 
						|
 | 
						|
	bool start(size_t threads_count);
 | 
						|
	void stop();
 | 
						|
	void push(job_t &&j);
 | 
						|
	size_t threads_count() const { return m_threads.size(); }
 | 
						|
private:
 | 
						|
	void thread_func(unsigned thread_num);
 | 
						|
	std::mutex m_mutex;
 | 
						|
	std::condition_variable m_cv;
 | 
						|
	std::queue<job_t> m_jobs;
 | 
						|
	std::atomic<bool> m_stop;
 | 
						|
	std::atomic<bool> m_stopped;
 | 
						|
	std::vector<std::thread> m_threads;
 | 
						|
};
 | 
						|
 | 
						|
class TasksGroup {
 | 
						|
public:
 | 
						|
	TasksGroup(ThreadPool &thread_pool) : m_thread_pool(thread_pool) {
 | 
						|
		m_tasks_count = 0;
 | 
						|
		m_tasks_result = 1;
 | 
						|
	}
 | 
						|
	void push_task(ThreadPool::job_t &&j) {
 | 
						|
		++m_tasks_count;
 | 
						|
		m_thread_pool.push(std::forward<ThreadPool::job_t>(j));
 | 
						|
	}
 | 
						|
	void finish_task(int res) {
 | 
						|
		--m_tasks_count;
 | 
						|
		m_tasks_result.fetch_and(res);
 | 
						|
	}
 | 
						|
	int get_result() const { return m_tasks_result; }
 | 
						|
	bool is_finished() const {
 | 
						|
		return !m_tasks_count;
 | 
						|
	}
 | 
						|
	bool wait_for_finish() {
 | 
						|
		while (!is_finished())
 | 
						|
                        std::this_thread::sleep_for(std::chrono::milliseconds(1));
 | 
						|
		return get_result();
 | 
						|
	}
 | 
						|
private:
 | 
						|
	ThreadPool &m_thread_pool;
 | 
						|
	std::atomic<size_t> m_tasks_count;
 | 
						|
	std::atomic<int> m_tasks_result;
 | 
						|
};
 |