Linux'ta tekrarlanabilir bir dizin siparişinin sağlanması


16

Ben koşmak barındırılan sürekli entegrasyon şirketi ve biz Linux üzerinde müşterilerimizin kodu çalıştırın. Kodu her çalıştırdığımızda, ayrı bir sanal makinede çalıştırıyoruz. Ortaya çıkan sık karşılaşılan bir sorun, bir müşterinin testlerinin bazen sanal makinede teslim edilen kodlarının dizin sıralaması nedeniyle başarısız olmasıdır.

Daha fazla ayrıntıya gireyim. OSX'te HFS + dosya sistemi, dizinlerin her zaman aynı sırada geçmesini sağlar. OSX kullanan programcılar, makinelerinde çalışırsa, her yerde çalışması gerektiğini varsayar. Ancak Linux'ta genellikle çalışmaz, çünkü linux dosya sistemleri dizinleri dolaşırken sipariş garantisi sunmaz.

Örnek olarak, 2 dosya olduğunu düşünün: a.rb, b.rb. a.rb tanımlar MyObjectve b.rb kullanır MyObject. İlk önce a.rb yüklenirse, her şey çalışır. Önce b.rb yüklenirse, tanımsız bir değişkene erişmeye çalışır MyObjectve başarısız olur.

Ama bundan daha kötüsü, her zaman başarısız olmuyor. Linux'ta dosya sistemi siparişi sipariş edilmediğinden, farklı makinelerde farklı bir sipariş olacaktır. Bu daha kötüdür, çünkü bazen testler geçer, bazen başarısız olurlar. Bu olası en kötü sonuçtur.

Benim sorum, dosya sistemi siparişini tekrarlanabilir hale getirmenin bir yolu var. Bazı bayrak4 ext4'e göre, bu her zaman dizinleri her zaman belirli bir sırada geçeceğini söylüyor? Ya da belki bu garantiye sahip farklı bir dosya sistemi?



Gerçekten doğru cevaplar yanında - Ne olduğunu "doğru" düzen? Sadece alfasayısal olarak sıralandı mı? Yoksa CTIME ile mi? Keyfi büyülü? Müşteriler bu dağıtım siparişini nasıl sağlıyor? Bu büyülü sipariş bilgileri size nasıl aktarılmalıdır?
Michuelnik

@Michuelnik Gerçek bir doğru düzen yoktur, ancak tekrarlanabilir bir şey, her seferinde aynı sonucu aldığımız anlamına gelir, bu da hiçbir şeyden daha iyi olmaz. İdeal olarak, alfabetik olduğunu düşündüğüm HFS + siparişini kullanırdık.
Paul Biggar

@Michuelnik Bu sorun testleri dağıtımdan çok daha fazla etkiler Dağıtım çoğunlukla Linux'ta gerçekleşir, ancak bir şey başarısız olursa bunu düzeltirler. Testler çoğunlukla OSX üzerinde çalışır, bu yüzden bir şey başarısız olursa bizim hatamız olmalıdır.
Paul Biggar

1
@PaulBiggar: Sorununuzu anlıyorum ve iyi bir çözüm sunamıyorum ( dosya sırasının sorunun nedeni olup olmadığını saptamanın bir yolunu bulamadığınız sürece ). Ama yok o zaman kötü bir noktada gerçekten değilim benim geliştirme (ve CI) çevre tekrarlanabilir başarı varsa ama benim dağıtım platformu "güvenilmez başarısızlık" sendromunu vardır: O "tekrarlanabilir başarı daha tutarsız failur daha" kabul ediyorum. Güvenilmez başarısızlığı en kısa zamanda görmeyi tercih ederim (ideal olarak geliştirme sistemimde, ancak en azından CI sistemimde).
Joachim Sauer

Yanıtlar:


16

Aradığın cevap olmadığını biliyorum, ama doğru çözümün bir dizindeki dosyaların sırasına bağlı olarak kaçınmak olduğuna inanıyorum . Belki de tüm HFS + dosya sistemlerinde her zaman tutarlıdır ve belki de ext4 veya diğer bazı dosya sistemlerinde tutarlı hale getirmenin bir yolunu bulabilirsiniz, ancak uzun vadede tasarruf edeceğinizden daha fazla sıkıntıya mal olacaktır. Uygulamanızı kullanan bir başkası, yalnızca bazı dosya sistemleri türleriyle ve diğerleriyle uyumlu olmadığını fark etmediklerinde kötü bir sürprizle karşılaşacaktır. Dosya sistemi yedekten geri yüklenirse, sıra değişebilir. HFS + tutarlı sırası ve ext4 tutarlı sırası aynı olmayabilir, çünkü uyumluluk sorunlarıyla karşılaşabilirsiniz.

Tüm dizin girişlerini okuyun ve kullanmadan önce sözlükleri sözlük olarak sıralayın. Tıpkı yaptığı gibi ls.

Dosyaları söz a.rbve b.rbbiz tüm bağımlılıklarını ithal sağlamaktan sorumlu olacak zaten her dosyayı, dil kaynak dosyalarını gerektiği programlama değil bahsediyorsak, ama?


Sorun şu ki, çalıştırdığımız kodu yazmadık. Müşteri kodunu çalıştırıyoruz ve kodun nasıl yazıldığını kontrol etmiyoruz. Yani bizim sorunumuz gerçekten sorundan dolayı suçlanıyoruz, çünkü makinelerinde çalışıyor ama bizim değil. Herkesi doğru kod yazmaya zorlayabilirsek, yapardık, ama bu bizim gücümüz dahilinde değil :)
Paul Biggar

10
@PaulBiggar: " CI'nin düzeltmesi gereken sorun tam olarak " burada çalışıyor ama üretimde değil "değil mi? Başka bir deyişle: "Kodum neden sisteminizde bozuluyor?" "Çünkü bizden tam olarak istediğini yapıyoruz!" ;-)
Joachim Sauer

4
Başka kimseyi tanımıyorum, ancak kod makinemde çalışıyor ve sonra bir CI veya meslektaşınızın kasasında başarısız olduğunda derhal düzeltmem gereken platforma veya çevreye bağlı bir şey olduğunu varsayalım ...
matt5784

1
Uygulamada üretimde kullanmayacağınız bir platformda mutlaka geliştirme yapmak kötü bir fikir mi? Yazdıkları platformda geliştirmelerini sağlayın.
Matthew Ife

2
Katılmıyorum. Bence bu harika bir fikir. Geliştirme sunucularından test sunucularına geçiş sırasında çok daha fazla hatanın ortaya çıkmasını sağlar. Bu nedenle kod, üretim sunucularına taşınmadan önce çok daha sağlamdır. Doğru ya da teorik bir dünyada çok daha iyi. Bu, herkesi rüya alanı olarak da bilinen doğru kodu yazmaya zorlayabileceğiniz dünyadır.
Hennes

5

Linux readdir () içindeki POSIX çağrısı tutarlı bir sipariş garantisi vermez. Sıralı sonuçlar istiyorsanız, dosyaları işleyen uygulama, bunların çağrı işlevlerine nasıl sunulduğunu sipariş etmekten sorumludur.

/programming/8977441/does-readdir-guarantee-an-order

Şimdi, bunun müşterinizin kodu olduğunu söylediğiniz ve düzeltemediğiniz için, tutarlı bir readdir () çağrısı sağlamak için kullanılan bağlantılı kütüphaneleri değiştirebilirsiniz. Bu biraz iş gerektirecek ve kendi sorusuna değecektir. Buna hızlı bir referans için bkz. Http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .

Bunu değiştirmek, tahmin edemeyeceğim diğer bazı sorunların ortaya çıkmasına neden olabilir. Kesinlikle uyarılırsınız, ancak müşteriniz düzgün bir şekilde eğitilemiyorsa bu bir çözüm olabilir.


1

Müşterinizi, açıkça belirtilmesi gereken doğal bir sipariş bağımlılığı olduğu konusunda eğitin. Müşterinin bağımlılığı, bir derlemenin tüm sistemlerde çalışacağı ve müşterinin derleme sırası bağımlılığını yakalayan değişen akışı benimsediği şekilde ifade etmesine yardımcı olmayı önerin.

Eğer müşteri diğer makinelerde derlemek istiyorsa, ücretsiz olduğunu düşünmek onları rahatsız edecektir.


Bunu kesinlikle yapacağız. Ancak, bunu yapabilmemiz için gerçekten müşterimiz olmaları faydalı olacaktır.
Paul Biggar

0

Modern Linux (ext4), dosya listeleri için bir B-ağacı dizini ekler. Etkilerinden biri, varsayılan dosya sırasının adlarının bir karma değerine bağlı olmasıdır.

Bu özelliği devre dışı bırakmak için şunu kullanın:

tune2fs -O ^ Instagram Hesabındaki Resim ve Videoları dir_index

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.