diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2021-04-14 15:02:11 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2021-04-14 16:04:20 +0300 |
| commit | a6a89cd5e025c6a6e12ad6060aae347385869cd3 (patch) | |
| tree | 69e19085bc91aaa798bf1b8e5d39d8648c6e08ba /pkg/server/tunnel.go | |
| parent | 1517965447c59f1426405bf775e4c7c1f0611354 (diff) | |
add redial socket
Diffstat (limited to 'pkg/server/tunnel.go')
| -rw-r--r-- | pkg/server/tunnel.go | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/pkg/server/tunnel.go b/pkg/server/tunnel.go index e2fce92..afa0f31 100644 --- a/pkg/server/tunnel.go +++ b/pkg/server/tunnel.go @@ -36,6 +36,8 @@ type stream struct { wg sync.WaitGroup in, out socket.Conn pipes []*hook.Pipe + mu sync.Mutex + zombie bool m struct { in metric @@ -295,6 +297,10 @@ func (s *stream) channel(c socket.Conn, m *metric, rq, wq queue.Q) { if err != nil { log.Println(s.t, s, c, err) } + + s.mu.Lock() + s.zombie = true + s.mu.Unlock() } counter := func(c *uint64, src, dst queue.Q) { @@ -499,6 +505,26 @@ func tunnelDel(r *request, id string) { } } +func streamKick(r *request, tid string, sid int) { + e, ok := r.c.s.tunnels[tid] + if !ok { + r.Fatal("no such tunnel") + } + + t := e.(*tunnel) + + t.mu.Lock() + defer t.mu.Unlock() + + s, ok := t.streams[sid] + if !ok { + r.Fatal("no such stream") + } + + log.Println(s, "kick") + s.stop() +} + func tunnelRename(r *request, old, new string) { if !isOkTunnelName(new) { r.Fatal("bad name") @@ -551,7 +577,15 @@ func showActive(r *request) { defer t.mu.Unlock() foreachStream(t.streams, func(s *stream) { - r.Println(t.id, s.id, s.in, s.out, s.info()) + var opts string + + s.mu.Lock() + if s.zombie { + opts = "zombie" + } + s.mu.Unlock() + + r.Println(t.id, s.id, s.in, s.out, s.info(), opts) }) }) } @@ -577,9 +611,11 @@ func showRecent(r *request) { func init() { newCmd("add", tunnelAdd, "[name id] [limit N] [single] socket [hook ...] socket") - newCmd("del", tunnelDel, "id") + newCmd("del", tunnelDel, "tunnel-id") + + newCmd("kick", streamKick, "tunnel-id stream-id") - newCmd("rename", tunnelRename, "old-id new-id") + newCmd("rename", tunnelRename, "tunnel-old-id tunnel-new-id") newCmd("show", showTunnels, "") |
