mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	Use a separate buffer per session for incoming packets, so 1 session that floods won't block other sessions
This commit is contained in:
		
							parent
							
								
									9ab08446ff
								
							
						
					
					
						commit
						5e81a0c421
					
				
					 1 changed files with 28 additions and 2 deletions
				
			
		| 
						 | 
					@ -508,6 +508,32 @@ func (sinfo *sessionInfo) recvWorker() {
 | 
				
			||||||
		util.WorkerGo(poolFunc)
 | 
							util.WorkerGo(poolFunc)
 | 
				
			||||||
		callbacks = append(callbacks, ch)
 | 
							callbacks = append(callbacks, ch)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						fromHelper := make(chan wire_trafficPacket, 1)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							var buf []wire_trafficPacket
 | 
				
			||||||
 | 
							for {
 | 
				
			||||||
 | 
								for len(buf) > 0 {
 | 
				
			||||||
 | 
									select {
 | 
				
			||||||
 | 
									case <-sinfo.cancel.Finished():
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									case p := <-sinfo.fromRouter:
 | 
				
			||||||
 | 
										buf = append(buf, p)
 | 
				
			||||||
 | 
										for len(buf) > 64 { // Based on nonce window size
 | 
				
			||||||
 | 
											util.PutBytes(buf[0].Payload)
 | 
				
			||||||
 | 
											buf = buf[1:]
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									case fromHelper <- buf[0]:
 | 
				
			||||||
 | 
										buf = buf[1:]
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								select {
 | 
				
			||||||
 | 
								case <-sinfo.cancel.Finished():
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								case p := <-sinfo.fromRouter:
 | 
				
			||||||
 | 
									buf = append(buf, p)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		for len(callbacks) > 0 {
 | 
							for len(callbacks) > 0 {
 | 
				
			||||||
			select {
 | 
								select {
 | 
				
			||||||
| 
						 | 
					@ -516,14 +542,14 @@ func (sinfo *sessionInfo) recvWorker() {
 | 
				
			||||||
				f()
 | 
									f()
 | 
				
			||||||
			case <-sinfo.cancel.Finished():
 | 
								case <-sinfo.cancel.Finished():
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			case p := <-sinfo.fromRouter:
 | 
								case p := <-fromHelper:
 | 
				
			||||||
				doRecv(p)
 | 
									doRecv(p)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		select {
 | 
							select {
 | 
				
			||||||
		case <-sinfo.cancel.Finished():
 | 
							case <-sinfo.cancel.Finished():
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		case p := <-sinfo.fromRouter:
 | 
							case p := <-fromHelper:
 | 
				
			||||||
			doRecv(p)
 | 
								doRecv(p)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue