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 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