C++-la sadə fixlər(Open Source proyektdə iştirak 2-ci hissə)

Salam hörmətli dostlar, daha əvvəlki məqaləmizdə DOC bug-lardan danışmışdıq.
Demişdik ki, hər hansı Open Source proyektin dokumentasiyasını oxuyub, oradakı səhvləri tapmaq da böyük iş hesab olunur. Çünki siz həmin məhsulun izahındakı səhvləri aradan qaldırırsınız.

Bugünkü söhbətimiz isə, əhəmiyyətlilik dərəcəsi Low olan BUG-lar haqqındadır.
Gəlin bu məqsədlə gündəlik istifadə etdiyimiz avtomobili(əgər varsa) misal çəkək.
Avtomobilin proqram təminatı sözsüz ki, kritik hissələrlə yanaşı, əhəmiyyəti daha aşağı olan hissələrdən ibarətdir.
Daha ətraflı desək, düşünün ki, avtomobilin hava yastıqlarına nəzarət edən kodda ciddi bir nöqsan var və hava yastıqları qəza anında yox, qəzadan sonra açılır. Belə bir hava yastığı kimə lazımdır?
Həmçinin, düşünün ki, avtomobildəki ESP(TCS) sistemi yalnız avtomobil sağa və sola sürüşüb, yoldan çıxdıqdan sonra stabilləşdirir – bu necə də mənasız bir sistem olardı.
Dolayısı ilə məhsulun kritik bölgəsində ən sadə BUG da kritik hesab oluna bilər, çünki insan həyatı bundan asılıdır. Digər tərəfdən deyək ki, avtomobilin multimedia sistemində hansısa bir BUG var və sizin dinlədiyiniz mahnıda qırılma baş verir. Bu sırf məhsulun özü üçün(avtomobil) üçün əhəmiyyətsizdir(sizin pozulan əsəbinizi nəzərə almasaq).

Bununla da yazılan kod ilə, nəticədə əmələ gələn məhsul arasındakı əlaqəni izah etməyə çalışdım.

İndi isə qayıdaq əllə tutula bilən bir misal çəkək(maşın almaq əvəzinə). Düşünək ki, bizim proqramımız MySQL server-in fiziki nüsxəsini(physical backup) alır. Ümumi işini düzgün görür yəni, qaytarıla bilən backup-lar alır.
Lakin onun verdiyi output-da 2 mesaj bir-birinə qarışıb:

170726 11:35:45 Unlocking MDL for all tablesxtrabackup: Transaction log of lsn (2871333326) to (2892754764) was copied.

Halbuki, bu mesaj belə çıxmalı idi:

170726 11:35:45 Unlocking MDL for all tables
xtrabackup: Transaction log of lsn (2871333326) to (2892754764) was copied.

Bu kimi BUG-ların ümumi funksionallığa heç bir təsiri olmadığı üçün, onların əhəmiyyətlilik dərəcəsi Aşağı olaraq qiymətləndirilir. Lakin, bu bug-ların əhəmiyyətliliyi ondan ibarətdir ki, onlar daha tez, bəzən cəmi 1 sətr kodla fix olunur. Bu da yeni başlayanlara, ümumən Open Source proyektə girişmək istəyənlər üçün mükəmməl imkan deməkdir.
Elə əsl həyatda olduğu kimi, çətindən qabaq asan işləri görmək lazımdır.

Yuxarıdakı sözləri nəzərə alıb 2 BUG üçün yazılan fix-ə baxaq. Nümunə bug reportlarımız:

* 1706584
* 1734848

Proyektimizin GitHub repo-su – https://github.com/percona/percona-xtrabackup

İlk edəcəyimiz iş həmin proyekti Fork etməkdir.
Fork-dan sonra bu proyektin kopyası bizim öz istifadəçimizin adı altına düşür – https://github.com/ShahriyarR/percona-xtrabackup

Daha sonra best practice bundan ibarətdir ki, hər bir bug üçün bir branch yaradaq(1706584 nömrəli bug üçün). Onu da qeyd etmək lazımdır ki, hər bir proyektin öz adlandırma prinsipləri var, Percona XtraBackup-in iki əsas versiyası var 2.3 və 2.4. Dolayısı ilə branch-in hansı versiyadan yaradılmasını göstərmək üçün onu da adlandırmada qeyd edirik:

git checkout -b 2.4-xb-bug1706584

İndi isə rahatca gedib öz fiximizi yaza bilərik. Yuxarıda göstərilən problemdən belə aydın olur ki, bizim ehtiyacımız olan şey, Unlocking MDL for all tables mesajının sonuna “newline character” = “\n” əlavə etməkdir:
storage/innobase/xtrabackup/src/backup_mysql.cc faylında lazımı kodu tapırıq:

void
mdl_unlock_all()
{
	msg_ts("Unlocking MDL for all tables");

	xb_mysql_query(mdl_con, "COMMIT", false, true);

	mutex_free(&mdl_lock_con_mutex);
}

“\n” əlavə edirik:

void
mdl_unlock_all()
{
	msg_ts("Unlocking MDL for all tables\n");

	xb_mysql_query(mdl_con, "COMMIT", false, true);

	mutex_free(&mdl_lock_con_mutex);
}

Vəssalam, daha sonra bu dəyişikliyi CommitPush edirik öz forkumuzun verilmiş branch-ına.
Bura qədər fix hazırdır, lakin onu əsas proyektə necə göndərək? Bu məqsədlə də Pull Request yaradırıq. Aşağıdakı kimi:

https://github.com/percona/percona-xtrabackup/pull/470

PR-da, hansı faylda nə dəyişildiyi, kim tərəfindən dəyişdirildiyi və s. avtomatik qeyd olunur.
Aşağıdakı nümunə isə artıq Merge edilmiş PR nümunəsidir:

https://github.com/percona/percona-xtrabackup/pull/454

Bu sizə nə verir?
* Təcrübə keçirsiniz – hansısa mənasız yay təcrübə proqramını gözləməyə ehtiyacınız qalmır.
* Qlobal, böyük proyektdə iştirak etmiş olursunuz.
* Reputasiya qazanırsınız.
* Ümummilli lider Linus Torvaldsın Open Source ürəyi ilə döyünürsünüz.

Səs: +10. Bəyənilsin Zəifdir

Müəllif: Şəhriyar Rzayev

Şərh yazın