p2p2 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/p2p2/p1.rb +87 -65
- data/lib/p2p2/p2.rb +93 -63
- data/lib/p2p2/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cc570a15e1753229a958258ab7557e30ca3b17de854e2df72e240c9daa245ab
|
4
|
+
data.tar.gz: ef6672ee956bb7065a70bf384f6260b763ccf45a479534c9a196dd8ac6bf73b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6da4e3a19f6cd297aabdc8e11f2e7500bd557810d688d224cb28068c117999b476deeee5de3f4a52da52e3661358967e93b9bcec4ddcf16cea7392103ecff1d4
|
7
|
+
data.tar.gz: b4922aa37ea8e66d591bdf950c899a27ea39c6abf27ae3760cc018b77bf1d7a2ccdca6e228d28c0ab8abc46898c07ee9862fba49505211778ad02e71a4a9bd96
|
data/lib/p2p2/p1.rb
CHANGED
@@ -43,7 +43,7 @@ module P2p2
|
|
43
43
|
@closings = []
|
44
44
|
@socks = {} # object_id => sock
|
45
45
|
@roles = {} # sock => :ctlr / :shadow / :p1
|
46
|
-
@infos = {}
|
46
|
+
@infos = {} # sock => {}
|
47
47
|
|
48
48
|
ctlr, ctlw = IO.pipe
|
49
49
|
@ctlw = ctlw
|
@@ -107,7 +107,7 @@ module P2p2
|
|
107
107
|
sock = @socks[ sock_id ]
|
108
108
|
|
109
109
|
if sock
|
110
|
-
puts "ctlr close #{ sock_id } #{ Time.new }"
|
110
|
+
# puts "debug ctlr close #{ sock_id } #{ Time.new }"
|
111
111
|
add_closing( sock )
|
112
112
|
end
|
113
113
|
when CTL_RESUME
|
@@ -165,26 +165,27 @@ module P2p2
|
|
165
165
|
#
|
166
166
|
def read_p1( p1 )
|
167
167
|
data, addrinfo, rflags, *controls = p1.recvmsg
|
168
|
+
sockaddr = addrinfo.to_sockaddr
|
168
169
|
now = Time.new
|
169
170
|
info = @infos[ p1 ]
|
170
|
-
info[ :last_coming_at ] = now
|
171
171
|
app_id = data[ 0, 8 ].unpack( 'Q>' ).first
|
172
172
|
|
173
173
|
if app_id == 0
|
174
174
|
case data[ 8 ].unpack( 'C' ).first
|
175
175
|
when PEER_ADDR
|
176
|
-
return if
|
176
|
+
return if sockaddr != @p2pd_sockaddr
|
177
177
|
|
178
178
|
unless info[ :p2_addr ]
|
179
179
|
# puts "debug peer addr #{ data[ 9..-1 ].inspect } #{ Time.new }"
|
180
180
|
info[ :p2_addr ] = data[ 9..-1 ]
|
181
|
+
info[ :last_traffic_at ] = now
|
181
182
|
loop_send_status( p1 )
|
182
183
|
end
|
183
184
|
|
184
185
|
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
185
186
|
send_pack( p1, ctlmsg, info[ :p2_addr ] )
|
186
187
|
when A_NEW_APP
|
187
|
-
return
|
188
|
+
return if sockaddr != info[ :p2_addr ]
|
188
189
|
|
189
190
|
app_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
190
191
|
shadow_id = info[ :app_ids ][ app_id ]
|
@@ -203,16 +204,15 @@ module P2p2
|
|
203
204
|
@socks[ shadow_id ] = shadow
|
204
205
|
@roles[ shadow ] = :shadow
|
205
206
|
@infos[ shadow ] = {
|
206
|
-
wbuff: '', # 写前缓存
|
207
|
-
cache: '', # 块读出缓存
|
208
|
-
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
209
|
-
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
210
207
|
p1: p1
|
211
208
|
}
|
212
209
|
|
213
|
-
info[ :shadows ] << shadow
|
214
210
|
info[ :shadow_exts ][ shadow_id ] = {
|
215
211
|
shadow: shadow,
|
212
|
+
wbuff: '', # 写前缓存
|
213
|
+
cache: '', # 块读出缓存
|
214
|
+
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
215
|
+
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
216
216
|
wmems: {}, # 写后缓存 pack_id => data
|
217
217
|
send_ats: {}, # 上一次发出时间 pack_id => send_at
|
218
218
|
biggest_pack_id: 0, # 发到几
|
@@ -222,7 +222,7 @@ module P2p2
|
|
222
222
|
is_app_closed: false, # 对面是否已关闭
|
223
223
|
biggest_app_pack_id: 0, # 对面发到几
|
224
224
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
225
|
-
last_traffic_at: nil #
|
225
|
+
last_traffic_at: nil # 有收到有效流量,或者发出流量的时间戳
|
226
226
|
}
|
227
227
|
info[ :app_ids ][ app_id ] = shadow_id
|
228
228
|
add_read( shadow )
|
@@ -238,6 +238,8 @@ module P2p2
|
|
238
238
|
# puts "debug send PAIRED #{ app_id } #{ shadow_id } #{ Time.new }"
|
239
239
|
send_pack( p1, ctlmsg, info[ :p2_addr ] )
|
240
240
|
when APP_STATUS
|
241
|
+
return if sockaddr != info[ :p2_addr ]
|
242
|
+
|
241
243
|
app_id, biggest_app_pack_id, continue_shadow_pack_id = data[ 9, 24 ].unpack( 'Q>Q>Q>' )
|
242
244
|
shadow_id = info[ :app_ids ][ app_id ]
|
243
245
|
return unless shadow_id
|
@@ -298,6 +300,8 @@ module P2p2
|
|
298
300
|
end
|
299
301
|
end
|
300
302
|
when MISS
|
303
|
+
return if sockaddr != info[ :p2_addr ]
|
304
|
+
|
301
305
|
shadow_id, pack_id_begin, pack_id_end = data[ 9, 24 ].unpack( 'Q>Q>Q>' )
|
302
306
|
ext = info[ :shadow_exts ][ shadow_id ]
|
303
307
|
return unless ext
|
@@ -314,6 +318,8 @@ module P2p2
|
|
314
318
|
|
315
319
|
add_write( p1 )
|
316
320
|
when FIN1
|
321
|
+
return if sockaddr != info[ :p2_addr ]
|
322
|
+
|
317
323
|
app_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
318
324
|
ctlmsg = [
|
319
325
|
0,
|
@@ -332,10 +338,14 @@ module P2p2
|
|
332
338
|
|
333
339
|
ext[ :is_app_closed ] = true
|
334
340
|
when GOT_FIN1
|
341
|
+
return if sockaddr != info[ :p2_addr ]
|
342
|
+
|
335
343
|
# puts "debug 1-2. recv got_fin1 -> break loop #{ Time.new }"
|
336
344
|
shadow_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
337
345
|
info[ :fin1s ].delete( shadow_id )
|
338
346
|
when FIN2
|
347
|
+
return if sockaddr != info[ :p2_addr ]
|
348
|
+
|
339
349
|
# puts "debug 1-3. recv fin2 -> send got_fin2 -> del ext #{ Time.new }"
|
340
350
|
app_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
341
351
|
ctlmsg = [
|
@@ -349,12 +359,16 @@ module P2p2
|
|
349
359
|
shadow_id = info[ :app_ids ].delete( app_id )
|
350
360
|
return unless shadow_id
|
351
361
|
|
352
|
-
info
|
362
|
+
del_shadow_ext( info, shadow_id )
|
353
363
|
when GOT_FIN2
|
364
|
+
return if sockaddr != info[ :p2_addr ]
|
365
|
+
|
354
366
|
# puts "debug 2-4. recv got_fin2 -> break loop #{ Time.new }"
|
355
367
|
shadow_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
356
368
|
info[ :fin2s ].delete( shadow_id )
|
357
369
|
when P2_FIN
|
370
|
+
return if sockaddr != info[ :p2_addr ]
|
371
|
+
|
358
372
|
puts "recv p2 fin #{ Time.new }"
|
359
373
|
add_closing( p1 )
|
360
374
|
end
|
@@ -386,22 +400,21 @@ module P2p2
|
|
386
400
|
end
|
387
401
|
|
388
402
|
ext[ :continue_app_pack_id ] = pack_id
|
389
|
-
ext[ :
|
390
|
-
|
391
|
-
shadow_info = @infos[ ext[ :shadow ] ]
|
392
|
-
shadow_info[ :wbuff ] << data
|
403
|
+
ext[ :wbuff ] << data
|
393
404
|
|
394
|
-
if
|
395
|
-
spring =
|
405
|
+
if ext[ :wbuff ].bytesize >= CHUNK_SIZE
|
406
|
+
spring = ext[ :chunks ].size > 0 ? ( ext[ :spring ] + 1 ) : 0
|
396
407
|
filename = "#{ shadow_id }.#{ spring }"
|
397
408
|
chunk_path = File.join( @shadow_chunk_dir, filename )
|
398
|
-
IO.binwrite( chunk_path,
|
399
|
-
|
400
|
-
|
401
|
-
|
409
|
+
IO.binwrite( chunk_path, ext[ :wbuff ] )
|
410
|
+
ext[ :chunks ] << filename
|
411
|
+
ext[ :spring ] = spring
|
412
|
+
ext[ :wbuff ].clear
|
402
413
|
end
|
403
414
|
|
404
415
|
add_write( ext[ :shadow ] )
|
416
|
+
ext[ :last_traffic_at ] = now
|
417
|
+
info[ :last_traffic_at ] = now
|
405
418
|
else
|
406
419
|
ext[ :pieces ][ pack_id ] = data
|
407
420
|
end
|
@@ -417,14 +430,23 @@ module P2p2
|
|
417
430
|
end
|
418
431
|
|
419
432
|
info = @infos[ shadow ]
|
433
|
+
p1 = info[ :p1 ]
|
434
|
+
|
435
|
+
if p1.closed?
|
436
|
+
add_closing( shadow )
|
437
|
+
return
|
438
|
+
end
|
439
|
+
|
440
|
+
p1_info = @infos[ p1 ]
|
441
|
+
ext = p1_info[ :shadow_exts ][ shadow.object_id ]
|
420
442
|
|
421
443
|
# 取写前
|
422
|
-
data =
|
444
|
+
data = ext[ :cache ]
|
423
445
|
from = :cache
|
424
446
|
|
425
447
|
if data.empty?
|
426
|
-
if
|
427
|
-
path = File.join( @shadow_chunk_dir,
|
448
|
+
if ext[ :chunks ].any?
|
449
|
+
path = File.join( @shadow_chunk_dir, ext[ :chunks ].shift )
|
428
450
|
|
429
451
|
begin
|
430
452
|
data = IO.binread( path )
|
@@ -434,22 +456,12 @@ module P2p2
|
|
434
456
|
return
|
435
457
|
end
|
436
458
|
else
|
437
|
-
data =
|
459
|
+
data = ext[ :wbuff ]
|
438
460
|
from = :wbuff
|
439
461
|
end
|
440
462
|
end
|
441
463
|
|
442
464
|
if data.empty?
|
443
|
-
p1 = info[ :p1 ]
|
444
|
-
|
445
|
-
if p1.closed?
|
446
|
-
add_closing( shadow )
|
447
|
-
return
|
448
|
-
end
|
449
|
-
|
450
|
-
p1_info = @infos[ p1 ]
|
451
|
-
ext = p1_info[ :shadow_exts ][ shadow.object_id ]
|
452
|
-
|
453
465
|
if ext[ :is_app_closed ] && ( ext[ :biggest_app_pack_id ] == ext[ :continue_app_pack_id ] )
|
454
466
|
# puts "debug 2-2. all sent && ext.biggest_app_pack_id == ext.continue_app_pack_id -> add closing shadow #{ Time.new }"
|
455
467
|
add_closing( shadow )
|
@@ -463,7 +475,7 @@ module P2p2
|
|
463
475
|
begin
|
464
476
|
written = shadow.write_nonblock( data )
|
465
477
|
rescue IO::WaitWritable, Errno::EINTR => e
|
466
|
-
|
478
|
+
ext[ from ] = data
|
467
479
|
return
|
468
480
|
rescue Exception => e
|
469
481
|
add_closing( shadow )
|
@@ -471,7 +483,7 @@ module P2p2
|
|
471
483
|
end
|
472
484
|
|
473
485
|
data = data[ written..-1 ]
|
474
|
-
|
486
|
+
ext[ from ] = data
|
475
487
|
end
|
476
488
|
|
477
489
|
##
|
@@ -498,6 +510,7 @@ module P2p2
|
|
498
510
|
if pack
|
499
511
|
send_pack( p1, pack, info[ :p2_addr ] )
|
500
512
|
ext[ :last_traffic_at ] = now
|
513
|
+
info[ :last_traffic_at ] = now
|
501
514
|
return
|
502
515
|
end
|
503
516
|
end
|
@@ -560,6 +573,7 @@ module P2p2
|
|
560
573
|
ext[ :wmems ][ pack_id ] = pack
|
561
574
|
ext[ :send_ats ][ pack_id ] = now
|
562
575
|
ext[ :last_traffic_at ] = now
|
576
|
+
info[ :last_traffic_at ] = now
|
563
577
|
end
|
564
578
|
end
|
565
579
|
|
@@ -575,13 +589,12 @@ module P2p2
|
|
575
589
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
576
590
|
p2_addr: nil, # 远端地址
|
577
591
|
app_ids: {}, # app_id => shadow_id
|
578
|
-
|
579
|
-
shadow_exts: {}, # 传输相关 shadow_id => {}
|
592
|
+
shadow_exts: {}, # 长命信息 shadow_id => {}
|
580
593
|
fin1s: [], # fin1: shadow已关闭,等待对面收完流量 shadow_id
|
581
594
|
fin2s: [], # fin2: 流量已收完 shadow_id
|
582
|
-
last_coming_at: nil, # 上一次来流量的时间
|
583
595
|
paused: false, # 是否暂停写
|
584
|
-
resendings: []
|
596
|
+
resendings: [], # 重传队列 [ shadow_id, pack_id ]
|
597
|
+
last_traffic_at: nil # 有收到有效流量,或者发出流量的时间戳
|
585
598
|
}
|
586
599
|
|
587
600
|
@p1 = p1
|
@@ -604,13 +617,15 @@ module P2p2
|
|
604
617
|
|
605
618
|
p1_info = @infos[ p1 ]
|
606
619
|
|
607
|
-
if p1_info[ :p2_addr ].nil? || ( Time.new - p1_info[ :
|
620
|
+
if p1_info[ :p2_addr ].nil? || ( Time.new - p1_info[ :last_traffic_at ] > EXPIRE_AFTER )
|
608
621
|
@mutex.synchronize do
|
609
622
|
@ctlw.write( [ CTL_CLOSE, p1.object_id ].pack( 'CQ>' ) )
|
610
623
|
end
|
611
624
|
else
|
612
|
-
|
613
|
-
|
625
|
+
@mutex.synchronize do
|
626
|
+
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
627
|
+
send_pack( p1, ctlmsg, p1_info[ :p2_addr ] )
|
628
|
+
end
|
614
629
|
end
|
615
630
|
end
|
616
631
|
end
|
@@ -664,6 +679,7 @@ module P2p2
|
|
664
679
|
break if p1.closed?
|
665
680
|
|
666
681
|
p1_info = @infos[ p1 ]
|
682
|
+
break unless p1_info[ :p2_addr ]
|
667
683
|
|
668
684
|
unless p1_info[ :fin1s ].include?( shadow_id )
|
669
685
|
# puts "debug break send fin1 loop #{ Time.new }"
|
@@ -692,6 +708,7 @@ module P2p2
|
|
692
708
|
break if p1.closed?
|
693
709
|
|
694
710
|
p1_info = @infos[ p1 ]
|
711
|
+
break unless p1_info[ :p2_addr ]
|
695
712
|
|
696
713
|
unless p1_info[ :fin2s ].include?( shadow_id )
|
697
714
|
# puts "debug break send fin2 loop #{ Time.new }"
|
@@ -744,7 +761,15 @@ module P2p2
|
|
744
761
|
|
745
762
|
def close_p1( p1 )
|
746
763
|
info = close_sock( p1 )
|
747
|
-
|
764
|
+
|
765
|
+
info[ :chunks ].each do | filename |
|
766
|
+
begin
|
767
|
+
File.delete( File.join( @p1_chunk_dir, filename ) )
|
768
|
+
rescue Errno::ENOENT
|
769
|
+
end
|
770
|
+
end
|
771
|
+
|
772
|
+
info[ :shadow_exts ].each{ | _, ext | add_closing( ext[ :shadow ] ) }
|
748
773
|
end
|
749
774
|
|
750
775
|
def close_shadow( shadow )
|
@@ -752,28 +777,23 @@ module P2p2
|
|
752
777
|
p1 = info[ :p1 ]
|
753
778
|
return if p1.closed?
|
754
779
|
|
755
|
-
p1_info = @infos[ p1 ]
|
756
|
-
p1_info[ :shadows ].delete( shadow )
|
757
780
|
shadow_id = shadow.object_id
|
781
|
+
p1_info = @infos[ p1 ]
|
758
782
|
ext = p1_info[ :shadow_exts ][ shadow_id ]
|
759
783
|
return unless ext
|
760
784
|
|
761
785
|
if ext[ :is_app_closed ]
|
762
|
-
|
763
|
-
p1_info[ :app_ids ].delete( ext[ :app_id ] )
|
764
|
-
p1_info[ :shadow_exts ].delete( shadow_id )
|
786
|
+
del_shadow_ext( p1_info, shadow_id )
|
765
787
|
|
766
788
|
unless p1_info[ :fin2s ].include?( shadow_id )
|
789
|
+
# puts "debug 2-3. shadow.close -> ext.is_app_closed ? yes -> del ext -> loop send fin2 #{ Time.new }"
|
767
790
|
p1_info[ :fin2s ] << shadow_id
|
768
791
|
loop_send_fin2( p1, shadow_id )
|
769
792
|
end
|
770
|
-
|
793
|
+
elsif !p1_info[ :fin1s ].include?( shadow_id )
|
771
794
|
# puts "debug 1-1. shadow.close -> ext.is_app_closed ? no -> send fin1 loop #{ Time.new }"
|
772
|
-
|
773
|
-
|
774
|
-
p1_info[ :fin1s ] << shadow_id
|
775
|
-
loop_send_fin1( p1, shadow_id )
|
776
|
-
end
|
795
|
+
p1_info[ :fin1s ] << shadow_id
|
796
|
+
loop_send_fin1( p1, shadow_id )
|
777
797
|
end
|
778
798
|
end
|
779
799
|
|
@@ -783,21 +803,23 @@ module P2p2
|
|
783
803
|
@writes.delete( sock )
|
784
804
|
@closings.delete( sock )
|
785
805
|
@socks.delete( sock.object_id )
|
786
|
-
|
787
|
-
|
806
|
+
@roles.delete( sock )
|
807
|
+
@infos.delete( sock )
|
808
|
+
end
|
788
809
|
|
789
|
-
|
790
|
-
|
810
|
+
def del_shadow_ext( p1_info, shadow_id )
|
811
|
+
ext = p1_info[ :shadow_exts ].delete( shadow_id )
|
791
812
|
|
792
|
-
|
813
|
+
if ext
|
814
|
+
p1_info[ :app_ids ].delete( ext[ :app_id ] )
|
815
|
+
|
816
|
+
ext[ :chunks ].each do | filename |
|
793
817
|
begin
|
794
|
-
File.delete( File.join(
|
818
|
+
File.delete( File.join( @shadow_chunk_dir, filename ) )
|
795
819
|
rescue Errno::ENOENT
|
796
820
|
end
|
797
821
|
end
|
798
822
|
end
|
799
|
-
|
800
|
-
info
|
801
823
|
end
|
802
824
|
|
803
825
|
end
|
data/lib/p2p2/p2.rb
CHANGED
@@ -43,7 +43,7 @@ module P2p2
|
|
43
43
|
@closings = []
|
44
44
|
@socks = {} # object_id => sock
|
45
45
|
@roles = {} # sock => :ctlr / :appd / :app / :p2
|
46
|
-
@infos = {}
|
46
|
+
@infos = {} # sock => {}
|
47
47
|
|
48
48
|
ctlr, ctlw = IO.pipe
|
49
49
|
@ctlw = ctlw
|
@@ -110,7 +110,7 @@ module P2p2
|
|
110
110
|
sock = @socks[ sock_id ]
|
111
111
|
|
112
112
|
if sock
|
113
|
-
puts "ctlr close #{ sock_id } #{ Time.new }"
|
113
|
+
# puts "debug ctlr close #{ sock_id } #{ Time.new }"
|
114
114
|
add_closing( sock )
|
115
115
|
end
|
116
116
|
when CTL_RESUME
|
@@ -139,16 +139,15 @@ module P2p2
|
|
139
139
|
@socks[ app_id ] = app
|
140
140
|
@roles[ app ] = :app
|
141
141
|
@infos[ app ] = {
|
142
|
-
wbuff: '', # 写前缓存
|
143
|
-
cache: '', # 块读出缓存
|
144
|
-
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
145
|
-
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
146
142
|
p2: @p2
|
147
143
|
}
|
148
144
|
|
149
|
-
@p2_info[ :apps ] << app
|
150
145
|
@p2_info[ :app_exts ][ app_id ] = {
|
151
146
|
app: app,
|
147
|
+
wbuff: '', # 写前缓存
|
148
|
+
cache: '', # 块读出缓存
|
149
|
+
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
150
|
+
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
152
151
|
wmems: {}, # 写后缓存 pack_id => data
|
153
152
|
send_ats: {}, # 上一次发出时间 pack_id => send_at
|
154
153
|
biggest_pack_id: 0, # 发到几
|
@@ -158,7 +157,7 @@ module P2p2
|
|
158
157
|
is_shadow_closed: false, # 对面是否已关闭
|
159
158
|
biggest_shadow_pack_id: 0, # 对面发到几
|
160
159
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
161
|
-
last_traffic_at: nil #
|
160
|
+
last_traffic_at: nil # 有收到有效流量,或者发出流量的时间戳
|
162
161
|
}
|
163
162
|
|
164
163
|
add_read( app )
|
@@ -209,25 +208,28 @@ module P2p2
|
|
209
208
|
#
|
210
209
|
def read_p2( p2 )
|
211
210
|
data, addrinfo, rflags, *controls = p2.recvmsg
|
211
|
+
sockaddr = addrinfo.to_sockaddr
|
212
212
|
now = Time.new
|
213
213
|
info = @infos[ p2 ]
|
214
|
-
info[ :last_coming_at ] = now
|
215
214
|
shadow_id = data[ 0, 8 ].unpack( 'Q>' ).first
|
216
215
|
|
217
216
|
if shadow_id == 0
|
218
217
|
case data[ 8 ].unpack( 'C' ).first
|
219
218
|
when PEER_ADDR
|
220
|
-
return if
|
219
|
+
return if sockaddr != @p2pd_sockaddr
|
221
220
|
|
222
221
|
unless info[ :p1_addr ]
|
223
222
|
# puts "debug peer addr #{ data[ 9..-1 ].inspect } #{ Time.new }"
|
224
223
|
info[ :p1_addr ] = data[ 9..-1 ]
|
224
|
+
info[ :last_traffic_at ] = now
|
225
225
|
loop_send_status( p2 )
|
226
226
|
end
|
227
227
|
|
228
228
|
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
229
229
|
send_pack( p2, ctlmsg, info[ :p1_addr ] )
|
230
230
|
when PAIRED
|
231
|
+
return if sockaddr != info[ :p1_addr ]
|
232
|
+
|
231
233
|
app_id, shadow_id = data[ 9, 16 ].unpack( 'Q>Q>' )
|
232
234
|
# puts "debug got PAIRED #{ app_id } #{ shadow_id } #{ Time.new }"
|
233
235
|
|
@@ -237,6 +239,8 @@ module P2p2
|
|
237
239
|
ext[ :shadow_id ] = shadow_id
|
238
240
|
info[ :shadow_ids ][ shadow_id ] = app_id
|
239
241
|
when SHADOW_STATUS
|
242
|
+
return if sockaddr != info[ :p1_addr ]
|
243
|
+
|
240
244
|
shadow_id, biggest_shadow_pack_id, continue_app_pack_id = data[ 9, 24 ].unpack( 'Q>Q>Q>' )
|
241
245
|
app_id = info[ :shadow_ids ][ shadow_id ]
|
242
246
|
return unless app_id
|
@@ -297,6 +301,8 @@ module P2p2
|
|
297
301
|
end
|
298
302
|
end
|
299
303
|
when MISS
|
304
|
+
return if sockaddr != info[ :p1_addr ]
|
305
|
+
|
300
306
|
app_id, pack_id_begin, pack_id_end = data[ 9, 24 ].unpack( 'Q>Q>Q>' )
|
301
307
|
ext = info[ :app_exts ][ app_id ]
|
302
308
|
return unless ext
|
@@ -313,6 +319,8 @@ module P2p2
|
|
313
319
|
|
314
320
|
add_write( p2 )
|
315
321
|
when FIN1
|
322
|
+
return if sockaddr != info[ :p1_addr ]
|
323
|
+
|
316
324
|
shadow_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
317
325
|
ctlmsg = [
|
318
326
|
0,
|
@@ -331,10 +339,14 @@ module P2p2
|
|
331
339
|
|
332
340
|
ext[ :is_shadow_closed ] = true
|
333
341
|
when GOT_FIN1
|
342
|
+
return if sockaddr != info[ :p1_addr ]
|
343
|
+
|
334
344
|
# puts "debug 1-2. recv got_fin1 -> break loop #{ Time.new }"
|
335
345
|
app_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
336
346
|
info[ :fin1s ].delete( app_id )
|
337
347
|
when FIN2
|
348
|
+
return if sockaddr != info[ :p1_addr ]
|
349
|
+
|
338
350
|
# puts "debug 1-3. recv fin2 -> send got_fin2 -> del ext #{ Time.new }"
|
339
351
|
shadow_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
340
352
|
ctlmsg = [
|
@@ -348,12 +360,15 @@ module P2p2
|
|
348
360
|
app_id = info[ :shadow_ids ].delete( shadow_id )
|
349
361
|
return unless app_id
|
350
362
|
|
351
|
-
info
|
363
|
+
del_app_ext( info, app_id )
|
352
364
|
when GOT_FIN2
|
365
|
+
return if sockaddr != info[ :p1_addr ]
|
366
|
+
|
353
367
|
# puts "debug 2-4. recv got_fin2 -> break loop #{ Time.new }"
|
354
368
|
app_id = data[ 9, 8 ].unpack( 'Q>' ).first
|
355
369
|
info[ :fin2s ].delete( app_id )
|
356
370
|
when P1_FIN
|
371
|
+
return if sockaddr != info[ :p1_addr ]
|
357
372
|
raise "recv p1 fin #{ Time.new }"
|
358
373
|
end
|
359
374
|
|
@@ -384,22 +399,21 @@ module P2p2
|
|
384
399
|
end
|
385
400
|
|
386
401
|
ext[ :continue_shadow_pack_id ] = pack_id
|
387
|
-
ext[ :
|
388
|
-
|
389
|
-
app_info = @infos[ ext[ :app ] ]
|
390
|
-
app_info[ :wbuff ] << data
|
402
|
+
ext[ :wbuff ] << data
|
391
403
|
|
392
|
-
if
|
393
|
-
spring =
|
404
|
+
if ext[ :wbuff ].bytesize >= CHUNK_SIZE
|
405
|
+
spring = ext[ :chunks ].size > 0 ? ( ext[ :spring ] + 1 ) : 0
|
394
406
|
filename = "#{ app_id }.#{ spring }"
|
395
407
|
chunk_path = File.join( @app_chunk_dir, filename )
|
396
|
-
IO.binwrite( chunk_path,
|
397
|
-
|
398
|
-
|
399
|
-
|
408
|
+
IO.binwrite( chunk_path, ext[ :wbuff ] )
|
409
|
+
ext[ :chunks ] << filename
|
410
|
+
ext[ :spring ] = spring
|
411
|
+
ext[ :wbuff ].clear
|
400
412
|
end
|
401
413
|
|
402
414
|
add_write( ext[ :app ] )
|
415
|
+
ext[ :last_traffic_at ] = now
|
416
|
+
info[ :last_traffic_at ] = now
|
403
417
|
else
|
404
418
|
ext[ :pieces ][ pack_id ] = data
|
405
419
|
end
|
@@ -415,14 +429,23 @@ module P2p2
|
|
415
429
|
end
|
416
430
|
|
417
431
|
info = @infos[ app ]
|
432
|
+
p2 = info[ :p2 ]
|
433
|
+
|
434
|
+
if p2.closed?
|
435
|
+
add_closing( app )
|
436
|
+
return
|
437
|
+
end
|
438
|
+
|
439
|
+
p2_info = @infos[ p2 ]
|
440
|
+
ext = p2_info[ :app_exts ][ app.object_id ]
|
418
441
|
|
419
442
|
# 取写前
|
420
|
-
data =
|
443
|
+
data = ext[ :cache ]
|
421
444
|
from = :cache
|
422
445
|
|
423
446
|
if data.empty?
|
424
|
-
if
|
425
|
-
path = File.join( @app_chunk_dir,
|
447
|
+
if ext[ :chunks ].any?
|
448
|
+
path = File.join( @app_chunk_dir, ext[ :chunks ].shift )
|
426
449
|
|
427
450
|
begin
|
428
451
|
data = IO.binread( path )
|
@@ -432,22 +455,12 @@ module P2p2
|
|
432
455
|
return
|
433
456
|
end
|
434
457
|
else
|
435
|
-
data =
|
458
|
+
data = ext[ :wbuff ]
|
436
459
|
from = :wbuff
|
437
460
|
end
|
438
461
|
end
|
439
462
|
|
440
463
|
if data.empty?
|
441
|
-
p2 = info[ :p2 ]
|
442
|
-
|
443
|
-
if p2.closed?
|
444
|
-
add_closing( app )
|
445
|
-
return
|
446
|
-
end
|
447
|
-
|
448
|
-
p2_info = @infos[ p2 ]
|
449
|
-
ext = p2_info[ :app_exts ][ app.object_id ]
|
450
|
-
|
451
464
|
if ext[ :is_shadow_closed ] && ( ext[ :biggest_shadow_pack_id ] == ext[ :continue_shadow_pack_id ] )
|
452
465
|
# puts "debug 2-2. all sent && ext.biggest_shadow_pack_id == ext.continue_shadow_pack_id -> add closing app #{ Time.new }"
|
453
466
|
add_closing( app )
|
@@ -461,7 +474,7 @@ module P2p2
|
|
461
474
|
begin
|
462
475
|
written = app.write_nonblock( data )
|
463
476
|
rescue IO::WaitWritable, Errno::EINTR => e
|
464
|
-
|
477
|
+
ext[ from ] = data
|
465
478
|
return
|
466
479
|
rescue Exception => e
|
467
480
|
add_closing( app )
|
@@ -469,7 +482,7 @@ module P2p2
|
|
469
482
|
end
|
470
483
|
|
471
484
|
data = data[ written..-1 ]
|
472
|
-
|
485
|
+
ext[ from ] = data
|
473
486
|
end
|
474
487
|
|
475
488
|
##
|
@@ -496,6 +509,7 @@ module P2p2
|
|
496
509
|
if pack
|
497
510
|
send_pack( p2, pack, info[ :p1_addr ] )
|
498
511
|
ext[ :last_traffic_at ] = now
|
512
|
+
info[ :last_traffic_at ] = now
|
499
513
|
return
|
500
514
|
end
|
501
515
|
end
|
@@ -558,6 +572,7 @@ module P2p2
|
|
558
572
|
ext[ :wmems ][ pack_id ] = pack
|
559
573
|
ext[ :send_ats ][ pack_id ] = now
|
560
574
|
ext[ :last_traffic_at ] = now
|
575
|
+
info[ :last_traffic_at ] = now
|
561
576
|
end
|
562
577
|
end
|
563
578
|
|
@@ -584,13 +599,12 @@ module P2p2
|
|
584
599
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
585
600
|
p1_addr: nil, # 远端地址
|
586
601
|
shadow_ids: {}, # shadow_id => app_id
|
587
|
-
apps: [], # 开着的app
|
588
602
|
app_exts: {}, # 传输相关 app_id => {}
|
589
603
|
fin1s: [], # fin1: app已关闭,等待对面收完流量 app_id
|
590
604
|
fin2s: [], # fin2: 流量已收完 app_id
|
591
|
-
last_coming_at: nil, # 上一次来流量的时间
|
592
605
|
paused: false, # 是否暂停写
|
593
|
-
resendings: []
|
606
|
+
resendings: [], # 重传队列 [ app_id, pack_id ]
|
607
|
+
last_traffic_at: nil # 有收到有效流量,或者发出流量的时间戳
|
594
608
|
}
|
595
609
|
|
596
610
|
@p2 = p2
|
@@ -613,13 +627,15 @@ module P2p2
|
|
613
627
|
|
614
628
|
p2_info = @infos[ p2 ]
|
615
629
|
|
616
|
-
if p2_info[ :p1_addr ].nil? || ( Time.new - p2_info[ :
|
630
|
+
if p2_info[ :p1_addr ].nil? || ( Time.new - p2_info[ :last_traffic_at ] > EXPIRE_AFTER )
|
617
631
|
@mutex.synchronize do
|
618
632
|
@ctlw.write( [ CTL_CLOSE_SOCK, [ p2.object_id ].pack( 'Q>' ) ].join )
|
619
633
|
end
|
620
634
|
else
|
621
|
-
|
622
|
-
|
635
|
+
@mutex.synchronize do
|
636
|
+
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
637
|
+
send_pack( p2, ctlmsg, p2_info[ :p1_addr ] )
|
638
|
+
end
|
623
639
|
end
|
624
640
|
end
|
625
641
|
end
|
@@ -673,6 +689,7 @@ module P2p2
|
|
673
689
|
break if p2.closed?
|
674
690
|
|
675
691
|
p2_info = @infos[ p2 ]
|
692
|
+
break unless p2_info[ :p1_addr ]
|
676
693
|
|
677
694
|
unless p2_info[ :fin1s ].include?( app_id )
|
678
695
|
# puts "debug break send fin1 loop #{ Time.new }"
|
@@ -701,6 +718,7 @@ module P2p2
|
|
701
718
|
break if p2.closed?
|
702
719
|
|
703
720
|
p2_info = @infos[ p2 ]
|
721
|
+
break unless p2_info[ :p1_addr ]
|
704
722
|
|
705
723
|
unless p2_info[ :fin2s ].include?( app_id )
|
706
724
|
# puts "debug break send fin2 loop #{ Time.new }"
|
@@ -784,7 +802,15 @@ module P2p2
|
|
784
802
|
|
785
803
|
def close_p2( p2 )
|
786
804
|
info = close_sock( p2 )
|
787
|
-
|
805
|
+
|
806
|
+
info[ :chunks ].each do | filename |
|
807
|
+
begin
|
808
|
+
File.delete( File.join( @p2_chunk_dir, filename ) )
|
809
|
+
rescue Errno::ENOENT
|
810
|
+
end
|
811
|
+
end
|
812
|
+
|
813
|
+
info[ :app_exts ].each{ | app_id, ext | add_closing( ext[ :app ] ) }
|
788
814
|
end
|
789
815
|
|
790
816
|
def close_app( app )
|
@@ -792,28 +818,30 @@ module P2p2
|
|
792
818
|
p2 = info[ :p2 ]
|
793
819
|
return if p2.closed?
|
794
820
|
|
795
|
-
p2_info = @infos[ p2 ]
|
796
|
-
p2_info[ :apps ].delete( app )
|
797
821
|
app_id = app.object_id
|
822
|
+
p2_info = @infos[ p2 ]
|
798
823
|
ext = p2_info[ :app_exts ][ app_id ]
|
799
824
|
return unless ext
|
800
825
|
|
826
|
+
ext[ :chunks ].each do | filename |
|
827
|
+
begin
|
828
|
+
File.delete( File.join( @app_chunk_dir, filename ) )
|
829
|
+
rescue Errno::ENOENT
|
830
|
+
end
|
831
|
+
end
|
832
|
+
|
801
833
|
if ext[ :is_shadow_closed ]
|
802
|
-
|
803
|
-
p2_info[ :shadow_ids ].delete( ext[ :shadow_id ] )
|
804
|
-
p2_info[ :app_exts ].delete( app_id )
|
834
|
+
del_app_ext( p2_info, app_id )
|
805
835
|
|
806
836
|
unless p2_info[ :fin2s ].include?( app_id )
|
837
|
+
# puts "debug 2-3. app.close -> ext.is_shadow_closed ? yes -> del ext -> loop send fin2 #{ Time.new }"
|
807
838
|
p2_info[ :fin2s ] << app_id
|
808
839
|
loop_send_fin2( p2, app_id )
|
809
840
|
end
|
810
|
-
|
841
|
+
elsif !p2_info[ :fin1s ].include?( app_id )
|
811
842
|
# puts "debug 1-1. app.close -> ext.is_shadow_closed ? no -> send fin1 loop #{ Time.new }"
|
812
|
-
|
813
|
-
|
814
|
-
p2_info[ :fin1s ] << app_id
|
815
|
-
loop_send_fin1( p2, app_id )
|
816
|
-
end
|
843
|
+
p2_info[ :fin1s ] << app_id
|
844
|
+
loop_send_fin1( p2, app_id )
|
817
845
|
end
|
818
846
|
end
|
819
847
|
|
@@ -823,21 +851,23 @@ module P2p2
|
|
823
851
|
@writes.delete( sock )
|
824
852
|
@closings.delete( sock )
|
825
853
|
@socks.delete( sock.object_id )
|
826
|
-
|
827
|
-
|
854
|
+
@roles.delete( sock )
|
855
|
+
@infos.delete( sock )
|
856
|
+
end
|
857
|
+
|
858
|
+
def del_app_ext( p2_info, app_id )
|
859
|
+
ext = p2_info[ :app_exts ].delete( app_id )
|
828
860
|
|
829
|
-
if
|
830
|
-
|
861
|
+
if ext
|
862
|
+
p2_info[ :shadow_ids ].delete( ext[ :shadow_id ] )
|
831
863
|
|
832
|
-
|
864
|
+
ext[ :chunks ].each do | filename |
|
833
865
|
begin
|
834
|
-
File.delete( File.join(
|
866
|
+
File.delete( File.join( @app_chunk_dir, filename ) )
|
835
867
|
rescue Errno::ENOENT
|
836
868
|
end
|
837
869
|
end
|
838
870
|
end
|
839
|
-
|
840
|
-
info
|
841
871
|
end
|
842
872
|
|
843
873
|
end
|
data/lib/p2p2/version.rb
CHANGED