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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0727388a18560d4da46cca837f3cce09d3869566a27943289e48f58bc04f2eeb'
4
- data.tar.gz: abc0bcc8ae2017a985c451a4c4d2f18172e888d2d1761b0407535fc50b240fec
3
+ metadata.gz: 6cc570a15e1753229a958258ab7557e30ca3b17de854e2df72e240c9daa245ab
4
+ data.tar.gz: ef6672ee956bb7065a70bf384f6260b763ccf45a479534c9a196dd8ac6bf73b0
5
5
  SHA512:
6
- metadata.gz: 5d1820637dbec1a55279907488b4177f5058db51c93e27c0550fbd7d8c6159c50aa4c6ff443ee7aa00f4bdca4fda11c8bb4ddce268e9b9dc4e6207e3b3f49aca
7
- data.tar.gz: f1561b691c0e12eafe5b22afc640f196e91d81b5b64a04fc2b188dd389aa75f785af3e8d750dc42ed565e9ac80dd9c8798f1ef06d4087e8051c11cdec6889568
6
+ metadata.gz: 6da4e3a19f6cd297aabdc8e11f2e7500bd557810d688d224cb28068c117999b476deeee5de3f4a52da52e3661358967e93b9bcec4ddcf16cea7392103ecff1d4
7
+ data.tar.gz: b4922aa37ea8e66d591bdf950c899a27ea39c6abf27ae3760cc018b77bf1d7a2ccdca6e228d28c0ab8abc46898c07ee9862fba49505211778ad02e71a4a9bd96
@@ -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 addrinfo.to_sockaddr != @p2pd_sockaddr
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 unless info[ :p2_addr ]
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[ :shadow_exts ].delete( shadow_id )
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[ :last_traffic_at ] = now
390
-
391
- shadow_info = @infos[ ext[ :shadow ] ]
392
- shadow_info[ :wbuff ] << data
403
+ ext[ :wbuff ] << data
393
404
 
394
- if shadow_info[ :wbuff ].bytesize >= CHUNK_SIZE
395
- spring = shadow_info[ :chunks ].size > 0 ? ( shadow_info[ :spring ] + 1 ) : 0
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, shadow_info[ :wbuff ] )
399
- shadow_info[ :chunks ] << filename
400
- shadow_info[ :spring ] = spring
401
- shadow_info[ :wbuff ].clear
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 = info[ :cache ]
444
+ data = ext[ :cache ]
423
445
  from = :cache
424
446
 
425
447
  if data.empty?
426
- if info[ :chunks ].any?
427
- path = File.join( @shadow_chunk_dir, info[ :chunks ].shift )
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 = info[ :wbuff ]
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
- info[ from ] = data
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
- info[ from ] = data
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
- shadows: [], # 开着的shadow
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: [] # 重传队列 [ shadow_id, pack_id ]
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[ :last_coming_at ] > EXPIRE_AFTER )
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
- ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
613
- send_pack( p1, ctlmsg, p1_info[ :p2_addr ] )
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
- info[ :shadows ].each { | shadow | add_closing( shadow ) }
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
- # puts "debug 2-3. shadow.close -> ext.is_app_closed ? yes -> del ext -> loop send fin2 #{ Time.new }"
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
- else
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
- if p1_info[ :p2_addr ] && !p1_info[ :fin1s ].include?( shadow_id )
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
- role = @roles.delete( sock )
787
- info = @infos.delete( sock )
806
+ @roles.delete( sock )
807
+ @infos.delete( sock )
808
+ end
788
809
 
789
- if info
790
- chunk_dir = ( role == :shadow ? @shadow_chunk_dir : @p1_chunk_dir )
810
+ def del_shadow_ext( p1_info, shadow_id )
811
+ ext = p1_info[ :shadow_exts ].delete( shadow_id )
791
812
 
792
- info[ :chunks ].each do | filename |
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( chunk_dir, filename ) )
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
@@ -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 addrinfo.to_sockaddr != @p2pd_sockaddr
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[ :app_exts ].delete( app_id )
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[ :last_traffic_at ] = now
388
-
389
- app_info = @infos[ ext[ :app ] ]
390
- app_info[ :wbuff ] << data
402
+ ext[ :wbuff ] << data
391
403
 
392
- if app_info[ :wbuff ].bytesize >= CHUNK_SIZE
393
- spring = app_info[ :chunks ].size > 0 ? ( app_info[ :spring ] + 1 ) : 0
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, app_info[ :wbuff ] )
397
- app_info[ :chunks ] << filename
398
- app_info[ :spring ] = spring
399
- app_info[ :wbuff ].clear
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 = info[ :cache ]
443
+ data = ext[ :cache ]
421
444
  from = :cache
422
445
 
423
446
  if data.empty?
424
- if info[ :chunks ].any?
425
- path = File.join( @app_chunk_dir, info[ :chunks ].shift )
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 = info[ :wbuff ]
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
- info[ from ] = data
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
- info[ from ] = data
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: [] # 重传队列 [ app_id, pack_id ]
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[ :last_coming_at ] > EXPIRE_AFTER )
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
- ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
622
- send_pack( p2, ctlmsg, p2_info[ :p1_addr ] )
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
- info[ :apps ].each { | app | add_closing( app ) }
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
- # puts "debug 2-3. app.close -> ext.is_shadow_closed ? yes -> del ext -> loop send fin2 #{ Time.new }"
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
- else
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
- if p2_info[ :p1_addr ] && !p2_info[ :fin1s ].include?( app_id )
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
- role = @roles.delete( sock )
827
- info = @infos.delete( sock )
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 info
830
- chunk_dir = ( role == :app ? @app_chunk_dir : @p2_chunk_dir )
861
+ if ext
862
+ p2_info[ :shadow_ids ].delete( ext[ :shadow_id ] )
831
863
 
832
- info[ :chunks ].each do | filename |
864
+ ext[ :chunks ].each do | filename |
833
865
  begin
834
- File.delete( File.join( chunk_dir, filename ) )
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
@@ -1,3 +1,3 @@
1
1
  module P2p2
2
- VERSION = "0.8.2"
2
+ VERSION = "0.8.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p2p2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - takafan