Slide 1

Slide 1 text

5IF-FTT5PME4UPSZPG4PDLFU5JNFPVUT .JTBLJ4IJPJ !TIJPJNN!DPF@!DPFCTLZTPDJBM   3VCZ,BJHJ

Slide 2

Slide 2 text

QQTFMG .JTBLJ4IJPJ ɹ.FNCFSPG"TBLVTBSC ɹ3BJMTBQQMJDBUJPOEFWFMPQFSBU4.4$P -UE ɹ3VCZDPNNJUUFS !TIJPJNN (JU)VC  !DPF@ 'PSNFS5XJUUFS  !DPFCTLZTPDJBM #MVFTLZ QQTFMG

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

3VCZXBTSFMFBTFEPOMBTU$ISJTUNBT IUUQTXXXSVCZMBOHPSHFOOFXTSVCZSFMFBTFE

Slide 5

Slide 5 text

"TBOFXTPDLFUMJCSBSZGFBUVSF  BOPQFO@UJNFPVULFZXPSEBSHVNFOUXBTBEEFEUP 4PDLFUUDQBOE5$14PDLFUOFX 3VCZXBTSFMFBTFEPOMBTU$ISJTUNBT IUUQTXXXSVCZMBOHPSHFOOFXTSVCZSFMFBTFE

Slide 6

Slide 6 text

4PDLFUUDQBOE5$14PDLFUOFX 4PDLFUUDQBOE5$14PDLFUOFXBSFNFUIPETUIBU SFUVSOBDMJFOUTPDLFUDPOOFDUFEUPBTFSWFSPWFS5$1  SFUVSOTBDMJFOUTPDLFU 4FSWFS $POOFDUJPOFTUBCMJTIFE 4PDLFUUDQ 5$14PDLFUOFX TPDLFU"OFOEQPJOUGPSDPNNVOJDBUJPOCFUXFFOIPTUTPWFSBOFUXPSL

Slide 7

Slide 7 text

*OUFSOBMMZ UIFTFNFUIPETQFSGPSNUXPLJOETPGPQFSBUJPOT 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS 4PDLFUUDQBOE5$14PDLFUOFX

Slide 8

Slide 8 text

*OUFSOBMMZ UIFTFNFUIPETQFSGPSNUXPLJOETPGPQFSBUJPOT SFTPMWFUIFEFTUJOBUJPOIPTUOBNF 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS 4PDLFUUDQBOE5$14PDLFUOFX 3FTPMWFUIFIPTUOBNF

Slide 9

Slide 9 text

*OUFSOBMMZ UIFTFNFUIPETQFSGPSNUXPLJOETPGPQFSBUJPOT SFTPMWFUIFEFTUJOBUJPOIPTUOBNF BUUFNQUUPDPOOFDUUPUIFEFTUJOBUJPOIPTU 4FSWFS "UUFNQUUPDPOOFDU 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS 4PDLFUUDQBOE5$14PDLFUOFX 3FTPMWFUIFIPTUOBNF

Slide 10

Slide 10 text

"SHVNFOUTGPSVTFSTQFDJ fi FEUJNFPVU 4PDLFUUDQBOE5$14PDLFUOFXQSPWJEFLFZXPSE BSHVNFOUTUPTQFDJGZUJNFPVUTGPSUIFTFPQFSBUJPOT 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 11

Slide 11 text

"SHVNFOUTGPSVTFSTQFDJ fi FEUJNFPVU 5IFSFTPMW@UJNFPVUBSHVNFOUDPOUSPMT UIFUJNFPVUGPSOBNFSFTPMVUJPO 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS SFTPMW@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 12

Slide 12 text

"SHVNFOUTGPSVTFSTQFDJ fi FEUJNFPVU 5IFDPOOFDU@UJNFPVUBSHVNFOUDPOUSPMTUIFUJNFPVU GPSDPOOFDUJPOBUUFNQUT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS DPOOFDU@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 13

Slide 13 text

"SHVNFOUTGPSVTFSTQFDJ fi FEUJNFPVU "OEUIFOFXMZBEEFEPQFO@UJNFPVUBSHVNFOUTQFDJ fi FTB UJNFPVUGPSUIFPWFSBMMQSPDFTT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS PQFO@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 14

Slide 14 text

"SHVNFOUTGPSVTFSTQFDJ fi FEUJNFPVU 8IFOBOZPGUIFTFJTTFU JGUIFUBSHFUPQFSBUJPOEPFTOPU DPNQMFUFXJUIJOUIFTQFDJ fi FEUJNF 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS Socket.tcp("ruby-lang.org", 80, open_timeout: 1) "UUFNQUUPDPOOFDU PQFO@UJNFPVU 3FTPMWFUIFIPTUOBNF

Slide 15

Slide 15 text

"SHVNFOUTGPSVTFSTQFDJ fi FEUJNFPVU BUJNFPVUFSSPSJTSBJTFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS Socket.tcp("ruby-lang.org", 80, open_timeout: 1) $BODFMUPDPOOFDU $BODFMUPSFTPMWFUIFIPTUOBNF PQFO@UJNFPVU

Slide 16

Slide 16 text

5IFSPBEUPJOUSPEVDJOHUIFTFUISFFUZQFTPGUJNFPVU JOUPUIFTPDLFUMJCSBSZXBTGVMMPGUXJTUTBOEUVSOT DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 17

Slide 17 text

8IFOBOEXIZXFSF SFTPMW@UJNFPVUBOEDPOOFDU@UJNFPVUJOUSPEVDFE  8IZXBTBUIJSEUJNFPVU PQFO@UJNFPVU OFDFTTBSZ DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 18

Slide 18 text

/PX MFU`TFYQMPSFUIJTCZUSBDJOH UIFIJTUPSZPGUJNFPVUTJOUIFTPDLFUMJCSBSZ

Slide 19

Slide 19 text

/PX MFU`TFYQMPSFUIJTCZUSBDJOH UIFIJTUPSZPGUJNFPVUTJOUIFTPDLFUMJCSBSZ 8IBUGPMMPXTJTCBTFEPOUIFJTTVFTBOEDPNNJUMPHTGSPNUIBUUJNF 4PNFPGJUJODMVEFNZPXOTQFDVMBUJPO  TPQMFBTFMFUNFLOPXJGBOZUIJOHJTGBDUVBMMZJODPSSFDU

Slide 20

Slide 20 text

#BDLUP UIF3VCZEFWFMPQNFOUFSB UP fi OEUIF fi STUIJTUPSZPGUIFTPDLFUMJCSBSZUJNFPVUT

Slide 21

Slide 21 text

#BDLUP UIF3VCZEFWFMPQNFOUFSB ,FZXPSEBSHVNFOUT .PEVMFQSFQFOE  3F fi OFNFOUT 5IF65'EFGBVMUFODPEJOH FUD

Slide 22

Slide 22 text

+VMZ BMMPXPQUJPOBMUJNFPVUGPS5$14PDLFUOFX XBTQSPQPTFEBTBOFXGFBUVSFGPS3VCZ 5IFTPDLFUMJCSBSZUJNFPVUTJO3VCZ GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 23

Slide 23 text

5IJTJTTVFQSPQPTFEBEEJOHBUJNFPVUGPS DPOOFDUJPOBUUFNQUT 4FSWFS %/4TFSWFS $MJFOU "UJNFPVUGPSDPOOFDUJPOBUUFNQUT DPOOFDU@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 24

Slide 24 text

5IJTJTTVFQPJOUFEPVUUIBUOPOCMPDLJOHDPOOFDUJPODPEF XJUIBUJNFPVUUFOETUPCFWFSCPTF BTTIPXOJOUIJTTBNQMF The current construct for doing a non-blocking connect with timeout is too verbose: addr = Socket.pack_sockaddr_in(9418, "127.0.0.1") s = Socket.new(:AF_INET, :SOCK_STREAM, 0) begin s.connect_nonblock(addr) rescue Errno::EINPROGRESS IO.select(nil, [s], nil, 0.5) or raise Timeout::Error end 4UBSUBOPOCMPDLJOHDPOOFDUJPO 5JNFPVUJOTFD GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT "UJNFPVUGPSDPOOFDUJPOBUUFNQUT

Slide 25

Slide 25 text

5IFQSPQPTBMXBTUPBEEBDPOOFDU@UJNFPVU LFZXPSEBSHVNFOUUP5$14PDLFUOFXTPUIBU DPOOFDUJPOBUUFNQUTDPVMECFUJNFEPVU Proposed API would be: TCPSocket.new(remote_host, remote_port,
 connect_timeout: 0.5, local_host: nil, local_port: nil) Or: TCPSocket.new(remote_host, remote_port, connect_timeout: 0.5) GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT "UJNFPVUGPSDPOOFDUJPOBUUFNQUT

Slide 26

Slide 26 text

8IZPOMZUIFDPOOFDUJPOXBTTVCKFDUUPUIFUJNFPVU  BOEOPUOBNFSFTPMVUJPO  Proposed API would be: TCPSocket.new(remote_host, remote_port,
 connect_timeout: 0.5, local_host: nil, local_port: nil) Or: TCPSocket.new(remote_host, remote_port, connect_timeout: 0.5) GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT "UJNFPVUGPSDPOOFDUJPOBUUFNQUT

Slide 27

Slide 27 text

"UJNFPVUGPSOBNFSFTPMVUJPOJOSFTPMW "DMVFDBOCFGPVOEJOBOPUIFSJTTVF fi MFEBSPVOE UIFTBNFUJNF BMMPXDPO fi HVSBCMFUJNFPVUTJOSFTPMWSC GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 28

Slide 28 text

"UJNFPVUGPSOBNFSFTPMVUJPOJOSFTPMW 5IJTJTTVFQSPQPTFEBEEJOHTVQQPSUGPS OBNFSFTPMVUJPOUJNFPVUTUPUIFSFTPMWMJCSBSZ ※ The resolv library is a standard library for performing DNS-based name resolution. GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 29

Slide 29 text

-BZFSFE5JNFPVU%FTJHO 5IFJOUFOEFEVTBHFTFFNTUPIBWFCFFOBTGPMMPXT $MJFOU %/4TFSWFS 4FSWFS

Slide 30

Slide 30 text

-BZFSFE5JNFPVU%FTJHO 0CUBJOUIFEFTUJOBUJPO*1BEESFTTFTVTJOH UIFSFTPMWMJCSBSZ require "resolv" dns = Resolv::DNS.new dns.timeouts = 1 dns.getaddress("example.com") $MJFOU %/4TFSWFS 3FTPMWFUIFIPTUOBNFXJUISFTPMW 4FSWFS "OBNFSFTPMVUJPOUJNFPVU

Slide 31

Slide 31 text

1BTTUIPTFBEESFTTFTUP5$14PDLFUOFXBOE BUUFNQUUIFDPOOFDUJPO 4FSWFS require "socket" TCPSocket.new("example.com", 80, connect_timeout: 1) $MJFOU "UUFNQUUPDPOOFDU -BZFSFE5JNFPVU%FTJHO %/4TFSWFS DPOOFDU@UJNFPVU

Slide 32

Slide 32 text

5IFPWFSBMMUJNFPVUDPVMECFNBOBHFECZVTJOHCPUI UIFSFTPMWMJCSBSZTUJNFPVUBOE5$14PDLFUOFXTUJNFPVU $MJFOU 4FSWFS %/4TFSWFS DPOOFDU@UJNFPVU -BZFSFE5JNFPVU%FTJHO "OBNFSFTPMVUJPOUJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNFXJUISFTPMW

Slide 33

Slide 33 text

0UIFSUPQJD8IBUJGBIPTUIBTNVMUJQMF*1BEESFTTFT *OJOUSPEVDJOHDPOOFDUJPOUJNFPVUT  UIFSFXBTBMTPEJTDVTTJPOBCPVUIPXJUTIPVMECFIBWF XIFOBIPTUIBTNVMUJQMF*1BEESFTTFT I remember multiple IP addresses issue. The behavior of timeout is not clear if two or more IP addresses are given for a hostname. GSPNBLS "LJSB5BOBLB IUUQTCVHTSVCZMBOHPSHJTTVFTOPUF

Slide 34

Slide 34 text

0UIFSUPQJD8IBUJGBIPTUIBTNVMUJQMF*1BEESFTTFT 0SJHJOBMMZ XIFONVMUJQMFEFTUJOBUJPO*1BEESFTTFTXFSF BWBJMBCMF 4PDLFUUDQBOE5$14PDLFUOFXUSJFEUIFN POFCZPOF UIFZTUBSUFEXJUIPOFBEESFTT BOEJGUIBUGBJMFE  NPWFEPOUPUIFOFYU 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX $POOFDUJPOGBJMFE 4UBSUBDPOOFDUJPOBUUFNQU 4UBSUBOFXDPOOFDUJPOBUUFNQU

Slide 35

Slide 35 text

#BTFEPOUIJTCFIBWJPS UIFBEPQUFEBQQSPBDIXBTUP BQQMZBUJNFPVUUPFBDIDPOOFDUJPOBUUFNQU  4FSWFS 4PDLFUUDQ 5$14PDLFUOFX DPOOFDU@UJNFPVU 0UIFSUPQJD8IBUJGBIPTUIBTNVMUJQMF*1BEESFTTFT 8BJUJOHGPSDPOOFDUJPO 4UBSUBDPOOFDUJPOBUUFNQU

Slide 36

Slide 36 text

BOEJGBUJNFPVUPDDVSSFE NPWFPOUPUIFOFYUBEESFTT 4FSWFS 5JNFPVUPDDVSSFE 4PDLFUUDQ DPOOFDU@UJNFPVU 4UBSUBOFXDPOOFDUJPOBUUFNQU 0UIFSUPQJD8IBUJGBIPTUIBTNVMUJQMF*1BEESFTTFT 5$14PDLFUOFX 8BJUJOHGPSDPOOFDUJPO

Slide 37

Slide 37 text

SFQFBUJOHUIJTBTMPOHBTUIFSFBSFSFNBJOJOHEFTUJOBUJPO BEESFTTFT 4FSWFS 5JNFPVUPDDVSSFE 4PDLFUUDQ 5$14PDLFUOFX 0UIFSUPQJD8IBUJGBIPTUIBTNVMUJQMF*1BEESFTTFT 5JNFPVUPDDVSSFE

Slide 38

Slide 38 text

SFQFBUJOHUIJTBTMPOHBTUIFSFBSFSFNBJOJOHEFTUJOBUJPO BEESFTTFT 5IJTEFTJHOJTTJNQMFBOEDPOTJTUFOUXJUIUIFFYJTUJOHCFIBWJPS )PXFWFS CFDBVTFBEESFTTFTBSFUSJFETFRVFOUJBMMZ  UIFUPUBMUJNFVOUJMUJNFPVUDBOCFVQUP OVNCFSPGBEESFTTFTʷDPOOFDU@UJNFPVU 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX 0UIFSUPQJD8IBUJGBIPTUIBTNVMUJQMF*1BEESFTTFT 5JNFPVUPDDVSSFE 5JNFPVUPDDVSSFE

Slide 39

Slide 39 text

"OPUIFSQPJOUJTUIBUUIJTGFBUVSFXBTPSJHJOBMMZQSPQPTFE GPS5$14PDLFUOFX 0UIFSUPQJD8IJDIDMBTTTIPVMEUIJTCFJOUSPEVDFEJOUP Proposed API would be: TCPSocket.new(remote_host, remote_port,
 connect_timeout: 0.5, local_host: nil, local_port: nil) Or: TCPSocket.new(remote_host, remote_port, connect_timeout: 0.5) GSPNOPSNBMQFSTPO &SJD8POH IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 40

Slide 40 text

4JODFTVDI fl FYJCMFDPO fi HVSBUJPOXBTDPOTJEFSFENPSF BQQSPQSJBUFGPSUIFMPXFSMFWFM4PDLFUDMBTT  UIFGVODUJPOBMJUZXBTVMUJNBUFMZBEEFEUP4PDLFUUDQ 0UIFSUPQJD8IJDIDMBTTTIPVMEUIJTCFJOUSPEVDFEJOUP How about Socket class? You can implement timeout on Socket. I think you need full power of socket API, so you should use low level bindings for socket API i.e. Socket class. GSPNBLS "LJSB5BOBLB IUUQTCVHTSVCZMBOHPSHJTTVFTOPUF

Slide 41

Slide 41 text

*OUIJTXBZ  DPOOFDU@UJNFPVUXBTJOUSPEVDFEUP4PDLFUUDQ 5IJTXBTUIF fi STUUJNFPVUJOUSPEVDFEJOUIFTPDLFUMJCSBSZ DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 42

Slide 42 text

'BTUGPSXBSEUP UIF3VCZEFWFMPQNFOUFSB

Slide 43

Slide 43 text

'BTUGPSXBSEUP UIF3VCZEFWFMPQNFOUFSB 1BUUFSO.BUDIJOH /VNCFSFE1BSBNFUFST  3&1-JNQSPWFNFOU $PNQBDUJPO($  4FQBSBUJPOPGQPTJUJPOBMBOELFZXPSEBSHVNFOUT FUD

Slide 44

Slide 44 text

5IFTPDLFUMJCSBSZUJNFPVUTJO3VCZ +BOVBSZ "EESJOGPHFUBEESJOGPTVQQPSUTUJNFPVU XBTQSPQPTFEGPS3VCZ GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 45

Slide 45 text

"EESJOGPHFUBEESJOGPJTBTPDLFUMJCSBSZNFUIPEGPSOBNF SFTPMVUJPO5IJTJTTVFQSPQPTFEBEEJOHBOBNFSFTPMVUJPOUJNFPVU UPCPUI"EESJOGPHFUBEESJOGP %/4TFSWFS $MJFOU Addrinfo.getaddrinfo("example.com", 80, timeout: 1) UJNFPVU "UJNFPVUGPSOBNFSFTPMVUJPO 3FTPMWFUIFIPTUOBNF

Slide 46

Slide 46 text

"UJNFPVUGPSOBNFSFTPMVUJPO BOE4PDLFUUDQ XIJDIVTFT"EESJOGPHFUBEESJOGPGPS OBNFSFTPMVUJPO %/4TFSWFS $MJFOU SFTPMW@UJNFPVU 3FTPMWFUIFIPTUOBNF Socket.tcp("example.com", 80, resolv_timeout: 1)

Slide 47

Slide 47 text

0OFVOEFSMZJOHDPODFSOXBTUIBUMJCSBSJFTTVDIBT OFUIUUQSFMJFEPOUIFUJNFPVUMJCSBSZUPNBOBHFUJNFPVUT Currently, we use Timeout in Net::HTTP and other standard libraries. lib/net/http.rb 945 s = Timeout.timeout(@open_timeout, Net::OpenTimeout) { 946 begin 947 TCPSocket.open(conn_address, conn_port, @local_host, @local_port) 948 rescue => e 949 raise e, "Failed to open TCP connection to " + 950 "#{conn_address}:#{conn_port} (#{e.message})" 951 end 952 } GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT #BDLHSPVOE5JNFPVU)BOEMJOHJOOFUIUUQ 5IFUJNFPVUMJCSBSZTNFUIPE

Slide 48

Slide 48 text

GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT ※ The timeout library is a standard library that forces an operation to be interrupted by raising an exception once a speci fi ed time has elapsed. Currently, we use Timeout in Net::HTTP and other standard libraries. lib/net/http.rb 945 s = Timeout.timeout(@open_timeout, Net::OpenTimeout) { 946 begin 947 TCPSocket.open(conn_address, conn_port, @local_host, @local_port) 948 rescue => e 949 raise e, "Failed to open TCP connection to " + 950 "#{conn_address}:#{conn_port} (#{e.message})" 951 end 952 } 5IFUJNFPVUMJCSBSZTNFUIPE #BDLHSPVOE5JNFPVU)BOEMJOHJOOFUIUUQ

Slide 49

Slide 49 text

OFUIUUQVTFEUIFUJNFPVUMJCSBSZUPUPXBJUGPSUIFPWFSBMM PQFSBUJPO GSPNOBNFSFTPMVUJPOUPDPOOFDUJPOFTUBCMJTINFOU Currently, we use Timeout in Net::HTTP and other standard libraries. lib/net/http.rb 945 s = Timeout.timeout(@open_timeout, Net::OpenTimeout) { 946 begin 947 TCPSocket.open(conn_address, conn_port, @local_host, @local_port) 948 rescue => e 949 raise e, "Failed to open TCP connection to " + 950 "#{conn_address}:#{conn_port} (#{e.message})" 951 end 952 } GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT 5IFPWFSBMMUJNF #BDLHSPVOE5JNFPVU)BOEMJOHJOOFUIUUQ

Slide 50

Slide 50 text

5IFJEFBXBTGPSUIFTPDLFUMJCSBSZJUTFMGUPQSPWJEF BUJNFPVUGPSOBNFSFTPMVUJPO 4FSWFS %/4TFSWFS $MJFOU SFTPMW@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF #BDLHSPVOE5JNFPVU)BOEMJOHJOOFUIUUQ

Slide 51

Slide 51 text

TPUIBUUIFPWFSBMMUJNFPVUDPVMECFNBOBHFEXJUIPVU SFMZJOHPOUIFSFTPMWPSUJNFPVUMJCSBSJFT 4FSWFS %/4TFSWFS $MJFOU DPOOFDU@UJNFPVU SFTPMW@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF #BDLHSPVOE5JNFPVU)BOEMJOHJOOFUIUUQ

Slide 52

Slide 52 text

/PX  UIFUFDIOJDBMDIBMMFOHFPGBOBNFSFTPMVUJPOUJNFPVUJT IPXUPJOUFSSVQUUIFOBNFSFTPMVUJPOJOQSPHSFTT

Slide 53

Slide 53 text

)PXUPJOUFSSVQUUIFOBNFSFTPMVUJPOJOQSPHSFTT "TCBDLHSPVOE  3VCZ`TTPDLFUMJCSBSZQFSGPSNTOBNFSFTPMVUJPO VTJOHUIF$MJCSBSZGVODUJPOHFUBEESJOGP   $MJFOU %/4TFSWFS HFUBEESJOGP   4FOE%/4RVFSZ 8BJUJOHGPS%/4SFTQPOTF

Slide 54

Slide 54 text

5IFQSPCMFNJTUIBUHFUBEESJOGP  CMPDLTUIFDBMMFS XIJMFXBJUJOHGPSB%/4SFTQPOTF $MJFOU %/4TFSWFS /BNFSFTPMVUJPOTDBOUCFJOUFSSVQUFE )PXUPJOUFSSVQUUIFOBNFSFTPMVUJPOJOQSPHSFTT HFUBEESJOGP   8BJUJOHGPS%/4SFTQPOTF 4FOE%/4RVFSZ

Slide 55

Slide 55 text

8IJMFHFUBEESJOGP  JTCMPDLJOH JUDBOOPUCFJOUFSSVQUFE CZBUJNFPVU BOEFWFO$USM $IBTOPF ff FDU 5IJTIBECFFOBOJTTVFTJODFCFGPSF3VCZ $MJFOU %/4TFSWFS *UDBOUUJNFPVU $USM $IBTOPF ff FDU )PXUPJOUFSSVQUUIFOBNFSFTPMVUJPOJOQSPHSFTT HFUBEESJOGP   8BJUJOHGPS%/4SFTQPOTF 4FOE%/4RVFSZ

Slide 56

Slide 56 text

"TBTPMVUJPOUPUIJTQSPCMFN  UIJTJTTVFQSPQPTFESFQMBDJOHHFUBEESJOGP   XJUIHFUBEESJOGP@B   It uses getaddrinfo_a(3) if available, otherwise it uses Timeout. We can avoid thread creation to make a TCP connection if getaddrinfo_a(3) is available. GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT )PXUPJOUFSSVQUUIFOBNFSFTPMVUJPOJOQSPHSFTT

Slide 57

Slide 57 text

8IBUJTHFUBEESJOGP@B  HFUBEESJOGP@B  JTB(/6FYUFOTJPOUIBUBMMPXT NVMUJQMFOBNFSFTPMVUJPOSFRVFTUTUPCFFYFDVUFE BTZODISPOPVTMZ HFUBEESJOGP@B  $MJFOU 3FTPMWFUIFIPTUOBNFJOUIFCBDLHSPVOE %/44FSWFS

Slide 58

Slide 58 text

HFUBEESJOGP@B  TVQQPSUTBNPEF JOXIJDIHFUBEESJOGP  JTDBSSJFEPVU CZBCBDLHSPVOEXPSLFSUISFBE HFUBEESJOGP@B  8PSLFS %/44FSWFS 1SFQBSF .BJO HFUBEESJOGP   8IBUJTHFUBEESJOGP@B  3FTPMWFUIFIPTUOBNF

Slide 59

Slide 59 text

TPUIFDBMMJOHUISFBEDBODPOUJOVFXJUIPVUXBJUJOH GPSJUUPDPNQMFUF %/44FSWFS 3FTVNFUIFQSPDFTTJOH 8PSLFS .BJO 8IBUJTHFUBEESJOGP@B  HFUBEESJOGP@B  HFUBEESJOGP   3FTPMWFUIFIPTUOBNF

Slide 60

Slide 60 text

$IBOHFTJOUSPEVDFECZUIJTJTTVF 5IJTQSPQPTBMSFQMBDFETPNFVTFTPGHFUBEESJOGP   JOUIFDPEFXJUIHFUBEESJOGP@B  BOEBMTPJNQMFNFOUFE OBNFSFTPMVUJPOUJNFPVUTVQQPSU GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT Socket.tcp supports connect_timeout, but Addrinfo.getaddrinfo doesn't support timeout. We need to use Timeout to wait name resolution. In this patch, Addrinfo.getaddrinfo support timeout and Socket.tcp accepts resolv_timeout. It uses getaddrinfo_a(3) if available, otherwise it uses Timeout. We can avoid thread creation to make a TCP connection if getaddrinfo_a(3) is available. ˞IUUQTHJUIVCDPNSVCZSVCZDPNNJUGDDBDFCDEBEB

Slide 61

Slide 61 text

$IBOHFTJOUSPEVDFECZUIJTJTTVF "TUIF"1*TGPSUIJT  BUJNFPVULFZXPSEBSHVNFOUXBTBEEFEUP"EESJOGPHFUBEESJOGP  BOEBSFTPMW@UJNFPVULFZXPSEBSHVNFOUXBTBEEFEUP4PDLFUUDQ GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT Socket.tcp supports connect_timeout, but Addrinfo.getaddrinfo doesn't support timeout. We need to use Timeout to wait name resolution. In this patch, Addrinfo.getaddrinfo support timeout and Socket.tcp accepts resolv_timeout. It uses getaddrinfo_a(3) if available, otherwise it uses Timeout. We can avoid thread creation to make a TCP connection if getaddrinfo_a(3) is available.

Slide 62

Slide 62 text

5IJTJTIPXUIFOBNFSFTPMVUJPOUJNFPVUBQQFBSFEJO UIFTPDLFUMJCSBSZ DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX UJNFPVU "EESJOGPHFUBEESJOGP

Slide 63

Slide 63 text

5IFOFXZFBSIBTBSSJWFEBOE EFWFMPQNFOUPG3VCZIBTCFHVO

Slide 64

Slide 64 text

5IFOFXZFBSIBTBSSJWFEBOE EFWFMPQNFOUPG3VCZIBTCFHVO 3VCZʷ QFSGPSNBODFJNQSPWFNFOUT JODMVEJOH.+*5  3BDUPS 'JCFS4DIFEVMFS 3#4 5ZQF1SPG FUD

Slide 65

Slide 65 text

5IFTPDLFUMJCSBSZUJNFPVUTJO3VCZ "VHVTU .BLF4PDLFUHFUBEESJOGPJOUFSSVQUJCMFXBTNFSHFE CZLJST ,JS4IBUSPW IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 66

Slide 66 text

4PDLFUHFUBEESJOGPJT MJLF"EESJOGPHFUBEESJOGP  BNFUIPEGPSQFSGPSNJOHOBNFSFTPMVUJPO *UIBOEMFTMPXFSMFWFMJOGPSNBUJPOUIBO"EESJOGPHFUBEESJOGP .BLF4PDLFUHFUBEESJOGPJOUFSSVQUJCMF require "socket" Addrinfo.getaddrinfo("www.ruby-lang.org", 80) => [#, ...] Socket.getaddrinfo("www.ruby-lang.org", 80) => [["AF_INET6", 80, "****:****:****::***", "****:****:****::***", 30, 1, 6], ...]

Slide 67

Slide 67 text

5IJTQVMMSFRVFTUSFQMBDFEHFUBEESJOGP  PSJHJOBMMZVTFE JOUFSOBMMZCZ4PDLFUHFUBEESJOGPXJUIHFUBEESJOGP@B   NBLJOHOBNFSFTPMVUJPOJOUFSSVQUJCMF .BLF4PDLFUHFUBEESJOGPJOUFSSVQUJCMF

Slide 68

Slide 68 text

5IJTQVMMSFRVFTUSFQMBDFEHFUBEESJOGP  PSJHJOBMMZVTFE JOUFSOBMMZCZ4PDLFUHFUBEESJOGPXJUIHFUBEESJOGP@B   NBLJOHOBNFSFTPMVUJPOJOUFSSVQUJCMF 5IJTXBTOPUUIFBEEJUJPOPGBUJNFPVUGFBUVSF  CVUSBUIFSBDIBOHFUIBUFYQBOEFE UIFTDPQFPGHFUBEESJOGP@B  TVTF .BLF4PDLFUHFUBEESJOGPJOUFSSVQUJCMF

Slide 69

Slide 69 text

*OUSPEVDJOH)BQQZ&ZFCBMMT7FSTJPOXJUIHFUBEESJOGP@B  'VSUIFSNPSF UIFSFXFSFQMBOTUPMFWFSBHFHFUBEESJOGP@B   UPJOUSPEVDFUIF)BQQZ&ZFCBMMT7FSTJPOBMHPSJUIN JOUPUIFTPDLFUMJCSBSZ 5IJTDBOCFJOGFSSFEGSPN BSFQPSUPGUIF3VCZ"TTPDJBUJPOHSBOUQSPKFDU ※ 2020 Grant Accomplishment Report Happy Eyeballs Version 2 (RFC8305) support for Ruby’s socket library https://www.ruby.or.jp/grant/2020/matsushita_ fi nal_report.pdf

Slide 70

Slide 70 text

4FQUFNCFS l"EESFTPMWF@UJNFPVUUP5$14PDLFU<'FBUVSF>z "EESFTPMWF@UJNFPVUUP5$14PDLFU CZ(MBTT@TBHB .BTBLJ.BUTVTIJUB  IUUQTHJUIVCDPNSVCZSVCZDPNNJUGFGBCEGGGBBFCFCCCCB

Slide 71

Slide 71 text

BOE"EEDPOOFDU@UJNFPVUUP5$14PDLFU XFSFBMTPNFSHFE "EEDPOOFDU@UJNFPVUUP5$14PDLFU CZ(MBTT@TBHB .BTBLJ.BUTVTIJUB  IUUQTHJUIVCDPNSVCZSVCZDPNNJUGGDCBBBFGBD

Slide 72

Slide 72 text

5IJTCSPVHIUOBNFSFTPMVUJPOBOEDPOOFDUJPOUJNFPVUTUP 5$14PDLFUOFXBTXFMM KVTUMJLF4PDLFUUDQ DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX UJNFPVU "EESJOGPHFUBEESJOGP

Slide 73

Slide 73 text

%VSJOHUIJTQFSJPE BTUIFVTFPGHFUBEESJOGP@B  FYQBOEFE  UIFUJNFPVUGVODUJPOBMJUZPGUIFTPDLFUMJCSBSZXFSFFOIBODFE UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 74

Slide 74 text

)PXFWFS 

Slide 75

Slide 75 text

)PXFWFS  JO0DUPCFS

Slide 76

Slide 76 text

3BJMT"DUJWF+PCJOUFHSBUJPOUFTUTGBJMFT "GUFSNFSHJOHUIFQVMMSFRVFTUUP NBLF4PDLFUHFUBEESJOGPJOUFSSVQUJCMF  SFQPSUTDBNFJOUIBU3BJMT"DUJWF+PCJOUFHSBUJPOUFTUTIBE TUBSUFEUPGBJM GSPNZBIPOEB :BTVP)POEB IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 77

Slide 77 text

"SFQSPEVDFSXBTBMTPSFQPSUFE*UBQQFBSFEUIBUJG  4PDLFUHFUBEESJOGPXBTDBMMFE UIFO  GPSL XBTQFSGPSNFE  BOE  4PDLFUHFUBEESJOGPXBTDBMMFEBHBJOJOUIFDIJMEQSPDFTT Here's a small script that reproduces the problem: require "socket" Socket.getaddrinfo("localhost", nil) pid = fork do Socket.getaddrinfo("localhost", nil) end Process.wait pid   GSPNFVHFOFJVT &VHFOF,FOOZ IUUQTCVHTSVCZMBOHPSHJTTVFTOPUF  3BJMT"DUJWF+PCJOUFHSBUJPOUFTUTGBJMFT

Slide 78

Slide 78 text

UIFDBMMXPVMEIBOHBOEOFWFSSFUVSO 8IBUFYBDUMZXBTIBQQFOJOH Here's a small script that reproduces the problem: require "socket" Socket.getaddrinfo("localhost", nil) pid = fork do Socket.getaddrinfo("localhost", nil) end Process.wait pid GSPNFVHFOFJVT &VHFOF,FOOZ IUUQTCVHTSVCZMBOHPSHJTTVFTOPUF )BOHT 3BJMT"DUJWF+PCJOUFHSBUJPOUFTUTGBJMFT

Slide 79

Slide 79 text

8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B  HFUBEESJOGP@B  TVQQPSUTBNPEFJOXIJDI OBNFSFTPMVUJPOJTQFSGPSNFECZXPSLFSUISFBET HFUBEESJOGP@B   %/44FSWFS 1SFQBSF 8PSLFS .BJO HFUBEESJOGP   3FTPMWFUIFIPTUOBNF

Slide 80

Slide 80 text

*OUIJTNPEF UIFTFXPSLFSUISFBETBSFTIBSFE XJUIJOUIFQSPDFTT &WFOBGUFSDPNQMFUJOHBSFRVFTU UIFZSFNBJOBMJWFGPS BDFSUBJOQFSJPEUPCFSFVTFEGPSTVCTFRVFOUSFRVFTUT 8BJU HFUBEESJOGP@B   3FTVNFUIFQSPDFTTJOH 1SPDFTT 8PSLFS .BJO 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 81

Slide 81 text

1SPDFTT "OEBGUFS fi OJTIJOHBSFRVFTU UIFZSFNBJOBMJWFGPS BDFSUBJOQFSJPEPGUJNF XBJUJOHGPSUIFOFYUSFRVFTU HFUBEESJOGP@B   3FTVNFUIFQSPDFTTJOH *GOPOFXSFRVFTUTBSSJWFXJUIJOUIBUQFSJPE  UIFZUFSNJOBUF 8PSLFS .BJO 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 82

Slide 82 text

*GUIFNBJOUISFBEDBMMTGPSL   XIJMFUIFTFUISFBETBSFXBJUJOH GPSL   8BJU 8PSLFS .BJO 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 83

Slide 83 text

POMZUIFUISFBEUIBUDBMMFEGPSL  JTEVQMJDBUFEJOUP UIFDIJMEQSPDFTT 5IFXPSLFSUISFBETBSFOPUEVQMJDBUFE .BJOQSPDFTT $IJMEQSPDFTT /PXPSLFSUISFBET $PQJFE 8PSLFS .BJO 8BJU 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 84

Slide 84 text

)PXFWFS UIFJOUFSOBMTUBUFPGUIFQSPDFTTJTDPQJFE JOUPUIFDIJMEQSPDFTT $IJMEQSPDFTT /PXPSLFSUISFBET 5IFJOUFSOBMTUBUF 5IFJOUFSOBMTUBUF .BJOQSPDFTT /PXPSLFSUISFBET $PQJFE 8PSLFS .BJO 8BJU 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 85

Slide 85 text

5IFDIJMEQSPDFTTJOIFSJUTBOJOUFSOBMTUBUFUIBU BTTVNFTUIFFYJTUFODFPGXPSLFSUISFBET  FWFOUIPVHIOPXPSLFSUISFBETBDUVBMMZFYJTU $IJMEQSPDFTT /PXPSLFSUISFBET .BJOQSPDFTT 5IFJOUFSOBMTUBUF 8PSLFSUISFBETBSFXBJUJOH 5IFJOUFSOBMTUBUF 8PSLFSUISFBETBSFXBJUJOH /PXPSLFSUISFBET $PQJFE 8PSLFS .BJO 8BJU 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 86

Slide 86 text

8IFOHFUBEESJOGP@B  JTDBMMFEBHBJOJOUIFDIJME QSPDFTT UIFTZODISPOJ[BUJPOTUBUFCFDPNFT JODPOTJTUFOU BOEUIFQSPDFTTIBOHT $IJMEQSPDFTT HFUBEESJOGP@B   )BOHT 5IFJOUFSOBMTUBUF 8PSLFSUISFBETBSFXBJUJOH /PXPSLFSUISFBET $PQJFE 8IBUXBTIBQQFOJOHXJUIHFUBEESJOGP@B 

Slide 87

Slide 87 text

'PSNPSFUIBOUXPNPOUIT  F ff PSUTXFSFNBEFUPJEFOUJGZUIFDBVTFPGUIJTJTTVF BOEFYQMPSFQPTTJCMFXPSLBSPVOET

Slide 88

Slide 88 text

)PXFWFS JOUIFFOE  UIFJOUSPEVDUJPOPGHFUBEESJOGP@B  JUTFMGXBT VMUJNBUFMZOPUBEPQUFEGPS3VCZ 

Slide 89

Slide 89 text

)PXFWFS JOUIFFOE  UIFJOUSPEVDUJPOPGHFUBEESJOGP@B  JUTFMGXBT VMUJNBUFMZOPUBEPQUFEGPS3VCZ  BOEUIFSFMBUFETFSJFTPGDIBOHFTXFSFSFWFSUFE

Slide 90

Slide 90 text

*O3VCZBTSFMFBTFE DPOOFDU@UJNFPVUXBTBEEFEUP 5$14PDLFUOFX5JNFPVUTGPSOBNFSFTPMVUJPOXFSFOPU BEPQUFEBDSPTTBMMNFUIPET UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 91

Slide 91 text

)PXFWFS

Slide 92

Slide 92 text

*OGBDU UIF"1*TGPSOBNFSFTPMVUJPOUJNFPVUTXFSFOPU SFNPWFEBOESFNBJOFEJO3VCZ UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX "1*POMZ "1*POMZ "1*POMZ

Slide 93

Slide 93 text

4JODFUIFSFXBTOPEPDVNFOUBUJPOGPSUIF"1*T  JUJTMJLFMZUIBUPOMZWFSZXFMMJOGPSNFE3VCZJTUTXFSF BXBSFPGUIFN UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX "1*POMZ "1*POMZ "1*POMZ

Slide 94

Slide 94 text

"GUFSTPNFUJNF  UIF3VCZEFWFMPQNFOUFSB CFHBO

Slide 95

Slide 95 text

"GUFSTPNFUJNF  UIF3VCZEFWFMPQNFOUFSB CFHBO 5)&&3"0'5)&1"34&3 -SBNB 1SJTN  :+*5 3+*5 ./UISFBETDIFEVMFS FUD

Slide 96

Slide 96 text

*OUIJTWFSTJPO UIFSFXFSFOPDIBOHFT EJSFDUMZSFMBUFEUPTPDLFUUJNFPVUT  CVUUIFSFJTPOFUPQJD*XPVMEMJLFUPNFOUJPO

Slide 97

Slide 97 text

l.BLFUIFOBNFSFTPMVUJPOJOUFSSVQUJCMFz 5IJTDIBOHFXBTQSPQPTFEGPS3VCZJO0DUPCFS VOEFSUIFJTTVF .BLFUIFOBNFSFTPMVUJPOJOUFSSVQUJCMF GSPNNBNF :VTVLF&OEPI IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 98

Slide 98 text

5IFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO 4JODFUIFJOUSPEVDUJPOPGHFUBEESJOGP@B  XBTOPUBEPQUFE JO UIFTPDLFUMJCSBSZDPOUJOVFEUPVTFHFUBEESJOGP   GPSOBNFSFTPMVUJPO $MJFOU HFUBEESJOGP   %/4TFSWFS 4FOE%/4RVFSZ 8BJUJOHGPS%/4SFTQPOTF

Slide 99

Slide 99 text

5IFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO "TBSFTVMU UIFQSPCMFNUIBUOBNFSFTPMVUJPODPVMETUJMM CMPDLIBEOPUCFFOSFTPMWFE $MJFOU HFUBEESJOGP   %/4TFSWFS 4FOE%/4RVFSZ /BNFSFTPMVUJPOTDBOUCFJOUFSSVQUFE 8BJUJOHGPS%/4SFTQPOTF

Slide 100

Slide 100 text

4PMWJOHUIFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO 5PBEESFTTUIJTQSPCMFN  BNFUIPEXBTQSPQPTFEUIBUDPNCJOFTHFUBEESJOGP   XJUIQUISFBE I wrote a patch to make getaddrinfo(3) work in a separate pthread. https://github.com/ruby/ruby/pull/8695 GSPNNBNF :VTVLF&OEPI IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 101

Slide 101 text

4PMWJOHUIFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO 5IJTBQQSPBDIJTTJNJMBSUPHFUBEESJOGP@B   JOUIBUBXPSLFSUISFBEFYFDVUFTHFUBEESJOGP   JOUIFCBDLHSPVOE 8PSLFS %/44FSWFS .BJO HFUBEESJOGP   3FTPMWFUIFIPTUOBNF

Slide 102

Slide 102 text

4PMWJOHUIFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO )PXFWFS JUEJ ff FSTJOUIBUBOFXXPSLFSUISFBEJT DSFBUFEGPSFBDIOBNFSFTPMVUJPO %/44FSWFS $SFBUFBOFXUISFBEFBDIUJNF 8PSLFS .BJO HFUBEESJOGP   4UBSUUPOBNFSFTPMVUJPO 3FTPMWFUIFIPTUOBNF

Slide 103

Slide 103 text

4PMWJOHUIFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO BOEJUUFSNJOBUFTJNNFEJBUFMZBGUFSHFUBEESJOGP   DPNQMFUFT XJUIPVUCFJOHSFVTFE5IJTBWPJETUIFLJOE PGJTTVFTTFFOXJUIHFUBEESJOGP@B   %/44FSWFS 8PSLFS .BJO 5FSNJOBUF "OTXFSUIFBEESFTTFT

Slide 104

Slide 104 text

4PMWJOHUIFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO "EESJOGPHFUBEESJOGP  ➡︎ BEESJOGP@T@HFUBEESJOGP ɹ ➡︎ BEESJOGP@MJTU@OFX ɹ ➡︎ DBMM@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP 5IJTDIBOHFXBTJNQMFNFOUFEJO STPDL@HFUBEESJOGP XIJDIJTDBMMFEJOUFSOBMMZ CZ"EESJOGPHFUBEESJOGP 5IJTDIBOHFXBTJOUSPEVDFE

Slide 105

Slide 105 text

4PMWJOHUIFCMPDLJOHJTTVFJOOBNFSFTPMVUJPO "EESJOGPHFUBEESJOGP  ➡︎ BEESJOGP@T@HFUBEESJOGP ɹ ➡︎ BEESJOGP@MJTU@OFX ɹ ➡︎ DBMM@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP "TBSFTVMU OBNFSFTPMVUJPOOPMPOHFSCMPDLTJOBMM NFUIPETUIBUVTFSTPDL@HFUBEESJOGP  JODMVEJOH4PDLFUHFUBEESJOGP 4PDLFUHFUBEESJOGP  ➡︎ TPDL@T@HFUBEESJOGP ɹ ➡︎ STPDL@HFUBEESJOGP 5IJTDIBOHFXBTJOUSPEVDFE

Slide 106

Slide 106 text

5IJTJNQSPWFNFOUXPVMECFSFGFSFODFEJOBOFX GFBUVSFJOUSPEVDFEJOUIFOFYUWFSTJPOPG3VCZ

Slide 107

Slide 107 text

5IBUGFBUVSFJT )BQQZ&ZFCBMMT7FSTJPO EF fi OFEJO3'$

Slide 108

Slide 108 text

-FUNFCSJF fl ZJOUSPEVDF)BQQZ&ZFCBMMT7FSTJPO

Slide 109

Slide 109 text

8IBUJT)BQQZ&ZFCBMMT7FSTJPO 8IFONVMUJQMFEFTUJOBUJPO*1BEESFTTFTXFSFBWBJMBCMF  4PDLFUUDQBOE5$14PDLFUOFXXPVMEBUUFNQUUPDPOOFDUUP UIFNPOFCZPOF JOTFRVFODF 5IJTCFIBWJPSSFNBJOTUIFTBNFBTPG3VCZ 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX $POOFDUJPOGBJMFE 4UBSUBDPOOFDUJPOBUUFNQU 4UBSUBOFXDPOOFDUJPOBUUFNQU

Slide 110

Slide 110 text

8IBUJT)BQQZ&ZFCBMMT7FSTJPO /BNFSFTPMVUJPOCFIBWFTTJNJMBSMZ JUSFTPMWFTFJUIFS*1WPS*1W fi STU  UIFOSFTPMWFTUIFPUIFSBGUFSUIBUDPNQMFUFT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF 4FOE%/4RVFSZGPS*1W

Slide 111

Slide 111 text

5IFQSPCMFNJTUIBUJGUIFQSPDFTTHFUTTUVDLBUBOZQPJOU GSPNOBNFSFTPMVUJPOUISPVHIDPOOFDUJPO UIFTVCTFRVFOU TUFQTDBOOPUQSPDFFE 8IBUJT)BQQZ&ZFCBMMT7FSTJPO 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS 8BJUJOHGPSDPOOFDUJPO 4UBSUBDPOOFDUJPOBUUFNQU 4FOE%/4RVFSZGPS*1W 8BJUJOHGPS*1W%/4SFTQPOTF $BOOPUTUBSUBOPUIFSBUUFNQU $BOOPU4FOE%/4RVFSZGPS*1W

Slide 112

Slide 112 text

)BQQZ&ZFCBMMT7FSTJPO )&W JTBOBMHPSJUIN EFTJHOFEUPBEESFTTUIJTQSPCMFN *UQFSGPSNTOBNFSFTPMVUJPOBOEDPOOFDUJPOBUUFNQUTJO QBSBMMFMBDSPTTNVMUJQMFDBOEJEBUFT 4FSWFS $POOFDUJPOFTUBCMJTIFEXJUIFBSMJFS 8IBUJT)BQQZ&ZFCBMMT7FSTJPO 4UBSUBDPOOFDUJPOBUUFNQUUP" 4UBSUBDPOOFDUJPOBUUFNQUUP# 4PDLFUUDQ 5$14PDLFUOFX

Slide 113

Slide 113 text

"OPWFSWJFXPGIPX)&WXPSLTJT )PX)&WXPSLT %/4TFSWFS 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX

Slide 114

Slide 114 text

'JSTU CPUI*1WBOE*1WIPTUOBNFSFTPMVUJPOBSF TUBSUFETJNVMUBOFPVTMZJOQBSBMMFM %/4TFSWFS )PX)&WXPSLT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W

Slide 115

Slide 115 text

"TTPPOBTFJUIFSPOFDPNQMFUFT TUBSUBDPOOFDUJPO BUUFNQUUPPOFPGUIFBEESFTTFTPCUBJOFEGSPNUIBUSFTVMU %/4TFSWFS )PX)&WXPSLT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU 4UBSUBDPOOFDUJPOBUUFNQUUP*1W

Slide 116

Slide 116 text

)&WQSJPSJUJ[FTDPOOFDUJPOTPWFS*1W *GUIF*1WBEESFTTFTBSFSFTPMWFE fi STU XBJUVQUPNTGPSUIF *1WSFTPMVUJPOUPDPNQMFUFCFGPSFTUBSUJOHBDPOOFDUJPOBUUFNQU )PX)&WXPSLT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 8BJUJOHGPSUIF*1W%/4SFTQPOTF 8BJUVQUPNTCFGPSF*1WDPOOFDUJPO

Slide 117

Slide 117 text

5IJTNTEFMBZJTDBMMFE3FTPMVUJPO%FMBZ )PX)&WXPSLT 3FTPMVUJPO%FMBZ %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 8BJUJOHNTGPSUIF*1W%/4SFTQPOTF 8BJUVQUPNTCFGPSF*1WDPOOFDUJPO

Slide 118

Slide 118 text

"GUFSTUBSUJOHBDPOOFDUJPOBUUFNQU XBJUVQUPNTGPS BDPOOFDUJPOUPCFFTUBCMJTIFE 4PDLFUUDQ 5$14PDLFUOFX )PX)&WXPSLT 4FSWFS 4UBSUBDPOOFDUJPOBUUFNQUUP" 8BJUVQUPNTCFGPSFOFYUDPOOFDUJPO

Slide 119

Slide 119 text

5IJTNTEFMBZJTDBMMFE$POOFDUJPO"UUFNQU%FMBZ 4PDLFUUDQ 5$14PDLFUOFX $POOFDUJPO"UUFNQU%FMBZ )PX)&WXPSLT 4FSWFS 4UBSUBDPOOFDUJPOBUUFNQUUP" 8BJUVQUPNTCFGPSFOFYUDPOOFDUJPO

Slide 120

Slide 120 text

*GUIFDPOOFDUJPOJTOPUFTUBCMJTIFEEVSJOH$POOFDUJPO "UUFNQU%FMBZ TUBSUBOFXBUUFNQUUPOFYUBEESFTT $POUJOVFTUBSUJOHOFXDPOOFDUJPOBUUFNQUTFWFSZNT VOUJMBDPOOFDUJPOJTTVDDFTTGVMMZFTUBCMJTIFEPS BMMDBOEJEBUFBEESFTTFTBSFFYIBVTUFE 4PDLFUUDQ 5$14PDLFUOFX )PX)&WXPSLT "GUFSNT TUBSUBOPUIFSBUUFNQUUP# 4FSWFS 4UBSUBDPOOFDUJPOBUUFNQUUP"

Slide 121

Slide 121 text

*GBOZPGUIFDPOOFDUJPOTJTTVDDFTTGVMMZFTUBCMJTIFE  DBODFMBMMUIFPUIFSDPOOFDUJPOBUUFNQUT 5IJTJTIPX)&WXPSLT $BODFMUIFDPOOFDUJPOBUUFNQUUP" $POOFDUJPOUP#FTUBCMJTIFE )PX)&WXPSLT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSNT TUBSUBOPUIFSBUUFNQUUP#

Slide 122

Slide 122 text

)&WJNQMFNFOUBUJPOJOTQJSFECZ3VCZ 5PJNQMFNFOU)&W 5$14PDLFUOFX JNQMFNFOUFEJO$ OFFEFE UPIBOEMFHFUBEESJOGP  BTZODISPOPVTMZ*UUPPLJOTQJSBUJPOGSPN UIFJNQSPWFEOBNFSFTPMVUJPOJOUSPEVDFEJO3VCZGPSUIJT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W

Slide 123

Slide 123 text

5IJTJTJOUSPEVDFEJO3VCZ

Slide 124

Slide 124 text

5IJTJTJOUSPEVDFEJO3VCZ 4XJUDIUP1SJTNBTUIFEFGBVMUQBSTFS  5IFJNQMJDJUCMPDLQBSBNFUFSJU  *OUSPEVDUJPOPG.PEVMBS($ FUD

Slide 125

Slide 125 text

*OUSPEVDUJPOPG)&WJO4PDLFUUDQ5$14PDLFUOFX 4PDLFUUDQBOE5$14PDLFUOFXXFSFVQEBUFE UPTVQQPSU)&W VOEFSUIFOBNFGBTU@GBMMCBDL CZTIJPJNN .JTBLJ4IJPJ IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 126

Slide 126 text

GBTU@GBMMCBDLXPSLTBTZODISPOPVTMZBOEDPODVSSFOUMZ *OBXPSMEXJUIGBTU@GBMMCBDL  DBOSFTPMW@UJNFPVUBOEDPOOFDU@UJNFPVU CFJNQMFNFOUFE 

Slide 127

Slide 127 text

3FTPMVUJPO%FBMBZ$POOFDUJPO"UUFNQU%FMBZ 5IF)&WEF fi OFTUXPUZQFTPGXBJUEVSBUJPOTJO JUTTQFDJ fi DBUJPO 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS 4FSWFS

Slide 128

Slide 128 text

3FTPMVUJPO%FBMBZ$POOFDUJPO"UUFNQU%FMBZ 3FTPMVUJPO%FMBZXBJUTVQUPNTGPS *1WOBNFSFTPMVUJPOBGUFS*1WSFTPMVUJPODPNQMFUFT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU 8BJUJOHNTGPSUIF*1W%/4SFTQPOTF 3FTPMVUJPO%FMBZ 8BJUVQUPNTCFGPSF*1WDPOOFDUJPO

Slide 129

Slide 129 text

3FTPMVUJPO%FBMBZ$POOFDUJPO"UUFNQU%FMBZ $POOFDUJPO"UUFNQU%FMBZXBJUTVQUPNT GPSUIFDPOOFDUJPOUPCFFTUBCMJTIFEBGUFSJOJUJBUJOHJU 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS $POOFDUJPO"UUFNQU%FMBZ 8BJUVQUPNTCFGPSFOFYUDPOOFDUJPO 4UBSUBDPOOFDUJPOBUUFNQUUP"

Slide 130

Slide 130 text

3FTPMVUJPO%FBMBZ$POOFDUJPO"UUFNQU%FMBZ #PUIPGUIFTFBSFJOUFOEFEUPXBJU VOUJMUIFOFYUDPOOFDUJPODBOCFJOJUJBUFE *GUIFUJNFPVUFYQJSFT  UIFXBJUJTUFSNJOBUFEBOEBOFXDPOOFDUJPOBUUFNQU JTJOJUJBUFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUGPS3FTPMVUJPO%FMBZ PS$POOFDUJPO"UUFNQU%FMBZ

Slide 131

Slide 131 text

3FTPMVUJPO%FBMBZ$POOFDUJPO"UUFNQU%FMBZ def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil # ... end *OUIFJNQMFNFOUBUJPO UIFTFEFMBZTBSFUSBDLFEVTJOH UIFWBSJBCMFTSFTPMVUJPO@EFMBZ@FYQJSFT@BUBOE DPOOFDUJPO@BUUFNQU@EFMBZ@FYQJSFT@BU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 132

Slide 132 text

3FTPMVUJPO%FBMBZ$POOFDUJPO"UUFNQU%FMBZ def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil # ... end #PUIBSFJOJUJBMJ[FEUPOJMBUUIFTUBSUPGUIFNFUIPE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 133

Slide 133 text

SFTPMW@UJNFPVUDPOOFDU@UJNFPVU *ODPOUSBTU SFTPMW@UJNFPVUBOEDPOOFDU@UJNFPVUXBJU VQUPBVTFSTQFDJ fi FEUJNFPVU %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS SFTPMW@UJNFPVU *GUIFUJNFPVUFYQJSFT  UIFXBJUJTUFSNJOBUFEBOEBOFSSPSJTSBJTFE "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF DPOOFDU@UJNFPVU

Slide 134

Slide 134 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil # ... user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY # ... end 5IFTFUJNFPVUTBSFUSBDLFEVTJOHUIFWBSJBCMFT VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BUBOE VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BU SFTPMW@UJNFPVUDPOOFDU@UJNFPVU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 135

Slide 135 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil # ... user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY # ... end VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BUJTJOJUJBMJ[FE UPOJMBUUIFTUBSUPGUIFNFUIPE SFTPMW@UJNFPVUDPOOFDU@UJNFPVU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 136

Slide 136 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil # ... user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY # ... end *GSFTPMW@UJNFPVUJTTQFDJ fi FE  VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BUJTTFUUP JUTFYQJSBUJPOUJNF SFTPMW@UJNFPVUDPOOFDU@UJNFPVU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC 5IFVTFSTQFDJ fi FEFYQJSBUJPOUJNF

Slide 137

Slide 137 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil # ... user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY # ... end 0UIFSXJTF JUJTTFUUP'MPBU*/'*/*5: UPNFBOXBJUJOEF fi OJUFMZ SFTPMW@UJNFPVUDPOOFDU@UJNFPVU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC NFBOTJOEF fi OJUFMZ

Slide 138

Slide 138 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU 0ODF*1WBOE*1WOBNFSFTPMVUJPOBSFTUBSUFEJO QBSBMMFM %/4TFSWFS 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W

Slide 139

Slide 139 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU JUXBJUTVOUJMFJUIFSPOFDPNQMFUFTPS PSVOUJMUIFFYQJSBUJPOUJNF %/4TFSWFS 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX SFTPMW@UJNFPVU 8BJU 8BJUJOHGPSBO*1WPS*1W%/4SFTQPOTF 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W

Slide 140

Slide 140 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 5IFFYQJSBUJPOUJNFJTEFUFSNJOFECZ UIFSFUVSOWBMVFPGUIJTDPOEJUJPOBMCSBODI 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 141

Slide 141 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 5IFDPOEJUJPOJTXIFUIFSBOZ DBOEJEBUFEFTUJOBUJPOBEESFTTFTBSFBWBJMBCMF "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT  'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 142

Slide 142 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end %VSJOHUIFJOJUJBMOBNFSFTPMVUJPO  OPEFTUJOBUJPOBEESFTTJTLOPXOZFU  TPFYFDVUJPOFOUFSTUIFMPXFSCSBODI 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 143

Slide 143 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU ends_at = if resolution_store.any_addrinfos? # ... else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BUJTTFUUP FJUIFSUIFFYQJSBUJPOUJNFPGSFTPMW@UJNFPVU PS'MPBU*/'*/*5: 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 144

Slide 144 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end user_specified_connect_timeout_at = nil VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BUSFNBJOT BUJUTJOJUJBMWBMVFPGOJM 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 145

Slide 145 text

%FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU ends_at = if resolution_store.any_addrinfos? # ... else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end "GUFSDPNQBDUJOHUIFBSSBZ  VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BUJTSFUVSOFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY

Slide 146

Slide 146 text

*UUIFOXBJUTVOUJMUIBUUJNF %FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU %/4TFSWFS 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BU 8BJU 8BJUJOHGPSBO*1WPS*1W%/4SFTQPOTF 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W

Slide 147

Slide 147 text

*GOFJUIFSOBNFSFTPMVUJPOOPSUIFDPOOFDUJPODPNQMFUFT XJUIJOUIFTQFDJ fi FEUJNF BUJNPFVUFSSPSJTSBJTFE %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU $BODFMUIF*1W%/4RVFSZ $BODFMUIF*1W%/4RVFSZ VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BU

Slide 148

Slide 148 text

*GUIFFYQJSBUJPOUJNFJT'MPBU*/'*/*5:  UIFQSPDFTTXBJUTJOEF fi OJUFMZ %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU 8BJU 8BJUJOEF fi OJUFMZGPSUIF%/4SFTQPOTF 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W

Slide 149

Slide 149 text

"GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE *G*1WOBNFSFTPMVUJPODPNQMFUFTXJUIJO UIFBMMPUUFEUJNF %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU

Slide 150

Slide 150 text

BDPOOFDUJPOBUUFNQUJTTUBSUFEUPPOFPGUIFPCUBJOFE BEESFTTFT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4UBSUBDPOOFDUJPOBUUFNQUUP*1W 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF

Slide 151

Slide 151 text

*G*1WOBNFSFTPMVUJPODPNQMFUFTXJUIJO UIFBMMPUUFEUJNF 3FTPMVUJPO%FMBZNVTUCFXBJUFEGPS %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF 3FTPMVUJPO%FMBZ 8BJUVQUPNTCFGPSF*1WDPOOFDUJPO

Slide 152

Slide 152 text

4PJUTFUTUIFFYQJSBUJPOUJNFEF fi OFECZUIFTQFDJ fi DBUJPO JOSFTPMVUJPO@EFMBZ@FYQJSFT@BU %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX resolution_delay_expires_at = now + RESOLUTION_DELAY "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF

Slide 153

Slide 153 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end BOESFUVSOTUPUIJTDPOEJUJPOBMCSBODIBHBJO "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 154

Slide 154 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 5IJTUJNF TJODFUIFSFBSFBMSFBEZ DBOEJEBUFEFTUJOBUJPOBEESFTTFT  FYFDVUJPOFOUFSTUIFVQQFSCSBODI "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT 

Slide 155

Slide 155 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else # ... end # When the resolved addresses are IPv4 addresses resolution_delay_expires_at = now + RESOLUTION_DELAY *GSFTPMVUJPO@EFMBZ@FYQJSFT@BUIBTBWBMVF  UIBUWBMVFJTSFUVSOFE "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 156

Slide 156 text

*UUIFOXBJUTVOUJMUIBUUJNF %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF 3FTPMVUJPO%FMBZ 8BJUVQUPNTCFGPSF*1WDPOOFDUJPO

Slide 157

Slide 157 text

*G*1WOBNFSFTPMVUJPODPNQMFUFTPSUIFUJNFPVU FYQJSFT UIFXBJUFOET %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4FSWFS 3FTPMVUJPO%FMBZ 5IFUJNFPVUFYQJSFT 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF

Slide 158

Slide 158 text

SFTPMVUJPO@EFMBZ@FYQJSFT@BUJTOPMPOHFSOFFEFE  TPJUJTTFUUPOJM %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX if expired?(now, resolution_delay_expires_at) resolution_delay_expires_at = nil end "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF

Slide 159

Slide 159 text

BOETUBSUTBDPOOFDUJPOBUUFNQUUP POFPGUIFPCUBJOFEBEESFTTFT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSFJUIFSBEESFTTGBNJMZJTSFTPMWFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF 4UBSUBDPOOFDUJPOBUUFNQUUP*1W

Slide 160

Slide 160 text

8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE 0ODFBDPOOFDUJPOBUUFNQUIBTTUBSUFE  JUUIFOOFFETUPXBJUGPS$POOFDUJPO"UUFNQU%FMBZ %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 4UBSUBDPOOFDUJPOBUUFNQUUP*1W 8BJUVQUPNTCFGPSFOFYUDPOOFDUJPO 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF $POOFDUJPO"UUFNQU%FMBZ

Slide 161

Slide 161 text

4PJUTFUTUIFFYQJSBUJPOUJNFEF fi OFECZUIFTQFDJ fi DBUJPO JODPOOFDUJPO@BUUFNQU@EFMBZ@FYQJSFT@BU %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX connection_attempt_delay_expires_at = now + CONNECTION_ATTEMPT_DELAY 4FSWFS 8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE 4UBSUBDPOOFDUJPOBUUFNQUUP*1W 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF

Slide 162

Slide 162 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end BOESFUVSOUPUIFCSBODI 8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 163

Slide 163 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end *GBOZDBOEJEBUFEFTUJOBUJPOBEESFTTFTBSF TUJMMBWBJMBCMF  FYFDVUJPOFOUFSTUIFVQQFSCSBODI 8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT 

Slide 164

Slide 164 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end .VTUCFOJM BOESFUVSOTDPOOFDUJPO@BUUFNQU@EFMBZ@FYQJSFT@BU 8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE connection_attempt_delay_expires_at = now + CONNECTION_ATTEMPT_DELAY 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 165

Slide 165 text

0ODF$POOFDUJPO"UUFNQU%FMBZUJNFPVUFYQJSFT  BDPOOFDUJPOBUUFNQUDBOCFTUBSUFEUPUIFOFYUBEESFTT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF "GUFSNT TUBSUBOPUIFSBUUFNQU 4UBSUBDPOOFDUJPOBUUFNQUUP*1W

Slide 166

Slide 166 text

5IJTJTSFQFBUFEFWFSZNTVOUJMOPBEESFTTFTSFNBJO %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUGPSUIFDPOOFDUJPOUPCFFTUBCMJTIFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSO*1W%/4SFTQPOTF fi STU 4UJMMXBJUJOHGPSUIF*1W%/4SFTQPOTF "GUFSNT TUBSUBOPUIFSBUUFNQU 4UBSUBDPOOFDUJPOBUUFNQUUP*1W "GUFSNT TUBSUBOPUIFSBUUFNQU

Slide 167

Slide 167 text

if resolution_store.empty_addrinfos? user_specified_connect_timeout_at = connect_timeout ? now + connect_timeout : Float::INFINITY end 0ODFBDPOOFDUJPOBUUFNQUIBTCFFOTUBSUFEGPS UIFMBTUEFTUJOBUJPOBEESFTT BWBMVFJTBTTJHOFEUP VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BU 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 168

Slide 168 text

if resolution_store.empty_addrinfos? user_specified_connect_timeout_at = connect_timeout ? now + connect_timeout : Float::INFINITY end *GDPOOFDU@UJNFPVUJTTQFDJ fi FE  VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BUJTTFUUP JUTFYQJSBUJPOUJNF 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC 5IFVTFSTQFDJ fi FEFYQJSBUJPOUJNF

Slide 169

Slide 169 text

if resolution_store.empty_addrinfos? user_specified_connect_timeout_at = connect_timeout ? now + connect_timeout : Float::INFINITY end 0UIFSXJTF JUJTTFUUP'MPBU*/'*/*5: UPNFBOXBJUJOEF fi OJUFMZ 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC NFBOTJOEF fi OJUFMZ

Slide 170

Slide 170 text

0OUPQPGUIBU JUXBJUTGPSPOFPGUIFGPMMPXJOH ɹɹVOUJMBOZPGUIFDPOOFDUJPOBUUFNQUTJTFTUBCMJTIFE ɹɹVOUJMUIFPUIFSOBNFSFTPMVUJPODPNQMFUFT JGJUIBTOPUZFUDPNQMFUFE  ɹɹVOUJMUIFFYQJSBUJPOUJNF %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 8BJUJOHGPSUIFPUIFS%/4SFTQPOTF 8BJUJOHGPSUIFDPOOFDUJPOFTUBCMJTIFE

Slide 171

Slide 171 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 5PEPUIBU JUSFUVSOTUPUIFCSBODI 4JODFUIFSFBSFOPDBOEJEBUFEFTUJOBUJPOBEESFTTFT MFGU FYFDVUJPOFOUFSTUIFMPXFSCSBODI 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT 

Slide 172

Slide 172 text

ends_at = if resolution_store.any_addrinfos? # ... else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end BOESFUVSOTXIJDIFWFSJTHSFBUFS VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BUPS VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BU user_specified_resolv_timeout_at = resolv_timeout ? now + resolv_timeout : Float::INFINITY user_specified_connect_timeout_at = connect_timeout ? now + connect_timeout : Float::INFINITY 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 173

Slide 173 text

*UUIFOXBJUTVOUJMUIBUUJNF %FUFSNJOJOHUIFOBNFSFTPMVUJPOUJNFPVU %/4TFSWFS 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BU PSVTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BU 8BJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE 8BJUJOHGPSUIFPUIFS%/4SFTQPOTF

Slide 174

Slide 174 text

*GOFJUIFSOBNFSFTPMVUJPOOPSUIFDPOOFDUJPODPNQMFUFT XJUIJOUIFTQFDJ fi FEUJNF BUJNFPVUFSSPSJTSBJTFE %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO $BODFMUIFSFNBJOJOH%/4RVFSZ $BODFMUIFBUUFNQUT VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BU PSVTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BU

Slide 175

Slide 175 text

*GUIFFYQJSBUJPOUJNFJT'MPBU*/'*/*5:  UIFQSPDFTTXBJUTJOEF fi OJUFMZ %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUGPSOBNFSFTPMVUJPOPSDPOOFDUJPO 8BJUJOHGPSUIFPUIFS%/4SFTQPOTF 8BJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE

Slide 176

Slide 176 text

*GUIFOBNFSFTPMVUJPOGPSUIFPUIFSBEESFTTGBNJMZ DPNQMFUFTXJUIJOUIFXBJUQFSJPE 8IFOBMMOBNFSFTPMVUJPOJTDPNQMFUF %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS SFTPMW@UJNFPVU DPOOFDU@UJNFPVU 3FUVSOUIFPUIFS%/4SFTQPOTF 8BJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE

Slide 177

Slide 177 text

8IFOBMMOBNFSFTPMVUJPOJTDPNQMFUF if resolution_store.resolved?(:ipv4) if resolution_store.resolved?(:ipv6) # ... user_specified_resolv_timeout_at = nil end # ... end VTFS@TQFDJ fi FE@SFTPMW@UJNFPVU@BUJT OPMPOHFSOFFEFE TPJUJTTFUUPOJM 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 178

Slide 178 text

"GUFSUIBU JUTUBSUTDPOOFDUJPOBUUFNQUTUP UIFSFNBJOJOHSFTPMWFEBEESFTTFTFWFSZNT $POUJOVFTUBSUJOHDPOOFDUJPOBUUFNQUT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSNT TUBSUBOPUIFSBUUFNQU 4UBSUBDPOOFDUJPOBUUFNQU "GUFSNT TUBSUBOPUIFSBUUFNQU

Slide 179

Slide 179 text

$POUJOVFTUBSUJOHDPOOFDUJPOBUUFNQUT if resolution_store.empty_addrinfos? user_specified_connect_timeout_at = connect_timeout ? now + connect_timeout : Float::INFINITY end 0ODFBDPOOFDUJPOBUUFNQUIBTCFFOTUBSUFEGPS UIFMBTUBEESFTT  VTFS@TQFDJ fi FE@DPOOFDU@UJNFPVU@BUJTTFUBHBJO 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 180

Slide 180 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 5IJTJTUIFOUBLFOBTUIFFYQJSBUJPOUJNF user_specified_connect_timeout_at = connect_timeout ? now + connect_timeout : Float::INFINITY $POUJOVFTUBSUJOHDPOOFDUJPOBUUFNQUT 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC user_specified_resolv_timeout_at = nil

Slide 181

Slide 181 text

*UUIFOXBJUTVOUJMBOZPGUIFDPOOFDUJPOBUUFNQUTJT FTUBCMJTIFE PSVOUJMUIFFYQJSBUJPOUJNF $POUJOVFXBJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE 4PDLFUUDQ 5$14PDLFUOFX 8BJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE 4FSWFS

Slide 182

Slide 182 text

*GUIFDPOOFDUJPOEPFTOPUFTUBCMJTIFEXJUIJO UIFTQFDJ fi FEUJNF BUJNFPVUFSSPSJTSBJTFE $POUJOVFXBJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS $BODFMUIFBUUFNQUT DPOOFDU@UJNFPVU

Slide 183

Slide 183 text

*GUIFFYQJSBUJPOUJNFJT'MPBU*/'*/*5:  UIFQSPDFTTXBJUTJOEF fi OJUFMZ $POUJOVFXBJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 8BJUJOHGPSBDPOOFDUJPOFTUBCMJTIFE

Slide 184

Slide 184 text

GBTU@GBMMCBDLJTFOBCMFECZEFGBVMU  CVUJUDBOCFEJTBCMFEJOUIFTFUUJOHT 8IFOGBTU@GBMMCBDLJTEJTBCMFE UIFJNQMFNFOUBUJPOTPG4PDLFUUDQ BOE5$14PDLFUOFXSFNBJOVODIBOHFEGSPNUIPTFJO3VCZ # An argument to the method Socket.tcp(host, port, fast_fallback: false) TCPSocket.new(host, port, fast_fallback: false) # An accessor method on the Socket class Socket.tcp_fast_fallback = false # An environment variable TCP_NO_FAST_FALLBACK = 1

Slide 185

Slide 185 text

/PX MFU`TSFUVSOUPUIFQSFTFOU ŠUIF3VCZEFWFMPQNFOUFSB

Slide 186

Slide 186 text

"GUFSUIFSFMFBTFPG3VCZ EVSJOHUIFEFWFMPQNFOUDZDMFGPS3VCZ  *IFBSEUIFGPMMPXJOHGSPN!PTZPZV

Slide 187

Slide 187 text

*XBOUUPSFNPWFOFUIUUQ`TEFQFOEFODZ POUIFUJNFPVUMJCSBSZ )BWFO`UXFIFBSEUIJTCFGPSF

Slide 188

Slide 188 text

OFUIUUQVTFEUIFUJNFPVUMJCSBSZUPUPXBJUGPSUIFPWFSBMMPQFSBUJPO  GSPNOBNFSFTPMVUJPOUPDPOOFDUJPOFTUBCMJTINFOU 5JNFPVU)BOEMJOHJOOFUIUUQ GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT Currently, we use Timeout in Net::HTTP and other standard libraries. lib/net/http.rb 945 s = Timeout.timeout(@open_timeout, Net::OpenTimeout) { 946 begin 947 TCPSocket.open(conn_address, conn_port, @local_host, @local_port) 948 rescue => e 949 raise e, "Failed to open TCP connection to " + 950 "#{conn_address}:#{conn_port} (#{e.message})" 951 end 952 } 5IFUJNFPVUMJCSBSZTNFUIPE

Slide 189

Slide 189 text

5IFUJNFPVUMJCSBSZXJUI3BDUPS 3VCZ require "timeout" r = Ractor.new do Timeout.timeout(1) do sleep 2 end end r.take )PXFWFS BTPG3VCZ UIFUJNFPVUMJCSBSZEJEOPUXPSLXFMM XJUI3BDUPS 6TJOHJUJOTJEFBOPONBJO3BDUPSXPVMESBJTFBOFSSPS # => Ractor::IsolationError can not access non-shareable objects in constant Timeout::State::GLOBAL_STATE by non-main ractor.

Slide 190

Slide 190 text

!PTZPZVTSFRVFTUXBTBCPVU NBLJOHOFUIUUQXPSLCFUUFSXJUI3BDUPST CZSFNPWJOHJUTEFQFOEFODZPOUIFUJNFPVUMJCSBSZ

Slide 191

Slide 191 text

"UUIJTQPJOU  UIFUJNFPVUTQSPWJEFECZ4PDLFUUDQBOE5$14PDLFUOFX XFSFSFTPMW@UJNFPVUBOEDPOOFDU@UJNFPVU DPOOFDU@UJNFPVU SFTPMW@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 192

Slide 192 text

$PVMEUIFTFCFVTFEBTBSFQMBDFNFOUGPS UIFUJNFPVUMJCSBSZ DPOOFDU@UJNFPVU SFTPMW@UJNFPVU 4PDLFUUDQ 5$14PDLFUOFX

Slide 193

Slide 193 text

"RVFTUJPOGSPN!PTZPZV

Slide 194

Slide 194 text

2&WFOJGCPUISFTPMW@UJNFPVUBOE DPOOFDU@UJNFPVUBSFVTFE  XFTUJMMDBOOPUDPOUSPMUIFPWFSBMMUJNFPVU UIFXBZUIFUJNFPVUMJCSBSZEPFT DBOXF 

Slide 195

Slide 195 text

2&WFOJGCPUISFTPMW@UJNFPVUBOE DPOOFDU@UJNFPVUBSFVTFE  XFTUJMMDBOOPUDPOUSPMUIFPWFSBMMUJNFPVU UIFXBZUIFUJNFPVUMJCSBSZEPFT DBOXF  "5IBUJTFYBDUMZSJHIU

Slide 196

Slide 196 text

5IFQSPCMFNPGDBOOPUDPOUSPMUIFPWFSBMMUJNFPVU -FUTTFFXIBUIBQQFOT XIFOSFTPMW@UJNFPVUBOEDPOOFDU@UJNFPVUBSFVTFE XJUIGBTU@GBMMCBDLFOBCMFE %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS

Slide 197

Slide 197 text

FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU &YBNQMF 4VQQPTFUIFNFUIPEJTDBMMFEXJUISFTPMW@UJNFPVUTFUUP NTBOEDPOOFDU@UJNFPVUTFUUPNT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS SFTPMW@UJNFPVUNT DPOOFDU@UJNFPVUNT

Slide 198

Slide 198 text

*NNFEJBUFMZBGUFSUIFNFUIPETUBSUT  BO*1WBEESFTTJTPCUBJOFE "UUIJTQPJOU *1WOBNFSFTPMVUJPOJTTUJMMJOQSPHSFTT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU SFTPMW@UJNFPVUNT 8BJUJOHGPSUIF*1W%/4SFTQPOTF

Slide 199

Slide 199 text

"DPOOFDUJPOBUUFNQUJTTUBSUFEGPSUIF*1WBEESFTT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU DPOOFDU@UJNFPVUNT 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU 8BJUJOHGPSUIF*1W%/4SFTQPOTF 4UBSUBDPOOFDUJPOBUUFNQUUP*1W 8BJUJOHGPSDPOOFDUJPO SFTPMW@UJNFPVUNT

Slide 200

Slide 200 text

5IJTDPOOFDUJPOJTOPUFTUBCMJTIFEJNNFEJBUFMZ "GUFSNT DPOOFDU@UJNFPVUFYQJSFT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU 4UBSUBDPOOFDUJPOBUUFNQUUP*1W NTQBTTFE 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU 8BJUJOHGPSUIF*1W%/4SFTQPOTF DPOOFDU@UJNFPVUNT SFTPMW@UJNFPVUNT

Slide 201

Slide 201 text

)PXFWFS BUUIJTQPJOUSFTPMW@UJNFPVUTUJMMIBTNT SFNBJOJOH TPOPFSSPSJTSBJTFEUIFXBJUDPOUJOVFT %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU 4FOE%/4RVFSZGPS*1W 4FOE%/4RVFSZGPS*1W 3FUVSOUIF*1W%/4SFTQPOTF fi STU 8BJUJOHGPS*1W NTMFGU SFTPMW@UJNFPVUNT 4UBSUBDPOOFDUJPOBUUFNQUUP*1W 4UJMMXBJUJOHGPSDPOOFDUJPO

Slide 202

Slide 202 text

*GBOPUIFSNTQBTTBGUFSUIBUBOE OFJUIFSUIFDPOOFDUJPOOPSOBNFSFTPMVUJPODPNQMFUFT  BSFTPMW@UJNFPVUFSSPSJTSBJTFE %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU $BODFMUIF*1W%/4RVFSZ $BODFMUIF*1WBUUFNQU SFTPMW@UJNFPVUNT

Slide 203

Slide 203 text

*OUIJTDBTF UIFPWFSBMMUJNFPVUJTOPUNT UIFTVNPGNTBOENT  *UJTNT UIFWBMVFPGSFTPMW@UJNFPVU FH8IFOSFTPMW@UJNFPVUJTMPOHFSUIBODPOOFDU@UJNFPVU %/4TFSWFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS 5IFPWFSBMMUJNFPVUNT $BODFMUIF*1WBUUFNQU $BODFMUIF*1W%/4RVFSZ SFTPMW@UJNFPVUNT

Slide 204

Slide 204 text

"OPUIFSFYBNQMFGBTU@GBMMCBDLQBSBMMFMJ[FTDPOOFDUJPO BUUFNQUTCZTUBSUJOHBOFXBUUFNQUUPBDBOEJEBUF EFTUJOBUJPOBEESFTTFWFSZNT FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS "GUFSNT TUBSUBOPUIFSBUUFNQU 4UBSUBDPOOFDUJPOBUUFNQU

Slide 205

Slide 205 text

"DPOOFDU@UJNFPVUFSSPSPDDVSTXIFOUIFTQFDJ fi FE BNPVOUPGUJNFIBTFMBQTFETJODFUIFMBTUDPOOFDUJPO BUUFNQUXBTTUBSUFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST DPOOFDU@UJNFPVU "GUFSNT TUBSUBOPUIFSBUUFNQU 4UBSUBDPOOFDUJPOBUUFNQU

Slide 206

Slide 206 text

'PSFYBNQMF  TVQQPTFDPOOFDU@UJNFPVUJTTFUUPNT BOEUXP DBOEJEBUFEFTUJOBUJPOBEESFTTFT"BOE# BSFPCUBJOFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST 0CUBJOUXPBEESFTTFT" # DPOOFDU@UJNFPVUNT

Slide 207

Slide 207 text

'JSTU BDPOOFDUJPOBUUFNQUJTTUBSUFEUP" 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST 4UBSUBDPOOFDUJPOBUUFNQUUP"

Slide 208

Slide 208 text

*GUIFDPOOFDUJPOUP"JTOPUFTUBCMJTIFEJNNFEJBUFMZ  BTFDPOEDPOOFDUJPOBUUFNQUJTTUBSUFEUP#NTMBUFS 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST "GUFSNT TUBSUBOPUIFSBUUFNQUUP# 4UBSUBDPOOFDUJPOBUUFNQUUP" DPOOFDU@UJNFPVUNT

Slide 209

Slide 209 text

*GNTQBTTBGUFSUIFDPOOFDUJPOBUUFNQUUP#JTTUBSUFE  4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST NTQBTTFE "GUFSNT TUBSUBOPUIFSBUUFNQUUP# 4UBSUBDPOOFDUJPOBUUFNQUUP" DPOOFDU@UJNFPVUNT

Slide 210

Slide 210 text

BOEOFJUIFS"OPS#IBTDPNQMFUFEUIFDPOOFDUJPO  BDPOOFDU@UJNFPVUFSSPSPDDVST 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST $BODFMUIFDPOOFDUJPOUP# $BODFMUIFDPOOFDUJPOUP" DPOOFDU@UJNFPVUNT

Slide 211

Slide 211 text

*OUIJTDBTF UIFPWFSBMMUJNFPVUJTOPUNT  UIFWBMVFPGDPOOFDU@UJNFPVU *UJTNT NT GPSBUPUBMPGNT 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS FH8IFO$POOFDUJPO"UUFNQU%FMBZPDDVST $BODFMUIFDPOOFDUJPOUP# $BODFMUIFDPOOFDUJPOUP" 5IFPWFSBMMUJNFPVUNT NT DPOOFDU@UJNFPVUNT

Slide 212

Slide 212 text

5IFTFBSFUIFEJ ff i DVMUJFTPGUJNFPVUIBOEMJOH XJUIGBTU@GBMMCBDL

Slide 213

Slide 213 text

4P XIBUBCPVUXIFOGBTU@GBMMCBDLJTOPUVTFE

Slide 214

Slide 214 text

8JUIPVUGBTU@GBMMCBDL DPOOFDU@UJNFPVUXBTEFTJHOFEUPBQQMZUPFBDIJOEJWJEVBM DPOOFDUJPOBUUFNQU *GUIFSFBSFNVMUJQMFEFTUJOBUJPOBEESFTTFT  JUDBOUBLFVQUPOVNCFSPGBEESFTTFTʷDPOOFDU@UJNFPVU CFGPSFBUJNFPVUFSSPSPDDVST 4FSWFS 5JNFPVUPDDVSSFE DPOOFDU@UJNFPVU 4UBSUBOFXDPOOFDUJPOBUUFNQU 4PDLFUUDQ 5$14PDLFUOFX

Slide 215

Slide 215 text

8JUIPVUGBTU@GBMMCBDL 'PSFYBNQMF JGDPOOFDU@UJNFPVUJTNT BOEUIFSFBSFUXPEFTUJOBUJPOBEESFTTFT  UIFUJNFPVUFSSPSNBZOPUPDDVSVOUJMNTMBUFS 4FSWFS 5JNFPVUPDDVSSFE DPOOFDU@UJNFPVUNT 5JNFPVUPDDVSSFE 5IFPWFSBMMUJNFPVUNTʷ 4PDLFUUDQ 5$14PDLFUOFX

Slide 216

Slide 216 text

5IJTTIPXTUIBUFWFOJGCPUISFTPMW@UJNFPVUBOE DPOOFDU@UJNFPVUBSFVTFE  UIFZTUJMMDBOOPUSFQMBDFUIFUJNFPVUMJCSBSZ

Slide 217

Slide 217 text

"EEPQFO@UJNFPVUBTPWFSBMMUJNFPVUPQUJPOGPS4PDLFUUDQ 5PBEESFTTUIJT  PQFO@UJNFPVUXBTQSPQPTFEGPS3VCZ -JLFUIFUJNFPVUMJCSBSZ NBOBHFTUIFUJNFPVUGSPN OBNFSFTPMVUJPOUPDPOOFDUJPOFTUBCMJTINFOU GSPNTIJPJNN .JTBLJ4IJPJ IUUQTCVHTSVCZMBOHPSHJTTVFT

Slide 218

Slide 218 text

BOPQFO@UJNFPVULFZXPSEBSHVNFOU 8IFOUIFNFUIPEJTDBMMFEXJUIPQFO@UJNFPVU TQFDJ fi FE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS Socket.tcp("ruby-lang.org", 80, open_timeout: 1) PQFO@UJNFPVU "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 219

Slide 219 text

BOPQFO@UJNFPVULFZXPSEBSHVNFOU JGUIFDPOOFDUJPOUPUIFTFSWFSJTOPUFTUBCMJTIFE XJUIJOUIFTQFDJ fi FEUJNF 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS Socket.tcp("ruby-lang.org", 80, open_timeout: 1) "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF PQFO@UJNFPVU

Slide 220

Slide 220 text

BOPQFO@UJNFPVULFZXPSEBSHVNFOU BUJNFPVUFSSPSJTSBJTFE 4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS Socket.tcp("ruby-lang.org", 80, open_timeout: 1) $BODFMUPDPOOFDU $BODFMUPSFTPMWFUIFIPTUOBNF PQFO@UJNFPVU

Slide 221

Slide 221 text

BOPQFO@UJNFPVULFZXPSEBSHVNFOU 4P IPXDBOXFJNQMFNFOUUIJTXIJMFLFFQJOHJUDPNQBUJCMF XJUIUIFFYJTUJOHUJNFPVUTBOEGBTU@GBMMCBDL  4PDLFUUDQ 5$14PDLFUOFX 4FSWFS %/4TFSWFS Socket.tcp("ruby-lang.org", 80, open_timeout: 1) $BODFMUPDPOOFDU $BODFMUPSFTPMWFUIFIPTUOBNF PQFO@UJNFPVU

Slide 222

Slide 222 text

'JSTU XFOFFEUPDPOTJEFSIPXPQFO@UJNFPVU SFMBUFTUPUIFFYJTUJOHUJNFPVUPQUJPOT 8IFOPQFO@UJNFPVUJTVTFEXJUI SFTPMW@UJNFPVUBOEPSDPOOFDU@UJNFPVU JOXIBUDBTFT  BOEXIJDIUJNFPVUTIPVMEUBLFQSFDFEFODF 6TJOHPQFO@UJNFPVUBOEPUIFSUJNFPVUPQUJPOTUPHFUIFS

Slide 223

Slide 223 text

'JSTU XFOFFEUPDPOTJEFSIPXPQFO@UJNFPVU SFMBUFTUPUIFFYJTUJOHUJNFPVUPQUJPOT 8IFOPQFO@UJNFPVUJTVTFEXJUI SFTPMW@UJNFPVUBOEPSDPOOFDU@UJNFPVU JOXIBUDBTFT  BOEXIJDIUJNFPVUTIPVMEUBLFQSFDFEFODF 5PPDPNQMFY 6TJOHPQFO@UJNFPVUBOEPUIFSUJNFPVUPQUJPOTUPHFUIFS

Slide 224

Slide 224 text

/PUVTJOHPQFO@UJNFPVUBOEPUIFSUJNFPVUPQUJPOTUPHFUIFS def self.tcp( host, port, ..., connect_timeout: nil, resolv_timeout: nil, open_timeout: nil, ..., & ) if open_timeout && (connect_timeout || resolv_timeout) raise ArgumentError, "Cannot specify open_timeout along with connect_timeout or resolv_timeout" end # ... end *GPQFO@UJNFPVUJTTQFDJ fi FEUPHFUIFSXJUI BOPUIFSUJNFPVUBSHVNFOU JUJTUSFBUFEBTJOWBMJEBOE BO"SHVNFOU&SSPSJTSBJTFE 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC .VTUCFSBJTFE "EEFE

Slide 225

Slide 225 text

PQFO@UJNFPVUXJUIGBTU@GBMMCBDL ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end /FYU XFOFFEUPDPOTJEFSIPXUPNBLFGBTU@GBMMCBDL XPSLXJUIGBTU@GBMMCBDL 5IJTJTUIFDPEFBTPG3VCZ 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 226

Slide 226 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end *GUIFSFBSFDBOEJEBUFEFTUJOBUJPOBEESFTTFT  JUSFUVSOTUIFUJNFXIFOUIFOFYUDPOOFDUJPOBUUFNQU DBOCFTUBSUFE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT  3FUVSOTXIFOUPTUBSUUIFOFYUDPOOFDUJPOBUUFNQU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 227

Slide 227 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 0UIFSXJTF JUSFUVSOTUIFUJNF XIFOBUJNFPVUFSSPSTIPVMECFSBJTFE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 3FUVSOTXIFOUPSBJTFBUJNFPVUFSSPS "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT  'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 228

Slide 228 text

ends_at = if resolution_store.any_addrinfos? resolution_delay_expires_at || connection_attempt_delay_expires_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 8JUIPQFO@UJNFPVU BUJNFPVUFSSPSOFFETUPCFSBJTFE BUUIFTQFDJ fi FEUJNFSFHBSEMFTTPGXIFUIFSUIFSFBSF BOZDBOEJEBUFEFTUJOBUJPOBEESFTTFT PQFO@UJNFPVUXJUIGBTU@GBMMCBDL "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT  'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 229

Slide 229 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil, open_timeout: nil, ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil # ... end 8JUIUIJTJONJOE JOUIFNPEJ fi FEDPEF  BWBMVFJTBTTJHOFEUPVTFS@TQFDJ fi FE@PQFO@UJNFPVU@BU BUUIFTUBSUPGUIFNFUIPE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 230

Slide 230 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil, open_timeout: nil, ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil # ... end *GPQFO@UJNFPVUJTDPO fi HVSFE  UIFWBSJBCMFJTTFUUPUIFUJNFXIFOPQFO@UJNFPVU XJMMFYQJSF PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 231

Slide 231 text

def self.tcp_with_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil, open_timeout: nil, ) # ... resolution_delay_expires_at = nil connection_attempt_delay_expires_at = nil user_specified_connect_timeout_at = nil user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil # ... end 0UIFSXJTF JUJTTFUUPOJM PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 232

Slide 232 text

ends_at = if resolution_store.any_addrinfos? /FYUJTBDIBOHFUPUIFDPOEJUJPOBMCSBODIUIBU SFUVSOTUIFFYQJSBUJPOUJNF 8IFOUIFSFBSFDBOEJEBUFEFTUJOBUJPOBEESFTTFT PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT  *O3VCZ

Slide 233

Slide 233 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), UIFFYQJSBUJPOUJNFGPS3FTPMVUJPO%FMBZPS $POOFDUJPO"UUFNQU%FMBZJTDPNQBSFE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 234

Slide 234 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min XJUIUIFFYQJSBUJPOUJNFGPSPQFO@UJNFPVU  PQFO@UJNFPVUXJUIGBTU@GBMMCBDL user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 235

Slide 235 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min XJUIUIFFYQJSBUJPOUJNFGPSPQFO@UJNFPVU  BOEUIFFBSMJFSPOFJTSFUVSOFE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil *O3VCZ

Slide 236

Slide 236 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min # ... end if expired?(now, user_specified_open_timeout_at) raise(IO::TimeoutError, "user specified timeout for #{host}:#{port}") end *GUIFPQFO@UJNFPVUFYQJSBUJPOUJNFIBT BMSFBEZQBTTFEXIFOUIFXBJUFOET  BUJNFPVUFSSPSJTSBJTFE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC .VTUCFSBJTFE *O3VCZ

Slide 237

Slide 237 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min *GPQFO@UJNFPVUJTOPUTQFDJ fi FE  UIFWBMVFPGVTFS@TQFDJ fi FE@PQFO@UJNFPVU@BUJTOJM PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil *O3VCZ

Slide 238

Slide 238 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min *OUIBUDBTF BTCFGPSF UIFSFUVSOWBMVFJT UIFFYQJSBUJPOUJNFGPSFJUIFS3FTPMVUJPO%FMBZ PS$POOFDUJPO"UUFNQU%FMBZ PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC 3FUVSOTXIFOUPTUBSUUIFOFYUDPOOFDUJPOBUUFNQU *O3VCZ

Slide 239

Slide 239 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min *GUIFSFBSFOPDBOEJEBUFEFTUJOBUJPOBEESFTTFT PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC "OZDBOEJEBUFEFTUJOBUJPOBEESFTTFT  *O3VCZ

Slide 240

Slide 240 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min elsif user_specified_open_timeout_at JGPQFO@UJNFPVUJTTQFDJ fi FE  JUJTUIFPOMZUJNFPVUUIBUDBODBVTFBUJNFPVUFSSPS PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 241

Slide 241 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min elsif user_specified_open_timeout_at user_specified_open_timeout_at else # ... end 4PUIFSFUVSOWBMVFJTTJNQMZ VTFS@TQFDJ fi FE@PQFO@UJNFPVU@BU PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC user_specified_open_timeout_at = open_timeout ? now + open_timeout : nil *O3VCZ

Slide 242

Slide 242 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min elsif user_specified_open_timeout_at user_specified_open_timeout_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end *GVTFS@TQFDJ fi FE@PQFO@UJNFPVU@BUJTOJM  JUGBMMTCBDLUPUIFPUIFSVTFSTQFDJ fi FEUJNFPVUWBMVFT 5IJTNBJOUBJOTUIFCFIBWJPSCFGPSFUIFDIBOHF PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC nil *O3VCZ

Slide 243

Slide 243 text

ends_at = if resolution_store.any_addrinfos? [(resolution_delay_expires_at || connection_attempt_delay_expires_at), user_specified_open_timeout_at].compact.min elsif user_specified_open_timeout_at user_specified_open_timeout_at else [ user_specified_resolv_timeout_at, user_specified_connect_timeout_at ].compact.max end 8JUIUIJT PQFO@UJNFPVUJTOPXDPNQMFUF XIFOGBTU@GBMMCBDLJTFOBCMFE PQFO@UJNFPVUXJUIGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ

Slide 244

Slide 244 text

/FYU MFUTBMTPMPPLBUUIFJNQMFNFOUBUJPO XIFOGBTU@GBMMCBDLJTEJTBCMFE

Slide 245

Slide 245 text

8IFOGBTU@GBMMCBDLJTEJTBCMFE  4PDLFUUDQBOE5$14PDLFUOFXQFSGPSNOBNFSFTPMVUJPO fi STU  BOEUIFOTUBSUDPOOFDUJPOBUUFNQUT 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF

Slide 246

Slide 246 text

PQFO@UJNFPVUJOUFSSVQUTFJUIFSOBNFSFTPMVUJPOPS BDPOOFDUJPOBUUFNQU BOESBJTFTBUJNFPVUFSSPS 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF PQFO@UJNFPVU PQFO@UJNFPVU

Slide 247

Slide 247 text

0GUIFTF GPSUIFOBNFSFTPMVUJPOUJNFPVU  UIFFYJTUJOHJNQMFNFOUBUJPODBOCFVTFEBTJT 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL 3FTPMWFUIFIPTUOBNF PQFO@UJNFPVU

Slide 248

Slide 248 text

def self.tcp_without_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil, ) # ... Addrinfo.foreach(host, port, nil, :STREAM, timeout: resolv_timeout) {|ai| # ... } # ... end 5IJTJTUIF3VCZJNQMFNFOUBUJPO XIFOGBTU@GBMMCBDLJTEJTBCMFE PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL *O3VCZ 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 249

Slide 249 text

def self.tcp_without_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil, ) # ... Addrinfo.foreach(host, port, nil, :STREAM, timeout: resolv_timeout) {|ai| # ... } # ... end 5IFSFNBJOJOHUJNFVOUJMSFTPMW@UJNFPVUFYQJSFTJT BMSFBEZQBTTFEUPUIFNFUIPEPSGVODUJPOUIBU QFSGPSNTOBNFSFTPMVUJPOBTUIFUJNFPVUEVSBUJPO PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC "EESJOGPGPSFBDIDBMMT"EESJOGPHFUBEESJOGP JOUFSOBMMZXJUIUJNFPVU *O3VCZ

Slide 250

Slide 250 text

def self.tcp_without_fast_fallback( host, port, ..., connect_timeout: nil, resolv_timeout: nil, open_timeout: nil ) # ... timeout = open_timeout ? open_timeout : resolv_timeout starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout: timeout) {|ai| # ... } # ... end JGPQFO@UJNFPVUJTTQFDJ fi FE JUTWBMVFDBOCFQBTTFE BTUIFUJNFPVUWBMVFJOTUFBEPGSFTPMW@UJNFPVU TP UIBUOBNFSFTPMVUJPOUJNFTPVUBUUIFTQFDJ fi FEUJNF PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL 6TFPQFO@UJNFPVUJOTUFBEPGSFTPMW@UJNFPVU 'PS4PDLFUUDQIUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC *O3VCZ "EEFE

Slide 251

Slide 251 text

3FBMMZ

Slide 252

Slide 252 text

:PVNBZBMSFBEZIBWFOPUJDFE

Slide 253

Slide 253 text

"TPG3VCZ

Slide 254

Slide 254 text

UIJOHTIBEBDUVBMMZFOEFEVQUIJTXBZ UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL "1*POMZ "1*POMZ 3VCZ !? !?

Slide 255

Slide 255 text

-FUTSFXJOEUIFDMPDLBOEMPPLCBDLPOUIFEFWFMPQNFOU MFBEJOHVQUP3VCZ UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL "1*POMZ "1*POMZ 3VCZ

Slide 256

Slide 256 text

*O3VCZ UIFJNQMFNFOUBUJPOPGOBNFSFTPMVUJPOUJNFPVUT XBTOPUBEPQUFE BOEPOMZUIF"1*XBTBEEFE UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU "1*POMZ 4PDLFUUDQ5$14PDLFUOFX "1*POMZ 3VCZ

Slide 257

Slide 257 text

*O3VCZ XIJMFJNQSPWFNFOUTXFSFNBEFUPBMMPXOBNFSFTPMVUJPO UPCFJOUFSSVQUFE OBNFSFTPMVUJPOUJNFPVUTXFSFOPUJNQMFNFOUFE UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU "1*POMZ 4PDLFUUDQ5$14PDLFUOFX "1*POMZ 3VCZ

Slide 258

Slide 258 text

5IFO JO3VCZ GBTU@GBMMCBDLXBTJOUSPEVDFE BOEPOMZUIBU JNQMFNFOUBUJPOIBOEMFEOBNFSFTPMVUJPOUJNFPVUT UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL "1*POMZ "1*POMZ 3VCZ

Slide 259

Slide 259 text

8IFOGBTU@GBMMCBDLJTEJTBCMFE  OBNFSFTPMVUJPOUJNFPVUTTUJMMEPOPUXPSL UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL "1*POMZ "1*POMZ 3VCZ

Slide 260

Slide 260 text

4PJOUIJTTUBUF  PQFO@UJNFPVUXPVMEBMTPFOEVQPOMZQBSUJBMMZXPSLJOH UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL "1*POMZ 1BSUJBMMZJOWBMJE "1*POMZ 3VCZEFW

Slide 261

Slide 261 text

-FUTTFFXIBUJUBDUVBMMZNFBOUUIBU POMZUIF"1*GPSUIFOBNFSFTPMVUJPOUJNFPVU IBECFFOBEEFE

Slide 262

Slide 262 text

8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT 4PDLFUUDQ  ➡︎ "EESJOGPHFUBEESJOGP "TCBDLHSPVOE  4PDLFUUDQEFQFOETPO"EESJOGPHFUBEESJOGP

Slide 263

Slide 263 text

4PDLFUUDQ  ➡︎ "EESJOGPHFUBEESJOGP  ➡︎ BEESJOGP@T@HFUBEESJOGP ɹ ➡︎ BEESJOGP@MJTU@OFX ɹ ➡︎ DBMM@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP "EESJOGPHFUBEESJOGPDBMMT STPDL@HFUBEESJOGP JOUFSOBMMZ 8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT

Slide 264

Slide 264 text

4PDLFUUDQ  ➡︎ "EESJOGPHFUBEESJOGP  ➡︎ BEESJOGP@T@HFUBEESJOGP ɹ ➡︎ BEESJOGP@MJTU@OFX ɹ ➡︎ DBMM@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP 5$14PDLFUOFXDBMMT STPDL@HFUBEESJOGP JOUFSOBMMZ UPP 8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT 5$14PDLFUOFX  ➡︎ 5$14PDLFUJOJUJBMJ[F  ➡︎ STPDL@JOJU@JOFUTPDL ɹ ➡︎ JOJU@JOFUTPDL@JOUFSOBM ɹ ➡︎ STPDL@BEESJOGP ɹ ➡︎ STPDL@HFUBEESJOGP

Slide 265

Slide 265 text

4PDLFUUDQ  ➡︎ "EESJOGPHFUBEESJOGP  ➡︎ BEESJOGP@T@HFUBEESJOGP ɹ ➡︎ BEESJOGP@MJTU@OFX ɹ ➡︎ DBMM@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP 8IBUUIFZIBWFJODPNNPO JTUIFDBMMUPSTPDL@HFUBEESJOGP  DPNNPO 8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT 5$14PDLFUOFX  ➡︎ 5$14PDLFUJOJUJBMJ[F  ➡︎ STPDL@JOJU@JOFUTPDL ɹ ➡︎ JOJU@JOFUTPDL@JOUFSOBM ɹ ➡︎ STPDL@BEESJOGP ɹ ➡︎ STPDL@HFUBEESJOGP

Slide 266

Slide 266 text

static struct rb_addrinfo * call_getaddrinfo( VALUE node, VALUE service, VALUE family, VALUE socktype, VALUE protocol, VALUE flags, int socktype_hack, VALUE timeout ) { // ... } 5IFDPEFUIBUDBMMTSTPDL@HFUBEESJOGP  8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD *O3VCZ

Slide 267

Slide 267 text

static struct rb_addrinfo * call_getaddrinfo( VALUE node, VALUE service, VALUE family, VALUE socktype, VALUE protocol, VALUE flags, int socktype_hack, VALUE timeout ) { // ... } 5IFDPEFUIBUDBMMTSTPDL@HFUBEESJOGP  BMSFBEZUBLFTUIFVTFSTQFDJ fi FEUJNFPVUWBMVF BTBOBSHVNFOU 8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT 5IFVTFSTQFDJ fi FEUJNFPVUWBMVF IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD *O3VCZ

Slide 268

Slide 268 text

static struct rb_addrinfo * call_getaddrinfo( VALUE node, VALUE service, VALUE family, VALUE socktype, VALUE protocol, VALUE flags, int socktype_hack, VALUE timeout ) { // ... res = rsock_getaddrinfo(node, service, &hints, socktype_hack); // ... } #VUJOGBDU  JUXBTOPUCFJOHQBTTFEUPSTPDL@HFUBEESJOGP  8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT 5IFWBMVFJTOPUQBTTFE  5IFVTFSTQFDJ fi FEUJNFPVUWBMVF IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD *O3VCZ

Slide 269

Slide 269 text

struct rb_addrinfo* rsock_getaddrinfo( VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack ) { // ... } "OEPOUIFSTPDL@HFUBEESJOGP TJEF UIFSFXBTOP QBSBNFUFSGPSSFDFJWJOHUIFWBMVF5IFVTFSTQFDJ fi FE UJNFPVUWBMVFTJNQMZWBOJTIFEBUUIJTQPJOU 5IFVTFSTQFDJ fi FEUJNFPVUWBMVFDBOOPUCFQBTTFE 8IBUJTIBQQFOJOHXJUIUIFOBNFSFTPMVUJPOUJNFPVUT IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD *O3VCZ

Slide 270

Slide 270 text

'JYUIFOBNFSFTPMVUJPOUJNFPVUT struct rb_addrinfo* rsock_getaddrinfo( VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack VALUE timeout ) { // ... } 4P STPDL@HFUBEESJOGP XBTDIBOHFEUPSFDFJWF UIFVTFSTQFDJ fi FEUJNFPVUWBMVFBTXFMM "EEFE IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD *O3VCZ

Slide 271

Slide 271 text

struct rb_addrinfo* rsock_getaddrinfo( VALUE host, VALUE port, struct addrinfo *hints, int socktype_hack VALUE timeout ) { // ... int t = NIL_P(timeout) ? -1 : rsock_value_timeout_to_msec(timeout); error = rb_getaddrinfo(hostp, portp, hints, &ai, t); // ... } *UUIFOQBTTFTUIBUWBMVFGVSUIFSEPXOUP UIFGVODUJPOJUDBMMTJOUFSOBMMZ 'JYUIFOBNFSFTPMVUJPOUJNFPVUT IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD "EEFE *O3VCZ

Slide 272

Slide 272 text

static void * wait_getaddrinfo(void *ptr) { // ... long msec = arg->timeout; if (msec == 0) { arg->cancelled = 1; arg->timedout = 1; } else if (msec > 0) { rb_native_cond_timedwait(&arg->cond, &arg->lock, msec); if (!arg->done) { arg->cancelled = 1; arg->timedout = 1; } // ... } // ... } 8IFOXBJUJOHGPSOBNFSFTPMVUJPO  JUOPXUFSNJOBUFTUIFXBJUBGUFSUIFTQFDJ fi FEUJNF JGBUJNFPVUWBMVFJTHJWFO 'JYUIFOBNFSFTPMVUJPOUJNFPVUT 8BJUVOUJMUIFOBNFSFTPMVUJPOUJNFPVUFYQJSFT 5IFVTFSTQFDJ fi FEUJNFPVUWBMVF IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUSBEESJOGPD *O3VCZ

Slide 273

Slide 273 text

PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ  ➡︎ "EESJOGPHFUBEESJOGP  ➡︎ BEESJOGP@T@HFUBEESJOGP ɹ ➡︎ BEESJOGP@MJTU@OFX ɹ ➡︎ DBMM@HFUBEESJOGP ɹɹ ➡︎ STPDL@HFUBEESJOGP "TBSFTVMU OBNFSFTPMVUJPODBOOPXUJNFPVUJO 4PDLFUUDQ "EESJOGPHFUBEESJOGP BOE5$14PDLFUOFX 5$14PDLFUOFX  ➡︎ 5$14PDLFUJOJUJBMJ[F  ➡︎ STPDL@JOJU@JOFUTPDL ɹ ➡︎ JOJU@JOFUTPDL@JOUFSOBM ɹ ➡︎ STPDL@BEESJOGP ɹ ➡︎ STPDL@HFUBEESJOGP 'JYFE $BOUJNFPVU

Slide 274

Slide 274 text

5IJTDPNQMFUFTUIF fi STUIBMGPGPQFO@UJNFPVU UIFOBNFSFTPMVUJPOQBSU PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL 4FSWFS 4PDLFUUDQ 5$14PDLFUOFX %/4TFSWFS "UUFNQUUPDPOOFDU 3FTPMWFUIFIPTUOBNF PQFO@UJNFPVU

Slide 275

Slide 275 text

8IBUSFNBJOTJTUIFUJNFPVUGPSDPOOFDUJPOBUUFNQUT PQFO@UJNFPVUOFFETUPUJNFPVUBGUFSBTQFDJ fi FEQFSJPE  SFHBSEMFTTPGUIFOVNCFSPGEFTUJOBUJPOBEESFTTFT 4FSWFS "UUFNQUUPDPOOFDU 4PDLFUUDQ 5$14PDLFUOFX PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL PQFO@UJNFPVU

Slide 276

Slide 276 text

starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout:) {|ai| # ... timeout = if open_timeout t = open_timeout - (current_clock_time - starts_at) t.negative? ? 0 : t # ... end # ... } 4P CFGPSFTUBSUJOHUIFDPOOFDUJPOBUUFNQU  JUPCUBJOTUIFSFNBJOJOHUJNFVOUJM PQFO@UJNFPVUFYQJSFT PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC 5IFSFNBJOJOHUJNFVOUJMPQFO@UJNFPVUFYQJSFT

Slide 277

Slide 277 text

starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout:) {|ai| # ... timeout = if open_timeout t = open_timeout - (current_clock_time - starts_at) t.negative? ? 0 : t # ... end sock = local_addr ? ai.connect_from(local_addr, timeout: timeout) : ai.connect(timeout: timeout) # ... } BOEQBTTFTJUBTUIFUJNFPVUEVSBUJPO GPSUIFDPOOFDUJPOBUUFNQU PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC 8BJUVOUJMUIFUJNFPVUFYQJSFT 5IFSFNBJOJOHUJNFVOUJMPQFO@UJNFPVUFYQJSFT

Slide 278

Slide 278 text

starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout:) {|ai| # ... timeout = if open_timeout t = open_timeout - (current_clock_time - starts_at) t.negative? ? 0 : t # ... end sock = local_addr ? ai.connect_from(local_addr, timeout: timeout) : ai.connect(timeout: timeout) # ... } *GUIBUDPOOFDUJPOBUUFNQUGBJMT UIFSFNBJOJOHUJNFJT VQEBUFECFGPSFUIFOFYUDPOOFDUJPOBUUFNQUJTTUBSUFE PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC 6QEBUFPOSFNBJOJOHUJNFVOUJMUJNFPVU

Slide 279

Slide 279 text

starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout:) {|ai| # ... timeout = if open_timeout t = open_timeout - (current_clock_time - starts_at) t.negative? ? 0 : t # ... end sock = local_addr ? ai.connect_from(local_addr, timeout: timeout) : ai.connect(timeout: timeout) # ... } 0ODFUIFSFNBJOJOHUJNFJTFYIBVTUFE  BUJNFPVUFSSPSJTSBJTFE PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC .VTUCFSBJTFE 6QEBUFPOSFNBJOJOHUJNFVOUJMUJNFPVU

Slide 280

Slide 280 text

starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout:) {|ai| # ... timeout = if open_timeout t = open_timeout - (current_clock_time - starts_at) t.negative? ? 0 : t else connect_timeout end sock = local_addr ? ai.connect_from(local_addr, timeout: timeout) : ai.connect(timeout: timeout) # ... } *GPQFO@UJNFPVUJTOPUTQFDJ fi FE UIFWBMVFPG DPOOFDU@UJNFPVUJTVTFEBTUIFDPOOFDUJPOUJNFPVU 5IJTNBJOUBJOTUIFCFIBWJPSCFGPSFUIFDIBOHF PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL 8BJUVOUJMUIFUJNFPVUFYQJSFT PSJOEF fi OJUFMZ 5IFWBMVFTQFDJ fi FEGPSDPOOFDU@UJNFPVU PSOJM IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 281

Slide 281 text

starts_at = current_clock_time Addrinfo.foreach(host, port, nil, :STREAM, timeout:) {|ai| # ... timeout = if open_timeout t = open_timeout - (current_clock_time - starts_at) t.negative? ? 0 : t else connect_timeout end sock = local_addr ? ai.connect_from(local_addr, timeout: timeout) : ai.connect(timeout: timeout) # ... } 8JUIUIJT PQFO@UJNFPVUJTBMTPDPNQMFUF XIFOGBTU@GBMMCBDLJTEJTBCMFE PQFO@UJNFPVUXJUIPVUGBTU@GBMMCBDL IUUQTHJUIVCDPNSVCZSVCZCMPCSVCZ@@FYUTPDLFUMJCTPDLFUSC

Slide 282

Slide 282 text

"TBSFTVMU FWFOXIFOGBTU@GBMMCBDLJTEJTBCMFE  SFTPMW@UJNFPVUBOEPQFO@UJNFPVUDBOOPXCFVTFE DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL Added Added UJNFPVU "EESJOGPHFUBEESJOGP

Slide 283

Slide 283 text

*OBEEJUJPO UIFUJNFPVUBSHVNFOUPG"EESJOGPHFUBEESJOGP fi OBMMZCFDBNFF ff FDUJWFGPSUIF fi STUUJNFTJODF3VCZ UJNFPVU "EESJOGPHFUBEESJOGP DPOOFDU@UJNFPVU SFTPMW@UJNFPVU PQFO@UJNFPVU 4PDLFUUDQ5$14PDLFUOFX XJUIPVUGBTU@GBMMCBDL 4PDLFUUDQ5$14PDLFUOFX XJUIGBTU@GBMMCBDL fi xed fi xed

Slide 284

Slide 284 text

"GUFSUIFJOUSPEVDUJPOPG PQFO@UJNFPVU

Slide 285

Slide 285 text

3FQMBDF5JNFPVUUJNFPVUXJUI5$14PDLFUPQFO PQFO@UJNFPVU  BQVMMSFRVFTUUPSFNPWFOFUIUUQ`TEFQFOEFODZ POUIFUJNFPVUMJCSBSZXBTDSFBUFECZ!PTZPZV CZPTZPZVIUUQTHJUIVCDPNSVCZOFUIUUQQVMM

Slide 286

Slide 286 text

3FNPWFOFUIUUQ`TEFQFOEFODZPOUIFUJNFPVUMJCSBSZ "GUFSEJTDVTTJPOPOIPXUPQSFTFSWFCBDLXBSEDPNQBUJCJMJUZ BOETFWFSBM fi YFT UIJTDIBOHFXBTJOUSPEVDFEJOUPOFUIUUQ BOEXBTVMUJNBUFMZSFMFBTFEBTOFUIUUQ CZPTZPZVIUUQTHJUIVCDPNSVCZOFUIUUQQVMM CZFSFHPOIUUQTHJUIVCDPNSVCZOFUQSPUPDPMQVMM CZFSFHPOIUUQTHJUIVCDPNSVCZOFUIUUQQVMM

Slide 287

Slide 287 text

3FNPWFOFUIUUQ`TEFQFOEFODZPOUIFUJNFPVUMJCSBSZ 5IJTSFTPMWFEBMPOHTUBOEJOHDPODFSOEBUJOHCBDLUP UIF3VCZEFWFMPQNFOUFSB GSPN(MBTT@TBHB .BTBLJ.BUTVTIJUB IUUQTCVHTSVCZMBOHPSHJTTVFT Currently, we use Timeout in Net::HTTP and other standard libraries. lib/net/http.rb 945 s = Timeout.timeout(@open_timeout, Net::OpenTimeout) { 946 begin 947 TCPSocket.open(conn_address, conn_port, @local_host, @local_port) 948 rescue => e 949 raise e, "Failed to open TCP connection to " + 950 "#{conn_address}:#{conn_port} (#{e.message})" 951 end 952 } 5IFUJNFPVUMJCSBSZTNFUIPE

Slide 288

Slide 288 text

5IFUJNFPVUMJCSBSZXJUI3BDUPS 3VCZ require "timeout" r = Ractor.new do Timeout.timeout(1) do sleep 2 end end r.take 'PSUIFSFDPSE UIFJTTVFCFUXFFO3BDUPSBOEUIFUJNFPVUMJCSBSZ UIBUMFEUPUIFJOUSPEVDUJPOPGPQFO@UJNFPVUXBTSFTPMWFE JO3VCZUISPVHIJNQSPWFNFOUTUP3BDUPS 5PEBZ UIFUJNFPVUMJCSBSZDBOCFVTFEJOTJEFBOPONBJO3BDUPS # => no exception in Ruby 4.0!

Slide 289

Slide 289 text

*ODMPTJOH

Slide 290

Slide 290 text

3VCZJOUSPEVDFEOFXGFBUVSFT TVDIBT3VCZ#PYBOE;+*5

Slide 291

Slide 291 text

"TUIFTFOFXGFBUVSFTBOEJNQSPWFNFOUTTIPX  3VCZJTDPOUJOVJOHUPFWPMWF /FXWFSTJPOTPG3VCZ QBDLFEXJUIOFXDIBOHFT  BMXBZTFYDJUFVT

Slide 292

Slide 292 text

*OUIJTUBML XFFYQMPSFEUIFIJTUPSZPG UIFTPDLFUMJCSBSZUISPVHIUIFMFOTPGUJNFPVUT *UNBZOPUCFBTUPSZUIBUJTPGUFOUPME #VUUIJTGFBUVSFIBTBMTPFWPMWFEPWFSUJNF UISPVHIUIFF ff PSUTPG3VCZJTUTXIPDBSFEEFFQMZ JOFBDIFSBBOEBUFBDINPNFOU

Slide 293

Slide 293 text

5IJTTUPSZ UPP JTQBSUPG3VCZTIJTUPSZ

Slide 294

Slide 294 text

8JUIHSBUJUVEFUPUIF3VCZJTUTXIPIFMQFEXFBWFUIJTTUPSZ 5IF-FTT5PME4UPSZPG4PDLFU5JNFPVUT 4QFDJBMUIBOLTUP !OPSNBMQFSTPO !BLS !(MBTT@TBHB!LJST  !ZBIPOEB !FVHFOFJVT !NBNF !PTZPZV  !OBSVTF !FSFHPOBOE3VCZDPNNVOJUZ