p2p2 0.8.2 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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