Slide 1

Slide 1 text

TPDLFUϥΠϒϥϦ΁ͷ )BQQZ&ZFCBMMT7FSTJPO 3'$ ͷಋೖ ԘҪඒ࡙ !TIJPJNN!DPF@ 3VCZ"TTPDJBUJPO"DUJWJUZ3FQPSU

Slide 2

Slide 2 text

ࣗݾ঺հ ◼︎ ԘҪඒ࡙ ͓͍͠ ◼︎ !TIJPJNN (JU)VC ◼︎ !DPF@ 5XJUUFS !DPF #MVFTLZ ◼︎ 8FCΞϓϦέʔγϣϯϓϩάϥϚɺ3VCZJTU ◼︎ גࣜձࣾΤεɾΤϜɾΤεɹϓϩμΫτ։ൃ෦ ◼︎ ஍Ҭ3VCZίϛϡχςΟ"TBLVTBSCϝϯόʔ

Slide 3

Slide 3 text

ϓϩδΣΫτ֓ཁ ʮTPDLFUϥΠϒϥϦ΁ͷ ɹ)BQQZ&ZFCBMMT7FSTJPO 3'$ ͷಋೖʯ ◼︎ ໨తɿ ɹʮࢦఆͷαʔόʔʹରͯ͠5$1Ͱ઀ଓͨ͠ ɹɹΫϥΠΞϯτιέοτΛฦ͢ʯϝιουͷ઀ଓੑվળ ◼︎ ର৅ɿ ɹɾ4PDLFUUDQ 3VCZ࣮૷ ɹɾ5$14PDLFUOFX $࣮૷

Slide 4

Slide 4 text

ຊϓϩδΣΫτͰղܾ͍ͨ͠՝୊ ◼︎ ໊લղܾͷஈ֊ʹ͓͚Δ՝୊ લఏ ΞυϨεϑΝϛϦ͝ͱʹʮ௚ྻʹʯ%/4໰͍߹ΘͤΛߦ͏ *1W*1WΞυϨεΛͦΕͧΕ%/4໰͍߹Θͤ͢Δࡍɺ ઌʹૹ৴͞Εͨ΋ͷʹରͯ͠%/4αʔό͕ଈ࠲ʹϨεϙϯεΛฦ͞ͳ͍৔߹ɺ ΫϥΠΞϯτ͸ೋͭ໨ͷϦΫΤετΛૹ৴͢Δ͜ͱ͕Ͱ͖ͣʹ Ұͭ໨ͷ݁Ռ͕ฦͬͯ͘Δ·Ͱಈ࡞Λఀࢭ͢Δ

Slide 5

Slide 5 text

ຊϓϩδΣΫτͰղܾ͍ͨ͠՝୊ ◼︎ ઀ଓࢼߦͷஈ֊ʹ͓͚Δ՝୊ લఏ ղܾࡁΈͷ*1ΞυϨεͻͱͭͣͭʹରͯ͠ʮ௚ྻʹʯϦΫΤετΛ ૹ৴͢Δ Ѽઌαʔόͷ*1ΞυϨε΁ϦΫΤετΛૹ৴ͨ͠ޙɺ αʔό͕ଈ࠲ʹϨεϙϯεΛฦ͞ͳ͍৔߹ɺ ΫϥΠΞϯτ͸઀ଓͷཱ֬·ͨ͸ࣦഊ͕֬ఆ͢Δ·Ͱಈ࡞Λఀࢭ͢Δ ʹղܾࡁΈͷ*1ΞυϨε͕ෳ਺͋ͬͨͱͯ͠΋ɺ ɹ଴ػதʹଞͷ*1ΞυϨεѼͷ઀ଓΛࢼΈΔ͜ͱ͕Ͱ͖ͳ͍

Slide 6

Slide 6 text

)BQQZ&ZFCBMMT7FSTJPO )&W ΞϧΰϦζϜ Ҏ্ͷ՝୊͸ϗετ͕ *1Wɾ*1W྆ํͷΞυϨεΛ͍࣋ͬͯΔ؀ڥɺ ͍ΘΏΔσϡΞϧελοΫ؀ڥͰ͸Ұൠతͳ՝୊Ͱ͋Δ *&5'Ͱ͸͜ͷ໰୊Λճආ͢ΔͨΊɺ3'$ʹͯ )BQQZ&ZFCBMMT7FSTJPOΞϧΰϦζϜΛنఆ͍ͯ͠Δ IUUQTEBUBUSBDLFSJFUGPSHEPDIUNMSGD

Slide 7

Slide 7 text

)BQQZ&ZFCBMMT7FSTJPO )&W ΞϧΰϦζϜ *OJUJBUJPOPGBTZODISPOPVT%/4RVFSJFT ɹɹɹ ඇಉظͰ%/4໰͍߹ΘͤΛ։࢝͢Δ 4PSUJOHPGSFTPMWFEEFTUJOBUJPOBEESFTTFT ɹɹɹ औಘͨ͠ΞυϨεΛιʔτ͢Δ *OJUJBUJPOPGBTZODISPOPVTDPOOFDUJPOBUUFNQUT ɹɹɹ ඇಉظͰ͜ΕΒͷΞυϨεʹର͢Δ઀ଓࢼߦΛ։࢝͢Δ &TUBCMJTINFOUPGPOFDPOOFDUJPO XIJDIDBODFMTBMMPUIFSBUUFNQUT ɹɹɹ ͍ͣΕ͔ͷ઀ଓཱ͕֬ͨ͠ΒɺͦΕҎ֎͸Ωϟϯηϧ͢Δ )BQQZ&ZFCBMMT7FSTJPO#FUUFS$POOFDUJWJUZ6TJOH$PODVSSFODZ0WFSWJFX IUUQTEBUBUSBDLFSJFUGPSHEPDIUNMSGDTFDUJPO

Slide 8

Slide 8 text

)&Wಋೖલͷಈ࡞γφϦΦ ྫ *1Wͷ໊લղܾΛ։࢝ *1Wͷ໊લղܾΛ଴ػ *1Wͷ໊લղܾ͕׬ྃ *1Wͷ໊લղܾΛ։࢝ *1Wͷ໊લղܾΛ଴ػ *1Wͷ໊લղܾ͕׬ྃ *1WΞυϨεѼʹ઀ଓࢼߦΛ։࢝ *1WΞυϨεѼͷ઀ଓΛ଴ػ *1WΞυϨεѼͷ઀ଓʹࣦഊ *1WΞυϨεѼʹ઀ଓࢼߦΛ։࢝ *1WΞυϨεѼͷ઀ଓΛ଴ػ *1WΞυϨεѼͷ઀ଓʹ੒ޭ શ͕ͯ௚ྻʹಈ࡞

Slide 9

Slide 9 text

)&Wಋೖޙͷಈ࡞γφϦΦ ྫᶃ ϝΠϯεϨου͔ΒࢠεϨουΛೋͭੜ੒͠ɺ ֤εϨου಺ͰͦΕͧΕ*1W*1Wͷ໊લղܾΛ։࢝ ͍ͣΕ͔ͷΞυϨεϑΝϛϦͷ໊લղܾΛ଴ػ ઌʹ*1Wͷ໊લղܾ͕׬ྃ *1WΞυϨεѼʹ઀ଓΛ։࢝ *1WΞυϨεѼͷ઀ଓཱ͔֬*1WͷΞυϨεͷ໊લղܾΛ଴ػ *1Wͷ໊લղܾ͕׬ྃ ᫔᫓ճආͷͨΊNTܦաޙ *1WΞυϨεѼͷ઀ଓΛ։࢝ *1WΞυϨεѼͷ઀ଓʹࣦഊ *1WΞυϨεѼͷ઀ଓΛ଴ػ *1WΞυϨεѼͷ઀ଓʹ੒ޭ ໊લղܾ ઀ଓ Λ։࢝ ໊લղܾ ͕׬ྃɺ*1WΞυϨεѼͷ઀ଓ͕ՄೳʹͳΔ ઀ଓ Λ։࢝ ઀ଓ ʹࣦഊ ઀ଓ ʹ੒ޭ

Slide 10

Slide 10 text

)&Wಋೖޙͷಈ࡞γφϦΦ ྫᶄ ϝΠϯεϨου͔ΒࢠεϨουΛೋͭੜ੒͠ɺ ֤εϨου಺ͰͦΕͧΕ*1W*1Wͷ໊લղܾΛ։࢝ ͍ͣΕ͔ͷΞυϨεϑΝϛϦͷ໊લղܾΛ଴ػ ઌʹ*1Wͷ໊લղܾ͕׬ྃ *1WͰͷ઀ଓΛ༏ઌ͢ΔͨΊ *1Wͷ໊લղܾΛNT଴ػ *1Wͷ໊લղܾ͕׬ྃ *1WΞυϨεѼʹ઀ଓΛ։࢝ ᫔᫓ճආͷͨΊNTܦաޙ *1WΞυϨεѼͷ઀ଓࢪߦΛ։࢝ *1WΞυϨεѼ઀ଓʹࣦഊͨ͜͠ͱ͕֬ఆ *1WΞυϨεѼͷ઀ଓΛ଴ػ *1WΞυϨεѼͷ઀ଓʹ੒ޭ ໊લղܾ ໊લղܾ ͕׬ྃ ઀ଓ Λ։࢝ ઀ଓ ʹࣦഊ ઀ଓ ʹ੒ޭ

Slide 11

Slide 11 text

ϓϩδΣΫτͷ໨ඪ 4PDLFUUDQϝιουͱ5$14PDLFUOFXϝιουʹ )BQQZ&ZFCBMMT7FSTJPOΞϧΰϦζϜΛ࣮૷͢Δ ◼︎ ઌߦϓϩδΣΫτɿ ɹদԼਖ਼थࢯ ϝϯλʔాத఩ࢯ ʹΑΔ ɹ೥౓3VCZΞιγΤʔγϣϯ։ൃॿ੒ϓϩδΣΫτ ɹʮSVCZͷඪ४ϥΠϒϥϦ4PDLFU΁ͷ ɹɹ)BQQZ&ZFCBMMT7FSTJPO 3'$ ͷಋೖʯ ɹɹ IUUQTXXXSVCZPSKQKBOFXT

Slide 12

Slide 12 text

ઌߦϓϩδΣΫτͷϝϯλʔϨϙʔτʹ͓͍ͯ ʮ)&W͸ঢ়ଶભҠ͢ΔΞϧΰϦζϜͰ͋Δ͜ͱʯ ͕ࣔ͞Ε͍ͯΔ ˞IUUQTXXXSVCZPSKQHSBOUNBUTVTIJUB@NFOUPS@SFQPSUQEG ◽)&Wͷੑ࣭ ɾॲཧʹ͸ஈ֊͕͋ΓɺͲͷஈ֊ʹ͍Δ͔ʹԠͯ͡ಛఆͷॲཧΛߦ͏ ɾॲཧΛߦͬͨ݁ՌʹΑͬͯมԽ͢ΔϦιʔε͕͋Δ ɾॲཧΛߦͬͨ݁ՌɺมԽͨ͠Ϧιʔεͷঢ়ଶʹΑͬͯ ɹ࣍ʹਐΉஈ֊͕ܾఆ͢Δ ➡︎ ʮॲཧͷஈ֊ʯΛʮঢ়ଶʯͱͯ͠ද͢͜ͱͰɺ ɹͦͷ࣍ʹߦ͏΂͖ॲཧΛ໌Β͔ʹ͢Δ ঢ়ଶભҠʹΑΔΞϧΰϦζϜͷཧղ

Slide 13

Slide 13 text

ઌߦϓϩδΣΫτͷϝϯλʔϨϙʔτʹܝࡌͷঢ়ଶભҠਤΛ खֻ͔Γʹɺ)&Wͷಈ࡞γφϦΦΛٙࣅίʔυ ˞ ͱͯ͠࡞੒ ˞IUUQTHJTUHJUIVCDPNTIJPJNNGCCGDBGDD ff BFC ➡︎ ٙࣅίʔυΛݩʹɺʮঢ়ଶʯͷҰཡΛચ͍ग़͢ ঢ়ଶભҠʹΑΔΞϧΰϦζϜͷཧղ ˞IUUQTXXXSVCZPSKQHSBOUNBUTVTIJUB@NFOUPS@SFQPSUQEG

Slide 14

Slide 14 text

ঢ়ଶͷҰཡ WD GBJMVSF WX TVDDFTT WD WD TUBSU WX UJNFPVU ʜ։࢝࣌఺Ͱͷঢ়ଶɻ໊લղܾΛ։࢝͢Δ ʜ໊લղܾ·ͨ͸઀ଓͷ׬ྃΛ଴ػ͢ΔͨΊͷঢ়ଶ ʜ઀ଓΛ։࢝͢ΔͨΊͷঢ়ଶ ʜऴྃ࣌ʹࢸΔঢ়ଶ

Slide 15

Slide 15 text

ঢ়ଶͷ঺հ TUBSU ʜ։࢝࣌఺Ͱͷঢ়ଶ ɹ*1W*1WΞυϨεͷ໊લղܾΛͦΕͧΕ։࢝͢Δ ɹɾઌʹ*1WΞυϨεΛղܾͰ͖ͨ৔߹ ➡︎ WD΁ભҠ ɹɾઌʹ*1WΞυϨεΛղܾͰ͖ͨ৔߹ ➡︎ WX΁ભҠ

Slide 16

Slide 16 text

ঢ়ଶͷ঺հ ʜ*1WΞυϨεͷղܾΛNT଴ػ͢Δ ɹ˞3'$Ͱ͸*1WΞυϨεΑΓ΋*1WΞυϨεͰͷ઀ଓΛ ɹɹ༏ઌ͢Δૂ͍͕͋Δ ɹɹ*1WΞυϨεѼͷ઀ଓΛ։࢝͢Δલʹ ɹɹ*1WΞυϨεͷղܾΛ଴ػ͢Δඞཁ͕͋Δ ɹɾ࣌ؒ಺ʹ*1WΞυϨεΛղܾͰ͖ͨ৔߹ ➡︎ WD΁ભҠ ɹɾ࣌ؒ಺ʹ*1WΞυϨεΛղܾͰ͖ͳ͔ͬͨ৔߹ ➡︎ WD΁ભҠ WX WD ʜ*1WΞυϨεѼʹ઀ଓΛ։࢝͢Δ ɹ ➡︎ WX΁ભҠ

Slide 17

Slide 17 text

ঢ়ଶͷ঺հ WD ʜ*1W·ͨ͸*1WΞυϨεѼʹ઀ଓΛ։࢝͢Δ ɹ˞WX͔ΒભҠ͖ͯͨ͠৔߹͸*1WΞυϨεѼʹ઀ଓΛ։࢝ ɹ˞WX͔ΒWD΁ભҠͯ͘͠Δέʔε΋͋Δ ɹ ➡︎ WX΁ભҠ WD ʜ*1WΞυϨεѼʹ઀ଓΛ։࢝͢Δ ɹ ➡︎ WX΁ભҠ͢Δ

Slide 18

Slide 18 text

ঢ়ଶͷ঺հ WX ʜ઀ଓͷ׬ྃΛ଴ػ͢Δ ɹ·໊ͩલղܾ͕ऴΘ͍ͬͯͳ͍ΞυϨεϑΝϛϦ͕͋Δ৔߹ɺ ɹಉ࣌ʹ໊લղܾͷ׬ྃ΋଴ػ͢Δ ɹ ଴ػ࣌ؒલճͷ઀ଓ։͔࢝ΒNTܦա͢Δ·Ͱ ɹɾنఆͷ଴ػ࣌ؒ಺ʹ઀ଓ͕׬ྃͨ͠৔߹ ➡︎ TVDDFTT΁ભҠ ɹɾنఆͷ଴ػ࣌ؒ಺໊લղܾ͕׬ྃͨ͠৔߹ ➡︎ ࠶ͼWX΁ભҠ ɹɹ˞໊લղܾ͕׬ྃͨ͠৔߹͸WD΁ભҠͯ͠৽͍͠઀ଓΛ։͍͕࢝ͨ͠ɺ ɹɹɹ᫔᫓ճආͷͨΊʹWXͰنఆ࣌ؒ NT ܦա͢Δ·Ͱ଴ػ͢Δ ɹɹɹ଴ػ࣌ؒΛܦաͨ͠ΒWD΁ભҠ ɹɾنఆͷ଴ػ࣌ؒΛܦաͨ͠৔߹ɿ ɹɹɹະ઀ଓͷΞυϨε͕࢒͍ͬͯΔ ➡︎ WD΁ભҠ ɹɹɹະ઀ଓͷΞυϨε͕࢒͍ͬͯͳ͍ ➡︎ ࠶ͼWX΁ભҠ

Slide 19

Slide 19 text

UJNFPVU GBJMVSF TVDDFTT ঢ়ଶͷ঺հ ʜ WDɺWDɺWD·ͨ͸WX͔ΒભҠ ɹ઀ଓʹ੒ޭɺιέοτΛฦ͢ ʜ TUBSUɺWDɺWDɺWD·ͨ͸WX͔ΒભҠ ɹ͢΂ͯͷ໊લղܾ·ͨ͸͢΂ͯͷ઀ଓࢼߦʹࣦഊɺྫ֎ൃੜ ʜ TUBSUɺWDɺWDɺWD·ͨ͸WX͔ΒભҠ ɹϢʔβʔࢦఆͷλΠϜΞ΢τʹͯྫ֎ൃੜ

Slide 20

Slide 20 text

ঢ়ଶಉ࢜ͷؔ܎ WD GBJMVSF WX TVDDFTT WD WD TUBSU WX UJNFPVU

Slide 21

Slide 21 text

࣮૷ͷେ࿮ 4PDLFUUDQ def self.tcp(host, port, ...) # ... state = :start loop do case state when :start # ... state = :v6c when :v4w # ... when :v6c, :v4c, :v46c # ... when :v46w # ... when :success # ... end end ,FSOFMMPPQͱDBTFจͷ૊Έ߹ΘͤʹΑΓঢ়ଶભҠΛදݱ͢Δ ϧʔϓ಺Ͱঢ়ଶʹԠͯ͡ॲཧΛߦ͍ɺ৽͍͠ঢ়ଶΛઃఆ͠ɺ ࣍ͷϧʔϓʹೖΔ ϧʔϓʹ͖ͭঢ়ଶભҠΛදݱ ঢ়ଶΛTUBSUʹॳظԽ

Slide 22

Slide 22 text

࣮૷ͷେ࿮ 4PDLFUUDQ ໊લղܾͷ։࢝ case state when :start # ... queue = HostnameResolutionQueue.new # ... Thread.new(host, port, queue) { |*args| hostname_resolution(*args) } # ... ΞυϨεϑΝϛϦ͝ͱʹεϨουΛੜ੒͠ɺ ࢠεϨουͷதͰฒߦʹ໊લղܾ༻ϝιουΛ࣮ߦ ࢠεϨουʹ͸͋Β͔͡Ί࡞੒ͨ͠QJQFΛ౉͓ͯ͘͠ class HostnameResolutionQueue def initialize(size) # ... @rpipe, @wpipe = IO.pipe ༧ΊQJQFΛ࡞੒͓͖ͯ͠ɺ εϨουͷҾ਺ʹ౉͢

Slide 23

Slide 23 text

࣮૷ͷେ࿮ 4PDLFUUDQ ໊લղܾͷ։࢝ # ࢠεϨουͰݺͼग़໊͢લղܾ༻ϝιου de begin resolved_addrinfos = Addrinfo.getaddrinfo( host, port, ADDRESS_FAMILIES[family], :STREAM ) hostname_resolution_queue.add_resolved( family, resolved_addrinfos ) rescue => e # ... end ࢠεϨου ໊લղܾ༻ϝιουͰ͸"EESJOGPHFUBEESJOGPΛݺͼɺ ͦͷ׬ྃ࣍ୈQJQFͷॻ͖ࠐΈଆʹͦͷࢫΛ௨஌͢Δ ໊લղܾϝιου͕ऴྃ͢ΔͱɺࢠεϨου͸ऴྃ ໊લղܾΛ࣮ߦ ໊લղܾͷ׬ྃΛQJQFʹ௨஌ def add_resolved(family, resolved_addrinfos) @mutex.synchronize do @queue.push [family, resolved_addrinfos] @wpipe.putc HOSTNAME_RESOLUTION_QUEUE_UPDATED # ... ef self.hostname_resolution(family, host, port, hostname_resolution_queue)

Slide 24

Slide 24 text

࣮૷ͷେ࿮ 4PDLFUUDQ ໊લղܾͷ଴ػ case state when :start # ... queue = HostnameResolutionQueue.new # ... Thread.new(host, port, queue) { |*args| hostname_resolution(*args) } # ... hostname_resolved, _, = IO.select(rpipe, nil, nil, nil) family_name, res = hostname_resolution_queue.get selectable_addrinfos.add(family_name, res) state = :v6c # ... next ϝΠϯεϨου *0TFMFDUͰQJQF΁ͷॻ͖ࠐΈ໊લղܾΛ଴ػ ໊લղܾ׬ྃޙɺղܾͰ͖ͨΞυϨεΛอଘ͢Δ *0TFMFDUʹQJQFͷಡΈࠐΈଆΛ౉͢ εϨου಺Ͱ໊લղܾ͕׬ྃ࣍ୈɺ QJQFͷಡΈࠐΈଆ͕४උ׬ྃʹͳΓ *0TFMFDU͕଴ػΛղআ͢Δ ࣍ͷঢ়ଶΛઃఆ औಘͨ͠*1ΞυϨεΛอଘ ࣍ͷϧʔϓ΁ ແ੍ݶʹ଴ػ

Slide 25

Slide 25 text

case state when :v4w ipv6_resolved, _, = IO.select( if ipv6_resolved family_name, res = hostname_resolution_queue.get selectable_addrinfos.add(family_name, res) unless res.is_a? E state = :v46c else state = :v4c end next # ... ࣮૷ͷେ࿮ 4PDLFUUDQ ໊લղܾͷ଴ػ ઌʹ*1WΞυϨεΛղܾͰ͖ͨ৔߹ ಉ͘͡*0TFMFDUΛ༻͍ͯ*1WΞυϨεͷղܾΛ଴ػ͢Δ ࣍ͷঢ়ଶΛઃఆ ࣍ͷϧʔϓ΁ Exception (hostname_resolution_waiting, nil, nil, RESOLUTION_DELAY) 3&40-65*0/@%&-":NT

Slide 26

Slide 26 text

࣮૷ͷେ࿮ 4PDLFUUDQ ઀ଓͷ։࢝ case state when :v6c, :v4c, v46c # ... addrinfo = selectable_addrinfos.get # ... connection_attempt_delay_expires_at = current_clocktime + CONNECTION_ATTEMPT_DELAY # ... socket = Socket.new( socket.bind(local_addrinfo) if local_addrinfo result = socket.connect_nonblock(addrinfo, exception: false) # ... case result # ... end next ෳ਺ͷΞυϨεѼͷ઀ଓࢼߦΛฒߦʹߦ͏Մೳੑ͕ ͋ΔͨΊɺ4PDLFUDPOOFDU@OPOCMPDLΛ࢖༻ͯ͠ ϊϯϒϩοΩϯάϞʔυͰ઀ଓΛ։࢝ ղܾࡁΈͷ*1ΞυϨεΛऔಘ ϊϯϒϩοΩϯάϞʔυͰ઀ଓΛ։࢝ ࣍ͷϧʔϓ΁ ࣍ͷঢ়ଶΛઃఆ

Slide 27

Slide 27 text

case state when :v46w # ... hostname_resolved, connectable_sockets, = IO.select( # ... (rpipe, connecting_sockets.all, nil, remaining) ઀ଓதͷιέοτ ઀ଓͷ଴ػ *0TFMFDUΛར༻ͯ͠઀ଓͱ໊લղܾͷ׬ྃΛಉ࣌ʹ଴ػ ଴ػ࣌ؒલճͷ઀ଓ։͔࢝ΒNTܦա͢Δ·Ͱ ͜ͷ࣌఺Ͱ͸ยํͷΞυϨεϑΝϛϦͷ໊લղܾ͕׬͍ྃͯ͠ͳ͍Մೳੑ͋Γ ࣮૷ͷେ࿮ 4PDLFUUDQ ઀ଓ໊લղܾͷ଴ػ *0QJQFͰ࡞੒ͨ͠ύΠϓͷ ಡΈࠐΈଆ ໊લղܾͷ଴ػ ઀ଓΛࢼ͍ͯ͠ͳ͍ΞυϨε͕͋Δ৔߹ ࣍ͷ઀ଓΛ։࢝Ͱ͖Δ·Ͱͷ࢒Γ࣌ؒ

Slide 28

Slide 28 text

def self.tcp(host, port, ...) # ... ret = loop do case state # ... when :success break connected_socket when :failure raise last_error when :timeout raise Errno::ETIMEDOUT, "user specified timeout" end end if block_given? begin yield ret ensure ret.close end else ret end end ঢ়ଶભҠͷऴྃঢ়ଶΛܦ༝ͯ͠ɺ ϧʔϓ͔Βൈ͚Δ͔ྫ֎Λൃੜͤ͞Δ ϧʔϓ͔Βൈ͚ͨ৔߹͸઀ଓࡁΈιέοτΛฦͯ͠ऴྃ ऴྃঢ়ଶ ઀ଓࡁΈͷιέοτΛฦ͢ ࣮૷ͷେ࿮ 4PDLFUUDQ ऴྃॲཧ

Slide 29

Slide 29 text

5$14PDLFUOFXݻ༗ͷ՝୊ 4PDLFUUDQ 3VCZ࣮૷ ͱ5$14PDLFUOFX $࣮૷ ͷ ࣮૷ͷେ࿮͸ಉ͕ͩ͡ɺ5$14PDLFUOFXʹ͸ ݻ༗ͷ՝୊͕͍͔ͭ͋͘Δ ՝୊ͷҰྫ TPDLFUϥΠϒϥϦͷ಺෦"1*ͱͯ͠ɺ தஅՄೳ͔ͭɺQJQFͱTFMFDU Ͱ଴ػՄೳͳ ໊લղܾؔ਺͕ͳ͍

Slide 30

Slide 30 text

5$14PDLFUOFXݻ༗ͷ՝୊ ▫લఏ 3VCZͷTPDLFUϥΠϒϥϦʹ͸໊લղܾΛߦ͏ϝιουͱͯ͠ "EESJOGPHFUBEESJOGP΍4PDLFUHFUBEESJOGP͕༻ҙ͞Ε͍ͯΔ ɾ͜ΕΒͷϝιου͸಺෦తʹ͸ϒϩοΩϯάؔ਺Ͱ͋Δ ɹHFUBEESJOGP Λ࢖༻͓ͯ͠Γɺ3VCZ·Ͱ͸ ɹʮ໊લղܾதʹதஅ͢Δ͜ͱ͕Ͱ͖ͳ͍ʯͱ͍͏՝୊͕͋ͬͨ ɾ3VCZ͔Β͸վળ͞ΕɺQUISFBE͕ར༻Ͱ͖Δ؀ڥʹ͓͍ͯ͸ ɹதஅՄೳʹͳͬͨ ɹ.BLFUIFOBNFSFTPMVUJPOJOUFSSVQUJCMF IUUQTHJUIVCDPNSVCZSVCZQVMM

Slide 31

Slide 31 text

தஅՄೳͳHFUBEESJOGPͷ಺෦࣮૷ 3VCZ࣌఺ ▫໊લղܾϝιουͷίʔϧελοΫ ɾ4PDLFUHFUBEESJOGP ɹ ➡︎ TPDL@T@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP ɾ"EESJOGPHFUBEESJOGP ɹ ➡︎ BEESJOGP@T@HFUBEESJOGP ɹɹ ➡︎ BEESJOGP@MJTU@OFX ɹɹɹ ➡︎ DBMM@HFUBEESJOGP ɹɹɹɹ ➡︎ STPDL@HFUBEESJOGP ڞ௨

Slide 32

Slide 32 text

தஅՄೳͳHFUBEESJOGPͷ಺෦࣮૷ 3VCZ࣌఺ ɾSTPDL@HFUBEESJOGPɹ QUISFBE͕͋Δ؀ڥ ɹ ➡︎ EP@QUISFBE@DSFBUFɹεϨουΛੜ੒ ɹɹ ➡︎ ࢠεϨου EP@HFUBEESJOGPɹHFUBEESJOGP Λ࣮ߦ ɹɹɹ໊લղܾ͕ऴΘΓ࣍ୈɺ৚݅ม਺ʹ௨஌͢Δ ɹ ➡︎ SC@UISFBE@DBMM@XJUIPVU@HWM ɹɹ ➡︎ XBJU@HFUBEESJOGPɹ৚݅ม਺΁ͷ௨஌Λ଴ػ ɹɹ ➡︎ DBODFM@HFUBEESJOGPɹதஅ࣌ʹ৚݅ม਺ʹ௨஌͢Δɹ ϝΠϯεϨουͰ͸৚݅ม਺ʹ௨஌͕͋Δ·Ͱ଴ػ͢Δ ໊લղܾ͕׬ྃͰ͖͔ͨதஅ͞Ε͔ͨʹΑͬͯޙଓͷॲཧΛߦ͏

Slide 33

Slide 33 text

5$14PDLFUOFXͷ಺෦࣮૷ 3VCZ࣌఺ ▫5$14PDLFUOFXͷίʔϧελοΫ ɾUDQ@JOJU ɹ ➡︎ STPDL@JOJU@JOFUTPDL ɹɹ ➡︎ JOJU@JOFUTPDL@JOUFSOBM ɹɹɹ ➡︎ STPDL@BEESJOGPɹ໊લղܾͷ։࢝ ɹɹɹɹ ➡︎ STPDL@HFUBEESJOGP ɹɹɹɹɹ ➡︎ ҎԼಉ͡ ɹɹɹ ➡︎ ޙଓॲཧ தஅՄೳͳHFUBEESJOGPͷݺͼग़͠ STPDL@HFUBEESJOGP͸)&Wͷ࣮૷ʹར༻͞ΕΔ͜ͱΛ ૝ఆͨ͠࢓༷ʹͳ͍ͬͯͳ͍

Slide 34

Slide 34 text

)&WରԠ5$14PDLFUOFXʹඞཁͳ໊લղܾؔ਺ ▫STPDL@HFUBEESJOGP ɾࢠεϨουΛͭੜ੒͢Δ ɾ໊લղܾͷ׬ྃதஅΛ ɹ৚݅ม਺Ͱ଴ػ͢Δ ɾ໊લղܾΛߦ͏ෳ਺ͷ ɹϝιουͰར༻͞ΕΔ ▫)&WͰඞཁͳؔ਺ͷཁ݅ ɾࢠεϨουΛdͭੜ੒͢Δ ɹ ΞυϨεϑΝϛϦ͝ͱʹੜ੒ ɾ໊લղܾͷ׬ྃதஅΛ ɹQJQFͱTFMFDU Ͱ଴ػ͢Δ ɾ5$14PDLFUOFXͷΈͰ ɹར༻͞ΕΔ

Slide 35

Slide 35 text

)&WରԠ5$14PDLFUOFXʹඞཁͳ໊લղܾؔ਺ ɾ͜ΕΒΛ౿·͑ɺطଘͷSTPDL@HFUBEESJOGPΛ ɹ)&WରԠͷͨΊʹมߋ͢ΔͷͰ͸ͳ͘ɺ ɹ৽͍ؔ͠਺Λ௥Ճ͢Δ ɹɹɾॲཧશମΛ୲͏ؔ਺JOJU@JOFU@TPDL@JOUFSOBM ɹɹɹ εϨουͷੜ੒ɺεϨουͷ଴ػɺঢ়ଶભҠ ɹɹɾ໊લղܾΛߦ͏ؔ਺EP@SC@HFUBEESJOGP@IBQQZ ɹɹɹ JOJU@JOFU@TPDL@JOUFSOBM͕ੜ੒ͨ͠εϨουͰಈ࡞͢Δ

Slide 36

Slide 36 text

5$14PDLFUOFXͷ಺෦࣮૷ )&WରԠ ɾUDQ@JOJU ɹ ➡︎ STPDL@JOJU@JOFUTPDL ɹɹ ➡︎ JOJU@JOFUTPDL@JOUFSOBM@IBQQZ QUISFBE͕͋Δ؀ڥ ɹɹɹ ➡︎ EP@QUISFBE@DSFBUFεϨουΛੜ੒ ɹɹɹɹ ➡︎ EP@SC@HFUBEESJOGP@IBQQZεϨου಺Ͱ໊લղܾΛ࣮ߦ ɹɹɹɹɹ໊લղܾ͕ऴΘΓ࣍ୈɺQJQFʹ௨஌͢Δ ɹɹɹ ➡︎ SC@UISFBE@DBMM@XJUIPVU@HWM ɹɹɹɹ ➡︎ XBJU@IBQQZ@FZFCBMMT@GETQJQF΁ͷ௨஌ΛTFMFDU Ͱ଴ػ ɹɹɹɹ ➡︎ DBODFM@IBQQZ@FZFCBMMT@GETதஅ࣌ʹQJQF΁௨஌ ɹɹɹ ➡︎ ʜ جຊతͳίϯηϓτ͸4PDLFUUDQͱಉ͡

Slide 37

Slide 37 text

EP@SC@HFUBEESJOGP@IBQQZ void * do_rb_getaddrinfo_happy(void *ptr) { // Ҿ਺Ͱ౉ͨ͠ϦιʔεΛ΋ͱʹgetaddrinfo(3)Λ࣮ߦ rb_nativethread_lock_lock(shared->lock); { // ໊લղܾ͕׬ྃͨ͠৔߹ɿpipeͷॻ͖ࠐΈଆʹͦͷࢫΛ௨஌ // தஅ͞Εͨ৔߹ɿ໊લղܾࡁΈͷ৔߹͸freeaddrinfo(3) } rb_nativethread_lock_unlock(shared->lock); // ͜ͷεϨουݻ༗ͷϦιʔεΛղ์ // Մೳͳ৔߹͸શͯͷεϨουͰڞ༗͍ͯ͠ΔϦιʔεΛղ์ return 0; } 4PDLFUUDQͱಉ͡ ޙॲཧ $࣮૷ݻ༗

Slide 38

Slide 38 text

)&WରԠ5$14PDLFUOFXʹ͓͚ΔϦιʔεͷ҆શͳղ์ Bݻ༗ͷϦιʔε ɾΞυϨεϑΝϛϦ ɾTUSVDUBEESJOGP ɾڞ༗Ϧιʔε΁ͷࢀর Cݻ༗ͷϦιʔε ɾΞυϨεϑΝϛϦ ɾTUSVDUBEESJOGP ɾڞ༗Ϧιʔε΁ͷࢀর ໊લղܾ༻ εϨουB ໊લղܾ༻ εϨουC Bऴྃ࣌ʹղ์ Cऴྃ࣌ʹղ์ ϝΠϯεϨου

Slide 39

Slide 39 text

)&WରԠ5$14PDLFUOFXʹ͓͚ΔϦιʔεͷ҆શͳղ์ ࡾͭͷεϨουͷ͏ͪɺ ͲΕ͕Ұ൪࠷ޙʹऴྃ͢Δ͔Λ੍ޚ͢Δ͜ͱ͸Ͱ͖ͳ͍ ڞ༗Ϧιʔε ɾQJQF ɾϩοΫ ɾϗετɾαʔϏε໊ ɾதஅ͞Ε͔ͨͲ͏͔ ɾࢀরΧ΢ϯτ ໊લղܾ༻ εϨουB ໊લղܾ༻ εϨουC ࡾͭͷ͏ͪ࠷ޙͷεϨου͕ ऴྃ͢Δࡍʹղ์ ϝΠϯεϨου

Slide 40

Slide 40 text

)&WରԠ5$14PDLFUOFXʹ͓͚ΔϦιʔεͷ҆શͳղ์ ࢀরΧ΢ϯτΛˠʹݮΒͨ͠εϨουͷऴྃ࣌ʹڞ༗ϦιʔεΛղ์͢Δ ࢀߟIUUQTHJUIVCDPNSVCZSVCZQVMM fi MFT ໊લղܾ༻ εϨουB ໊લղܾ༻ εϨουC εϨου਺Λॳظ஋ͱ͠ εϨου͕ऴྃ͢ΔͨͼʹݮΒ͢ ڞ༗Ϧιʔε ɾQJQF ɾϩοΫ ɾϗετɾαʔϏε໊ ɾதஅ͞Ε͔ͨͲ͏͔ ɾࢀরΧ΢ϯτ ϝΠϯεϨου

Slide 41

Slide 41 text

࠷ऴใࠂ࣌఺ ೥݄೔࣌఺ ͷ੒Ռ ɾ4PDLFUUDQ͸ؔ࿈͢Δ1VMM3FRVFTU΋ซͤͯ ɹ3VCZͷNBTUFSʹϚʔδࡁΈ ɹ*OUSPEVDUJPOPG)BQQZ&ZFCBMMT7FSTJPO 3'$ JO4PDLFUUDQ ɹIUUQTHJUIVCDPNSVCZSVCZQVMM ɾ5$14PDLFUOFX͸࣮૷ͷୟ͖୆͸Ͱ͖͓ͯΓɺ ɹҾ͖ଓ͖։ൃத ɹIUUQTHJUIVCDPNTIJPJNNUJMCMPCNBJOBDUJWJUJFTIBQQZ@FZFCBMMT ɹ5$14PDLFU@OFX@JNQMNE

Slide 42

Slide 42 text

࠷ऴใࠂޙͷܦա ϚʔδࡁΈͷ4PDLFUUDQͷ)&W࣮૷ʹ͍ͭͯɺ ݱࡏͷ࣮૷ʹ໰୊͕͋ͬͨͨΊݟ௚͠Λߦͳͬͨ ▫ݱࡏͷ࣮૷ͷ໰୊఺ ɾ࣮૷͕ঢ়ଶભҠʹدΓ͍͗ͯ͢Δ ɹ BLS͞Μ͔Β͝ࢦఠ

Slide 43

Slide 43 text

ݱࡏͷ࣮૷ͷ໰୊఺ɿ۩ମྫᶃ ▫ݱঢ়ͷ࣮૷ ঢ়ଶʮWXʯʹ͍ͭͯ TFMFDU Ͱ઀ଓ໊͔લղܾΛಉ࣌ʹ଴ػ͓ͯ͠Γ ൃੜͨ͠ΠϕϯτͱϦιʔεͷঢ়ଶʹΑͬͯ ࣍ͷঢ়ଶΛܾఆ͠ɺ࣍ͷϧʔϓʹભҠ͍ͯ͠Δ ▫໰୊఺ TFMFDU ͸ෳ਺ͷΠϕϯτΛಉ࣌ʹฦ͢Մೳੑ͕͋Δ FH઀ଓͱ໊લղܾͷ׬ྃΛಉ࣌ʹݕ஌͢Δ ➡︎ ঢ়گʹΑͬͯ͸ ༨ܭͳTFMFDU ͷݺͼग़͕͠ൃੜ͢Δ

Slide 44

Slide 44 text

ݱࡏͷ࣮૷ͷ໰୊఺ɿ۩ମྫᶄ ▫ݱঢ়ͷ࣮૷ ঢ়ଶʮTUBSUʯʹ͍ͭͯ TFMFDU Ͱ*1W*1W͍ͣΕ͔ͷ໊લղܾͷ׬ྃΛ଴ػ͍ͯ͠Δ ઌʹ׬ྃͨ͠ΞυϨεϑΝϛϦ͕ͲͪΒ͔ͩͬͨʹΑͬͯ ࣍ͷঢ়ଶΛܾఆ͠ɺ࣍ͷϧʔϓʹભҠ͍ͯ͠Δ ▫໰୊఺ TFMFDU ͕ฦ͖ͬͯͨ࣌఺Ͱ *1W*1W͕ڞʹ໊લղܾࡁΈͷՄೳੑ͕͋Δ ➡︎ ঢ়گʹΑͬͯ͸ ޡͬͯʮWXʯʹભҠ͠ෆཁͳ଴ػ͕ൃੜ

Slide 45

Slide 45 text

ݱࡏͷ࣮૷ͷ໰୊఺ ▫ݱࡏͷ࣮૷ͷ໰୊఺ ɾ)&W͸ঢ়ଶભҠ͢ΔΞϧΰϦζϜͰ͋ΔҰํɺ ɹ࣮૷্͸ʮঢ়ଶಉ࢜ͷॏͶ߹Θͤʯ͕ൃੜ͢ΔՄೳੑ͕͋Δ ɹ ➡︎ MPPQͱDBTFจͷ૊Έ߹ΘͤʹΑΔঢ়ଶભҠͰ͸ ɹɹҰճͷϧʔϓ͝ͱʹҰͭͷঢ়ଶΛදݱ͓ͯ͠Γ ɹɹʮঢ়ଶಉ࢜ͷॏͶ߹ΘͤʯΛදݱͰ͖ͳ͍

Slide 46

Slide 46 text

࣮૷ͷվળ ▫վળࡦ ɾʮҰϧʔϓ͝ͱʹঢ়ଶભҠ͠ɺঢ়ଶʹԠͨ͡ॲཧΛߦ͏ʯ ɹͱ͍͏ߟ͑ํ͔Β཭ΕΔ ➡︎ ঢ়ଶͷ؅ཧΛ΍Ίɺ ɹͦͷ࣌఺Ͱߦ͏͜ͱ͕Ͱ͖ΔॲཧΛҰϧʔϓͷதͰશͯߦ͏ ➡︎ ϧʔϓͷதͰ͸DBTFจͰ͸ͳ͘JGจͰ৚݅෼ذͤ͞Δ ➡︎ ͦͷ࣌఺Ͱ߹க͢Δ͢΂ͯͷ৚݅ʹରͯ͠ඞཁͳॲཧΛߦ͏

Slide 47

Slide 47 text

4PDLFUUDQվળͷશମ૾ Πϝʔδ def self.tcp(host, port, ...) loop do end end # ໊લղܾͷ։࢝ # IO.select(<໊લղܾ>, <઀ଓ>, nil, <λΠϜΞ΢τ஋>) # if ॻ͖ࠐΈՄೳͳIO͕ฦ͖ͬͯͨ then ઀ଓ֬ೝɹ(੒ޭ͍ͯͨ͠Βreturn) # if ಡΈࠐΈՄೳͳIO͕ฦ͖ͬͯͨ then ղܾࡁΈͷIPΞυϨεΛอଘ # if ઀ଓ։࢝ͷ৚݅Λຬ͍ͨͯ͠Δ then ઀ଓΛ։࢝ # unless ࣍ͷϧʔϓʹೖΔ͜ͱ͕Ͱ͖Δ then ྫ֎Λൃੜͤ͞Δ ঢ়ଶͷ؅ཧΛ΍Ίͨ͜ͱͰɺ վળલ͸DBTF͝ͱʹ࣮ߦ͍ͯͨ͠ॲཧ͕ ϧʔϓͷ্͔Βॱʹ৚݅ʹԠ࣮ͯ͡ߦ͞ΕΔΑ͏ʹͳͬͨ

Slide 48

Slide 48 text

4PDLFUUDQվળલͱͷൺֱɿ*0TFMFDU ▫มߋલ ɾঢ়ଶʹԠͯ͡ෳ਺ՕॴͰݺͼग़͢ ɹɹ ։࢝௚ޙʹ໊લղܾΛ ɹɹ଴ػ͢ΔՕॴ TUBSU ɹɹ *1Wͷ໊લղܾΛ ɹɹ଴ػ͢ΔՕॴ WX ɹɹ ઀ଓ͔ೋͭ໨ͷ໊લղܾΛ ɹɹ଴ػ͢ΔՕॴ WX ɾλΠϜΞ΢τ஋͸ɺ ɹঢ়ଶʹԠͯࣗ͡ಈతʹܾఆ͢Δ ▫มߋޙ ɾϧʔϓͷதͷҰՕॴͷΈͰݺͼग़͢ ɾλΠϜΞ΢τ஋͸ɺ ɹͦͷ࣌఺ͰͷϦιʔεͷঢ়گ΍ɺ ɹશମͷॲཧ͕Ͳ͜·ͰਐΜͰ͍Δ͔ ɹͳͲʹΑͬͯಈతʹ൑அͨ͠஋ ends_at = if resolved_addrinfos.any? resolv_delay_expires_at || connect_delay_expires_at else [user_resolv_timeout_at, user_connect_timeout_at].compact.max end

Slide 49

Slide 49 text

4PDLFUUDQվળલͱͷൺֱɿ઀ଓͷ։࢝ͷ൑அ ▫มߋલ ɾ઀ଓΛ։࢝Ͱ͖Δ͔Ͳ͏͔Λ ɹݱࡏͷঢ়ଶͰ൑அ͢Δ ɹ WDɺWDɺWD ɹ˞ݱࡏͷঢ়ଶ͸ɺ ɹɹʮҰͭલʹͲͷঢ়ଶͩͬͨͷ͔ʯͱ ɹɹʮͦͷঢ়ଶΛ཭ΕΔͱ͖ʹભҠઌ͕ ɹɹͲͷঢ়ଶʹͳΔͷ͔ʯʹґଘ͢Δ ▫มߋޙ ɾ઀ଓΛ։࢝Ͱ͖Δ͔Ͳ͏͔Λ ɹͦͷ࣌఺ͰͷϦιʔεͷঢ়گ΍ɺ ɹશମͷॲཧ͕Ͳ͜·ͰਐΜͰ͍Δ͔ɺ ɹͳͲʹΑͬͯ൑அ͢Δ if resolved_addrinfos.any? && !resolv_delay_expires_at && !connect_delay_expires_at while (addrinfo = resolved_addrinfos.get) # ... end end

Slide 50

Slide 50 text

4PDLFUUDQվળલͱͷൺֱɿྫ֎ͷൃੜ ▫มߋલ ɾʮ͢΂ͯͷ໊લղܾ΍઀ଓʹ ɹɹࣦഊͨ͠ʯͱ൑அͨ͠৔߹ɺ ɹࣦഊΛද͢ঢ়ଶ GBJMVSF ʹભҠ͠ ɹͦ͜Ͱྫ֎Λൃੜͤ͞Δ ▫มߋޙ ɾϧʔϓͷऴΘΓʹࢸͬͨ࣌఺Ͱ ɹ΍Γ࢒ͨ͠ॲཧ΍ ɹ·ͩଓ͍͍ͯΔॲཧ͕ͳ͍͔Λ൑அ͠ɺ ɹ͜ΕҎ্Ͱ͖Δॲཧ͕ͳ͚Ε͹ ɹྫ֎Λൃੜͤ͞Δ if resolved_addrinfos.empty? if connecting_sockets.keys.empty? && resolved_addrinfos.resolved_all? raise last_error end # ... end

Slide 51

Slide 51 text

ࠓޙͷ՝୊ ▫4PDLFUUDQ ɹվળ൛ͷϚʔδΛ໨ࢦ͢ IUUQTHJUIVCDPNSVCZSVCZQVMM ▫5$14PDLFUOFX ɹݱঢ়ͷ࣮૷͸ɺ౰ॳͷDBTFจΛ࢖ͬͨঢ়ଶભҠ͕ ɹϕʔεͱͳ͍ͬͯΔ ɹվળ൛ͷ4PDLFUUDQΛ΋ͱʹ࠶࣮૷͠ɺ ɹ࢒͍ͬͯͨॲཧΛ௥Ճͨ͠͏͑Ͱ׬੒Λ໨ࢦ͢

Slide 52

Slide 52 text

ँࣙ ɹɹ੒੉͞Μ ɹɹদԼਖ਼थ͞Μ ɹɹBLS͞Μ ɹɹ3VCZίϛολʔͷօ͞Μ ɹɹҰൠࡒஂ๏ਓ3VCZΞιγΤʔγϣϯ

Slide 53

Slide 53 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠