backup sequencer pour sauvegarde LVM barbed ! #1

Merged
karthanistyr merged 3 commits from feature/backupsequencer into master 2019-04-12 14:22:24 +00:00
Owner

Une première version du backup sequencer -- voir README.md pour les infos.

Je rajouterai des commits pour étoffer le logging et les commentaires, mais prière de préciser si vous en voulez à des endroits spécifiques.

Une première version du backup sequencer -- voir README.md pour les infos. Je rajouterai des commits pour étoffer le logging et les commentaires, mais prière de préciser si vous en voulez à des endroits spécifiques.
Author
Owner

Quelques stats:

karthanis@karth-arch ../code/backup-tools/git/backupsequencer (git)-[feature/backupsequencer] % coverage run --source backupsequencer/ -m unittest discover -v
test_check_running_pid_when_no_pidfile_return_false (test.test_backup.BackupTests) ... ok
test_check_running_pid_when_pid_is_found_return_true (test.test_backup.BackupTests) ... ok
test_check_running_pid_when_pid_is_not_found_ret_true (test.test_backup.BackupTests) ... ok
test_create_backup_archive_create_staging_same_name_raises (test.test_backup.BackupTests) ... ok
test_create_backup_rename_fails_raise (test.test_backup.BackupTests) ... ok
test_create_backup_taradd_correct_num_calls (test.test_backup.BackupTests) ... ok
test_create_backup_taradd_fails_raises (test.test_backup.BackupTests) ... skipped 'FIXME: context manager problem for exception bubbling.'
test_create_backup_taradd_no_volumes_raise (test.test_backup.BackupTests) ... ok
test_create_backup_taropen_fails_raises (test.test_backup.BackupTests) ... ok
test_create_pid_file (test.test_backup.BackupTests) ... ok
test_do_backup_create_backup_fail_raise (test.test_backup.BackupTests) ... ok
test_do_backup_happy_day_check_calls (test.test_backup.BackupTests) ... ok
test_do_backup_if_no_pid_create_pidfile (test.test_backup.BackupTests) ... ok
test_do_backup_remove_fail_raise (test.test_backup.BackupTests) ... ok
test_do_backup_send_fail_raise (test.test_backup.BackupTests) ... ok
test_do_backup_when_pid_exists_raise (test.test_backup.BackupTests) ... ok
test_filter_due_backups_all_jobs_due (test.test_backup.BackupTests) ... ok
test_filter_due_backups_some_jobs_due (test.test_backup.BackupTests) ... ok
test_filter_history_None_all_jobs_due (test.test_backup.BackupTests) ... ok
test_filter_joblist_None_no_jobs_due (test.test_backup.BackupTests) ... ok
test_filter_no_history_all_jobs_due (test.test_backup.BackupTests) ... ok
test_filter_no_joblist_no_jobs_due (test.test_backup.BackupTests) ... ok
test_run_in_parallel_n_jobs_n_calls (test.test_backup.BackupTests) ... ok
test_run_in_parallel_no_jobs_no_work (test.test_backup.BackupTests) ... ok
test_send_to_repository_happy_day (test.test_backup.BackupTests) ... ok
test_send_to_repository_process_fails_raise (test.test_backup.BackupTests) ... ok
test_load_toml_invalid_toml_throws_decode_error (test.test_configuration.ConfigurationTests) ... ok
test_load_toml_readfile_fails_throws (test.test_configuration.ConfigurationTests) ... ok
test_load_toml_valid_toml_return_dict (test.test_configuration.ConfigurationTests) ... ok
test_search_config_file_first_path_exists_returns (test.test_configuration.ConfigurationTests) ... ok
test_search_config_file_no_path_exist_throw (test.test_configuration.ConfigurationTests) ... ok
test_search_config_file_second_path_exists_returns (test.test_configuration.ConfigurationTests) ... ok
test_search_config_file_third_path_exists_returns (test.test_configuration.ConfigurationTests) ... ok
test_write_toml_invalid_dict_throws_decode_error (test.test_configuration.ConfigurationTests) ... ok
test_write_toml_valid_dict_success (test.test_configuration.ConfigurationTests) ... ok
test_write_toml_writefile_fails_throws (test.test_configuration.ConfigurationTests) ... ok
test_read_empty_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_read_file_open_returns_None (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_read_file_open_throws (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_read_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_write_empty_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_write_file_open_returns_None (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_write_file_throws (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_write_nonempty_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok
test_ensure_arbitrary_dir_exists_create (test.test_environment.EnvironmentTests) ... ok
test_ensure_arbitrary_dir_exists_no_dupe (test.test_environment.EnvironmentTests) ... ok
test_ensure_environment_exists_all_exist (test.test_environment.EnvironmentTests) ... ok
test_ensure_environment_exists_some_miss (test.test_environment.EnvironmentTests) ... ok
test_get_arch_crea_dir_path (test.test_environment.EnvironmentTests) ... ok
test_get_arch_stag_dir_path (test.test_environment.EnvironmentTests) ... ok
test_get_data_dir_path (test.test_environment.EnvironmentTests) ... ok
test_get_history_file_path (test.test_environment.EnvironmentTests) ... ok
test_get_log_dir_path (test.test_environment.EnvironmentTests) ... ok
test_get_snapshot_mount_point_path (test.test_environment.EnvironmentTests) ... ok
test_home_is_variable_before_profile_home (test.test_environment.EnvironmentTests) ... ok
test_raise_backup_error_raises_correct_class (test.test_error.ErrorTests) ... ok
test_init_logger_has_correct_handlers (test.test_logging.LoggingTests) ... ok
test_set_log_level_critical (test.test_logging.LoggingTests) ... ok
test_set_log_level_debug (test.test_logging.LoggingTests) ... ok
test_set_log_level_error (test.test_logging.LoggingTests) ... ok
test_set_log_level_info (test.test_logging.LoggingTests) ... ok
test_set_log_level_unknown_default_warning (test.test_logging.LoggingTests) ... ok
test_set_log_level_warning (test.test_logging.LoggingTests) ... ok
test_pid_is_running_return_false (test.test_processhandler.ProcessHandlerTests) ... ok
test_pid_is_running_return_true (test.test_processhandler.ProcessHandlerTests) ... ok
test_system_call_non0return_err_isnotnone (test.test_processhandler.ProcessHandlerTests) ... ok
test_system_call_success (test.test_processhandler.ProcessHandlerTests) ... ok
test_ctor_values_assigned (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_create_snap_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_delete_only_snapshot_not_main_lv (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_enter_snapshot_double_check_fails_exit (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_enter_snapshot_exists_quit_early (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_enter_success (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_enter_throws_skip_block (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_exit_raises_exc_raised_in_block (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_exit_raises_no_exc_in_block (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_exit_success_exc_raised_in_block (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_exit_success_no_exc_in_block (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_mount_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_snap_double_check_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok
test_ctx_snap_exists_throw (test.test_snapshot.SnapshotContextTests) ... ok
test_exit_mount_exists_snap_exists_success (test.test_snapshot.SnapshotContextTests) ... ok
test_exit_mount_exists_unmount_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok
test_exit_mount_not_exists_no_unmount_delete_called (test.test_snapshot.SnapshotContextTests) ... ok
test_exit_snap_not_exists_delete_called (test.test_snapshot.SnapshotContextTests) ... ok
test_check_mount_exists_process_fails (test.test_snapshot.SnapshotTests) ... ok
test_check_mount_exists_success (test.test_snapshot.SnapshotTests) ... ok
test_check_snap_exists_process_success_return_name (test.test_snapshot.SnapshotTests) ... ok
test_check_snapshot_exists_process_failure (test.test_snapshot.SnapshotTests) ... ok
test_check_snapshot_exists_process_success_no_name (test.test_snapshot.SnapshotTests) ... ok
test_create_snapshot_process_fails (test.test_snapshot.SnapshotTests) ... ok
test_create_snapshot_process_success (test.test_snapshot.SnapshotTests) ... ok
test_delete_snapshot_process_fails (test.test_snapshot.SnapshotTests) ... ok
test_delete_snapshot_process_success (test.test_snapshot.SnapshotTests) ... ok
test_get_lv_path (test.test_snapshot.SnapshotTests) ... ok
test_mount_volume_process_fails (test.test_snapshot.SnapshotTests) ... ok
test_mount_volume_process_success (test.test_snapshot.SnapshotTests) ... ok
test_unmount_volume_process_fails (test.test_snapshot.SnapshotTests) ... ok
test_unmount_volume_process_success (test.test_snapshot.SnapshotTests) ... ok

----------------------------------------------------------------------
Ran 99 tests in 0.120s

OK (skipped=1)
Module 	statements 	missing 	excluded 	coverage
Total 	298 	46 	0 	85%
backupsequencer/__init__.py 	0 	0 	0 	100%
backupsequencer/app.py 	45 	45 	0 	0%
backupsequencer/backup.py 	62 	0 	0 	100%
backupsequencer/configuration.py 	17 	0 	0 	100%
backupsequencer/environment.py 	65 	0 	0 	100%
backupsequencer/error.py 	13 	0 	0 	100%
backupsequencer/logging.py 	15 	0 	0 	100%
backupsequencer/processhandler.py 	16 	0 	0 	100%
backupsequencer/snapshot.py 	65 	1 	0 	98%

Le 0% de couverture sur app.py est dû au fait que je suis en train de voir pour écrire des tests d'intégration mais l'infra est lourde (2 machines, l'une avec une partition LVM)

J'aurais pu faire des unitaires sur la méthode principale mais elle n'est pas très complexe et ça viendra en son temps.

Quelques stats: ``` karthanis@karth-arch ../code/backup-tools/git/backupsequencer (git)-[feature/backupsequencer] % coverage run --source backupsequencer/ -m unittest discover -v test_check_running_pid_when_no_pidfile_return_false (test.test_backup.BackupTests) ... ok test_check_running_pid_when_pid_is_found_return_true (test.test_backup.BackupTests) ... ok test_check_running_pid_when_pid_is_not_found_ret_true (test.test_backup.BackupTests) ... ok test_create_backup_archive_create_staging_same_name_raises (test.test_backup.BackupTests) ... ok test_create_backup_rename_fails_raise (test.test_backup.BackupTests) ... ok test_create_backup_taradd_correct_num_calls (test.test_backup.BackupTests) ... ok test_create_backup_taradd_fails_raises (test.test_backup.BackupTests) ... skipped 'FIXME: context manager problem for exception bubbling.' test_create_backup_taradd_no_volumes_raise (test.test_backup.BackupTests) ... ok test_create_backup_taropen_fails_raises (test.test_backup.BackupTests) ... ok test_create_pid_file (test.test_backup.BackupTests) ... ok test_do_backup_create_backup_fail_raise (test.test_backup.BackupTests) ... ok test_do_backup_happy_day_check_calls (test.test_backup.BackupTests) ... ok test_do_backup_if_no_pid_create_pidfile (test.test_backup.BackupTests) ... ok test_do_backup_remove_fail_raise (test.test_backup.BackupTests) ... ok test_do_backup_send_fail_raise (test.test_backup.BackupTests) ... ok test_do_backup_when_pid_exists_raise (test.test_backup.BackupTests) ... ok test_filter_due_backups_all_jobs_due (test.test_backup.BackupTests) ... ok test_filter_due_backups_some_jobs_due (test.test_backup.BackupTests) ... ok test_filter_history_None_all_jobs_due (test.test_backup.BackupTests) ... ok test_filter_joblist_None_no_jobs_due (test.test_backup.BackupTests) ... ok test_filter_no_history_all_jobs_due (test.test_backup.BackupTests) ... ok test_filter_no_joblist_no_jobs_due (test.test_backup.BackupTests) ... ok test_run_in_parallel_n_jobs_n_calls (test.test_backup.BackupTests) ... ok test_run_in_parallel_no_jobs_no_work (test.test_backup.BackupTests) ... ok test_send_to_repository_happy_day (test.test_backup.BackupTests) ... ok test_send_to_repository_process_fails_raise (test.test_backup.BackupTests) ... ok test_load_toml_invalid_toml_throws_decode_error (test.test_configuration.ConfigurationTests) ... ok test_load_toml_readfile_fails_throws (test.test_configuration.ConfigurationTests) ... ok test_load_toml_valid_toml_return_dict (test.test_configuration.ConfigurationTests) ... ok test_search_config_file_first_path_exists_returns (test.test_configuration.ConfigurationTests) ... ok test_search_config_file_no_path_exist_throw (test.test_configuration.ConfigurationTests) ... ok test_search_config_file_second_path_exists_returns (test.test_configuration.ConfigurationTests) ... ok test_search_config_file_third_path_exists_returns (test.test_configuration.ConfigurationTests) ... ok test_write_toml_invalid_dict_throws_decode_error (test.test_configuration.ConfigurationTests) ... ok test_write_toml_valid_dict_success (test.test_configuration.ConfigurationTests) ... ok test_write_toml_writefile_fails_throws (test.test_configuration.ConfigurationTests) ... ok test_read_empty_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok test_read_file_open_returns_None (test.test_environment.EnvironmentFileHandlingTests) ... ok test_read_file_open_throws (test.test_environment.EnvironmentFileHandlingTests) ... ok test_read_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok test_write_empty_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok test_write_file_open_returns_None (test.test_environment.EnvironmentFileHandlingTests) ... ok test_write_file_throws (test.test_environment.EnvironmentFileHandlingTests) ... ok test_write_nonempty_file_succeeds (test.test_environment.EnvironmentFileHandlingTests) ... ok test_ensure_arbitrary_dir_exists_create (test.test_environment.EnvironmentTests) ... ok test_ensure_arbitrary_dir_exists_no_dupe (test.test_environment.EnvironmentTests) ... ok test_ensure_environment_exists_all_exist (test.test_environment.EnvironmentTests) ... ok test_ensure_environment_exists_some_miss (test.test_environment.EnvironmentTests) ... ok test_get_arch_crea_dir_path (test.test_environment.EnvironmentTests) ... ok test_get_arch_stag_dir_path (test.test_environment.EnvironmentTests) ... ok test_get_data_dir_path (test.test_environment.EnvironmentTests) ... ok test_get_history_file_path (test.test_environment.EnvironmentTests) ... ok test_get_log_dir_path (test.test_environment.EnvironmentTests) ... ok test_get_snapshot_mount_point_path (test.test_environment.EnvironmentTests) ... ok test_home_is_variable_before_profile_home (test.test_environment.EnvironmentTests) ... ok test_raise_backup_error_raises_correct_class (test.test_error.ErrorTests) ... ok test_init_logger_has_correct_handlers (test.test_logging.LoggingTests) ... ok test_set_log_level_critical (test.test_logging.LoggingTests) ... ok test_set_log_level_debug (test.test_logging.LoggingTests) ... ok test_set_log_level_error (test.test_logging.LoggingTests) ... ok test_set_log_level_info (test.test_logging.LoggingTests) ... ok test_set_log_level_unknown_default_warning (test.test_logging.LoggingTests) ... ok test_set_log_level_warning (test.test_logging.LoggingTests) ... ok test_pid_is_running_return_false (test.test_processhandler.ProcessHandlerTests) ... ok test_pid_is_running_return_true (test.test_processhandler.ProcessHandlerTests) ... ok test_system_call_non0return_err_isnotnone (test.test_processhandler.ProcessHandlerTests) ... ok test_system_call_success (test.test_processhandler.ProcessHandlerTests) ... ok test_ctor_values_assigned (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_create_snap_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_delete_only_snapshot_not_main_lv (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_enter_snapshot_double_check_fails_exit (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_enter_snapshot_exists_quit_early (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_enter_success (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_enter_throws_skip_block (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_exit_raises_exc_raised_in_block (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_exit_raises_no_exc_in_block (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_exit_success_exc_raised_in_block (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_exit_success_no_exc_in_block (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_mount_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_snap_double_check_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok test_ctx_snap_exists_throw (test.test_snapshot.SnapshotContextTests) ... ok test_exit_mount_exists_snap_exists_success (test.test_snapshot.SnapshotContextTests) ... ok test_exit_mount_exists_unmount_fails_throw (test.test_snapshot.SnapshotContextTests) ... ok test_exit_mount_not_exists_no_unmount_delete_called (test.test_snapshot.SnapshotContextTests) ... ok test_exit_snap_not_exists_delete_called (test.test_snapshot.SnapshotContextTests) ... ok test_check_mount_exists_process_fails (test.test_snapshot.SnapshotTests) ... ok test_check_mount_exists_success (test.test_snapshot.SnapshotTests) ... ok test_check_snap_exists_process_success_return_name (test.test_snapshot.SnapshotTests) ... ok test_check_snapshot_exists_process_failure (test.test_snapshot.SnapshotTests) ... ok test_check_snapshot_exists_process_success_no_name (test.test_snapshot.SnapshotTests) ... ok test_create_snapshot_process_fails (test.test_snapshot.SnapshotTests) ... ok test_create_snapshot_process_success (test.test_snapshot.SnapshotTests) ... ok test_delete_snapshot_process_fails (test.test_snapshot.SnapshotTests) ... ok test_delete_snapshot_process_success (test.test_snapshot.SnapshotTests) ... ok test_get_lv_path (test.test_snapshot.SnapshotTests) ... ok test_mount_volume_process_fails (test.test_snapshot.SnapshotTests) ... ok test_mount_volume_process_success (test.test_snapshot.SnapshotTests) ... ok test_unmount_volume_process_fails (test.test_snapshot.SnapshotTests) ... ok test_unmount_volume_process_success (test.test_snapshot.SnapshotTests) ... ok ---------------------------------------------------------------------- Ran 99 tests in 0.120s OK (skipped=1) ``` ``` Module statements missing excluded coverage Total 298 46 0 85% backupsequencer/__init__.py 0 0 0 100% backupsequencer/app.py 45 45 0 0% backupsequencer/backup.py 62 0 0 100% backupsequencer/configuration.py 17 0 0 100% backupsequencer/environment.py 65 0 0 100% backupsequencer/error.py 13 0 0 100% backupsequencer/logging.py 15 0 0 100% backupsequencer/processhandler.py 16 0 0 100% backupsequencer/snapshot.py 65 1 0 98% ``` Le 0% de couverture sur `app.py` est dû au fait que je suis en train de voir pour écrire des tests d'intégration mais l'infra est lourde (2 machines, l'une avec une partition LVM) J'aurais pu faire des unitaires sur la méthode principale mais elle n'est pas très complexe et ça viendra en son temps.
@ -0,0 +52,4 @@
for job_id, time_exec, result in async_results:
try:
result.get() # materialise the subprocess result
Author
Owner

De la part de @ookami:

Donc, si la phase de dépiautage prend du temps ou coince, pas de fin du process parent, et pas de prochain snapshot possible.
Faudrait trouver un moyen de l'alerter, je n'ai pas de problème avec le concept mais on peut se retrouver vite avec rien de sauvegardé si on ne fait pas gaffe.
J'aime bien le timeout aussi mais il faut voir si le dev est simple à faire, là dessus j'ai pas d'avis, ne connaissant pas python.

Le problème ici est qu'il est théoriquement possible qu'une tâche de backup dans un process enfant devienne zombie ou prenne simplement trop de temps, bloquant les itération successives du backupsequencer.

Python expose un timeout sur multiprocessing.pool.AsyncResult.get: https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.pool.AsyncResult.get

À décider: quelle valeur pour le timeout ?

À étudier: qu'arrive-t-il en pratique quand un timeout est déclenché ?

@karthanistyr:

J’appelle cette fonction sans timeout pour le moment mais ça m’a l’air trivial d’en mettre un
Mais du coup faut voir si il tue le process enfant parce que sinon on se trouve dans le cas du pid zombie
Mais un pid zombie aurait potentiellement encore des handles ouvertes sur le filesystem snapshot, ce qui empêcherait peut-être son démontage et l’évacuation du snapshot lui même
Ce qui pourrait se transformer en blocage quand même
Mais on aurait une erreur dans le log et l’historique
À étudier :)

De la part de @ookami: >Donc, si la phase de dépiautage prend du temps ou coince, pas de fin du process parent, et pas de prochain snapshot possible. Faudrait trouver un moyen de l'alerter, je n'ai pas de problème avec le concept mais on peut se retrouver vite avec rien de sauvegardé si on ne fait pas gaffe. J'aime bien le timeout aussi mais il faut voir si le dev est simple à faire, là dessus j'ai pas d'avis, ne connaissant pas python. Le problème ici est qu'il est théoriquement possible qu'une tâche de backup dans un process enfant devienne zombie ou prenne simplement trop de temps, bloquant les itération successives du backupsequencer. Python expose un timeout sur `multiprocessing.pool.AsyncResult.get`: https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.pool.AsyncResult.get À décider: quelle valeur pour le timeout ? À étudier: qu'arrive-t-il en pratique quand un timeout est déclenché ? @karthanistyr: > J’appelle cette fonction sans timeout pour le moment mais ça m’a l’air trivial d’en mettre un > Mais du coup faut voir si il tue le process enfant parce que sinon on se trouve dans le cas du pid zombie > Mais un pid zombie aurait potentiellement encore des handles ouvertes sur le filesystem snapshot, ce qui empêcherait peut-être son démontage et l’évacuation du snapshot lui même > Ce qui pourrait se transformer en blocage quand même > Mais on aurait une erreur dans le log et l’historique > À étudier :)
@ -0,0 +26,4 @@
return current_time > last_backup_time
def check_running_pid(job_id):
Author
Owner

De la part de @ookami:

Donc là, tu lis ton fichier pid, il te renvoie un numéro. Si ça correspond à un process qui tourne et qui réagit à ton fake_signal, tu te dis que le programme tourne déjà.
Indépendament du fait que ça ait rapport avec le backup sequencer
Si je comprends bien ?
Pourquoi ne pas gérer un fichier qui fonctionne comme un lock et on teste juste le fichier ? On le créé au début, on le tej à la fin ? Qu'est-ce qu'apporte le numéro de process ?

Un lockfile serait un fichier créé puis supprimé à la sortie du process. Il n'a pas besoin de contenu.

De la part de @ookami: > Donc là, tu lis ton fichier pid, il te renvoie un numéro. Si ça correspond à un process qui tourne et qui réagit à ton fake_signal, tu te dis que le programme tourne déjà. > Indépendament du fait que ça ait rapport avec le backup sequencer > Si je comprends bien ? > Pourquoi ne pas gérer un fichier qui fonctionne comme un lock et on teste juste le fichier ? On le créé au début, on le tej à la fin ? Qu'est-ce qu'apporte le numéro de process ? Un *lockfile* serait un fichier créé puis supprimé à la sortie du process. Il n'a pas besoin de contenu.
@ -0,0 +84,4 @@
create_pid_file(job_id)
archive_file_path = create_backup_archive(job_id, job_data, time_started)
send_to_repository(archive_file_path, config['network'])
Author
Owner

De la part de @ookami:

Si send_to_repository fini mal, à priori ça va donc rester en local

Décision à prendre: garde-t-on les archives dont le transfert a échoué ?

  • Si oui, ça permet une action manuelle et réduit modérément l'urgence du problème (la supervision devrait le voir de toutes manières).
  • Si non, ça économise l'espace disque local et réduit le risque d'un engorgement (par exemple, problème récurrent de connectivité avec le serveur distant), mais interdit l'action manuelle
De la part de @ookami: >Si send_to_repository fini mal, à priori ça va donc rester en local Décision à prendre: garde-t-on les archives dont le transfert a échoué ? - Si oui, ça permet une action manuelle et réduit modérément l'urgence du problème (la supervision devrait le voir de toutes manières). - Si non, ça économise l'espace disque local et réduit le risque d'un engorgement (par exemple, problème récurrent de connectivité avec le serveur distant), mais interdit l'action manuelle
Author
Owner

J'ai ajouté un long commentaire signifiant qu'on garde les archives non-envoyées. On dépendra initialement d'un système externe pour observer si les archives s'accumulent (ou si le backup échoue de manière répétée).

J'ai ajouté un long commentaire signifiant qu'on garde les archives non-envoyées. On dépendra initialement d'un système externe pour observer si les archives s'accumulent (ou si le backup échoue de manière répétée).
Author
Owner

Feu vert:

@Draak

je te dirais bien que j'ai pas pu lire les corrections et que j'aurais bien lut, mais le resultat sera pas vraiment different. j'ai regarder pendant 2h hier et j'avais rien a dire ce matin :p

@ookami

Moi ça va !

Feu vert: @Draak > je te dirais bien que j'ai pas pu lire les corrections et que j'aurais bien lut, mais le resultat sera pas vraiment different. j'ai regarder pendant 2h hier et j'avais rien a dire ce matin :p @ookami > Moi ça va !
karthanistyr changed title from WIP: backup sequencer pour sauvegarde LVM barbed ! to backup sequencer pour sauvegarde LVM barbed ! 2019-04-12 14:21:36 +00:00
karthanistyr closed this pull request 2019-04-12 14:22:24 +00:00
karthanistyr deleted branch feature/backupsequencer 2019-04-12 14:50:46 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
barbedfr/backup-tools!1
No description provided.