libgit2/ssh: Embed connection fields in Subtransport

The connection type was created to group the connection related fields
and use mutex to prevent race conditions. Since that's no longer the
case, this puts back those fields in sshSmartSubtransport.

Signed-off-by: Sunny <darkowlzz@protonmail.com>
This commit is contained in:
Sunny 2022-06-21 17:48:49 +05:30
parent 09fae634df
commit a530c5dee2
No known key found for this signature in database
GPG Key ID: 9F3D25DDFF7FA3CF
1 changed files with 22 additions and 26 deletions

View File

@ -114,10 +114,6 @@ type sshSmartSubtransport struct {
closedSessions *int32 closedSessions *int32
con connection
}
type connection struct {
client *ssh.Client client *ssh.Client
session *ssh.Session session *ssh.Session
currentStream *sshSmartSubtransportStream currentStream *sshSmartSubtransportStream
@ -155,17 +151,17 @@ func (t *sshSmartSubtransport) Action(transportOptionsURL string, action git2go.
var cmd string var cmd string
switch action { switch action {
case git2go.SmartServiceActionUploadpackLs, git2go.SmartServiceActionUploadpack: case git2go.SmartServiceActionUploadpackLs, git2go.SmartServiceActionUploadpack:
if t.con.currentStream != nil { if t.currentStream != nil {
if t.lastAction == git2go.SmartServiceActionUploadpackLs { if t.lastAction == git2go.SmartServiceActionUploadpackLs {
return t.con.currentStream, nil return t.currentStream, nil
} }
} }
cmd = fmt.Sprintf("git-upload-pack '%s'", uPath) cmd = fmt.Sprintf("git-upload-pack '%s'", uPath)
case git2go.SmartServiceActionReceivepackLs, git2go.SmartServiceActionReceivepack: case git2go.SmartServiceActionReceivepackLs, git2go.SmartServiceActionReceivepack:
if t.con.currentStream != nil { if t.currentStream != nil {
if t.lastAction == git2go.SmartServiceActionReceivepackLs { if t.lastAction == git2go.SmartServiceActionReceivepackLs {
return t.con.currentStream, nil return t.currentStream, nil
} }
} }
cmd = fmt.Sprintf("git-receive-pack '%s'", uPath) cmd = fmt.Sprintf("git-receive-pack '%s'", uPath)
@ -212,7 +208,7 @@ func (t *sshSmartSubtransport) Action(transportOptionsURL string, action git2go.
return nil return nil
} }
if t.con.connected { if t.connected {
// The connection is no longer shared across actions, so ensures // The connection is no longer shared across actions, so ensures
// all has been released before starting a new connection. // all has been released before starting a new connection.
_ = t.Close() _ = t.Close()
@ -224,18 +220,18 @@ func (t *sshSmartSubtransport) Action(transportOptionsURL string, action git2go.
} }
t.logger.V(logger.TraceLevel).Info("creating new ssh session") t.logger.V(logger.TraceLevel).Info("creating new ssh session")
if t.con.session, err = t.con.client.NewSession(); err != nil { if t.session, err = t.client.NewSession(); err != nil {
return nil, err return nil, err
} }
if t.stdin, err = t.con.session.StdinPipe(); err != nil { if t.stdin, err = t.session.StdinPipe(); err != nil {
return nil, err return nil, err
} }
var w *io.PipeWriter var w *io.PipeWriter
var reader io.Reader var reader io.Reader
t.stdout, w = io.Pipe() t.stdout, w = io.Pipe()
if reader, err = t.con.session.StdoutPipe(); err != nil { if reader, err = t.session.StdoutPipe(); err != nil {
return nil, err return nil, err
} }
@ -284,16 +280,16 @@ func (t *sshSmartSubtransport) Action(transportOptionsURL string, action git2go.
}() }()
t.logger.V(logger.TraceLevel).Info("run on remote", "cmd", cmd) t.logger.V(logger.TraceLevel).Info("run on remote", "cmd", cmd)
if err := t.con.session.Start(cmd); err != nil { if err := t.session.Start(cmd); err != nil {
return nil, err return nil, err
} }
t.lastAction = action t.lastAction = action
t.con.currentStream = &sshSmartSubtransportStream{ t.currentStream = &sshSmartSubtransportStream{
owner: t, owner: t,
} }
return t.con.currentStream, nil return t.currentStream, nil
} }
func (t *sshSmartSubtransport) createConn(addr string, sshConfig *ssh.ClientConfig) error { func (t *sshSmartSubtransport) createConn(addr string, sshConfig *ssh.ClientConfig) error {
@ -310,8 +306,8 @@ func (t *sshSmartSubtransport) createConn(addr string, sshConfig *ssh.ClientConf
return err return err
} }
t.con.connected = true t.connected = true
t.con.client = ssh.NewClient(c, chans, reqs) t.client = ssh.NewClient(c, chans, reqs)
return nil return nil
} }
@ -328,25 +324,25 @@ func (t *sshSmartSubtransport) createConn(addr string, sshConfig *ssh.ClientConf
func (t *sshSmartSubtransport) Close() error { func (t *sshSmartSubtransport) Close() error {
t.logger.V(logger.TraceLevel).Info("sshSmartSubtransport.Close()") t.logger.V(logger.TraceLevel).Info("sshSmartSubtransport.Close()")
t.con.currentStream = nil t.currentStream = nil
if t.con.client != nil && t.stdin != nil { if t.client != nil && t.stdin != nil {
_ = t.stdin.Close() _ = t.stdin.Close()
} }
t.stdin = nil t.stdin = nil
if t.con.session != nil { if t.session != nil {
t.logger.V(logger.TraceLevel).Info("session.Close()") t.logger.V(logger.TraceLevel).Info("session.Close()")
_ = t.con.session.Close() _ = t.session.Close()
} }
t.con.session = nil t.session = nil
if t.con.client != nil { if t.client != nil {
_ = t.con.client.Close() _ = t.client.Close()
t.logger.V(logger.TraceLevel).Info("close client") t.logger.V(logger.TraceLevel).Info("close client")
} }
t.con.client = nil t.client = nil
t.con.connected = false t.connected = false
atomic.AddInt32(t.closedSessions, 1) atomic.AddInt32(t.closedSessions, 1)
return nil return nil