Public bug reported:

Hi,

I found a bug with SFTP connection, the bug is the conection with the storage 
server never closes, and creates more connections every time.
For example when upload the chunks the conection is already stablished and for 
each chunk open a conection because in the SftpTransferManager in funtion 
upload conects with the storage and the application not checks the connection.


@Override
    public void upload(File localFile, RemoteFile remoteFile) throws 
StorageException {               
        connect();


And the function connects every time creates a new session and not closes the 
last session:

                        this.session = 
jsch.getSession(getConnection().getUsername(), getConnection().getHost(), 
getConnection().getPort());
                        Hashtable cf = new Hashtable();
                        cf.put("StrictHostKeyChecking", "no");
                        session.setConfig(cf);
                        session.connect();


I solved checking the connection when try to connect with the storage.

    @Override
    public void connect() throws StorageConnectException {
        boolean isConnected = false;
        
        if(session != null){
            if(session.isConnected()){
                if(sftp != null){
                    if (sftp.isConnected()){
                        isConnected = true;
                    }else{
                        session.disconnect();
                    }
                } else{
                    session.disconnect();
                }
            }
        }
        
        if(!isConnected){
            for (int i=0; i<CONNECT_RETRY_COUNT; i++) {
                try {

                    if (logger.isLoggable(Level.INFO)) {
                        logger.log(Level.INFO, "SFTP client connecting to 
{0}:{1} ...", new Object[]{getConnection().getHost(), 
getConnection().getPort()});
                    }

                    if (getConnection().isKeyAuth()) {
                        jsch.addIdentity(getConnection().getKeyPath(), 
getConnection().getPassphrase());
                        this.session = 
jsch.getSession(getConnection().getUsername(), getConnection().getHost(), 
getConnection().getPort());
                        Hashtable cf = new Hashtable();
                        cf.put("StrictHostKeyChecking", "no");
                        session.setConfig(cf);
                        session.connect();
                        if(!session.isConnected())
                            logger.log(Level.WARNING, "SFTP client: unable to 
connect (user/password) to {0}:{1} ...", new 
Object[]{getConnection().getHost(), getConnection().getPort()});

                    } else {
                        this.session = 
jsch.getSession(getConnection().getUsername(), getConnection().getHost(), 
getConnection().getPort());

                        Hashtable cf = new Hashtable();
                        cf.put("StrictHostKeyChecking", "no");
                        session.setConfig(cf);
                        session.setPassword(getConnection().getPassword());
                        session.connect();
                        if(!session.isConnected())
                            logger.log(Level.WARNING, "SFTP client: unable to 
connect (user/password) to {0}:{1} ...", new 
Object[]{getConnection().getHost(), getConnection().getPort()});
                    }

                    this.sftp = (ChannelSftp) session.openChannel("sftp");
                    this.sftp.connect();
                    if(!sftp.isConnected())
                            logger.log(Level.WARNING, "SFTP client: unable to 
connect sftp Channel ( {0}:{1} ) ...", new Object[]{getConnection().getHost(), 
getConnection().getPort()});

                    return;
                }
                catch (Exception ex) {
                    if (logger.isLoggable(Level.WARNING)) {
                        logger.log(Level.WARNING, "SFTP client connection 
failed.", ex);
                    }

                    throw new StorageConnectException(ex);
                }                        
            }

            if (logger.isLoggable(Level.SEVERE)) {
                logger.log(Level.SEVERE, "RETRYING FAILED: SFTP client 
connection failed.");
            }
        }
    }


In function disconnect sometimes appears the null pointer exception because 
sftp or session is null.
I solved with this:

    @Override
    public void disconnect() {
        if(sftp != null){
            this.sftp.quit();
            this.sftp.disconnect();
        }
        if(session != null){
            this.session.disconnect();
        }
    }


Regards.

** Affects: syncany
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Syncany
Team, which is subscribed to Syncany.
https://bugs.launchpad.net/bugs/991771

Title:
  SFTP connection bug

Status in Syncany:
  New

Bug description:
  Hi,

  I found a bug with SFTP connection, the bug is the conection with the storage 
server never closes, and creates more connections every time.
  For example when upload the chunks the conection is already stablished and 
for each chunk open a conection because in the SftpTransferManager in funtion 
upload conects with the storage and the application not checks the connection.

  
  @Override
      public void upload(File localFile, RemoteFile remoteFile) throws 
StorageException {               
          connect();

  
  And the function connects every time creates a new session and not closes the 
last session:

                          this.session = 
jsch.getSession(getConnection().getUsername(), getConnection().getHost(), 
getConnection().getPort());
                          Hashtable cf = new Hashtable();
                          cf.put("StrictHostKeyChecking", "no");
                          session.setConfig(cf);
                          session.connect();

  
  I solved checking the connection when try to connect with the storage.

      @Override
      public void connect() throws StorageConnectException {
          boolean isConnected = false;
          
          if(session != null){
              if(session.isConnected()){
                  if(sftp != null){
                      if (sftp.isConnected()){
                          isConnected = true;
                      }else{
                          session.disconnect();
                      }
                  } else{
                      session.disconnect();
                  }
              }
          }
          
          if(!isConnected){
              for (int i=0; i<CONNECT_RETRY_COUNT; i++) {
                  try {

                      if (logger.isLoggable(Level.INFO)) {
                          logger.log(Level.INFO, "SFTP client connecting to 
{0}:{1} ...", new Object[]{getConnection().getHost(), 
getConnection().getPort()});
                      }

                      if (getConnection().isKeyAuth()) {
                          jsch.addIdentity(getConnection().getKeyPath(), 
getConnection().getPassphrase());
                          this.session = 
jsch.getSession(getConnection().getUsername(), getConnection().getHost(), 
getConnection().getPort());
                          Hashtable cf = new Hashtable();
                          cf.put("StrictHostKeyChecking", "no");
                          session.setConfig(cf);
                          session.connect();
                          if(!session.isConnected())
                              logger.log(Level.WARNING, "SFTP client: unable to 
connect (user/password) to {0}:{1} ...", new 
Object[]{getConnection().getHost(), getConnection().getPort()});

                      } else {
                          this.session = 
jsch.getSession(getConnection().getUsername(), getConnection().getHost(), 
getConnection().getPort());

                          Hashtable cf = new Hashtable();
                          cf.put("StrictHostKeyChecking", "no");
                          session.setConfig(cf);
                          session.setPassword(getConnection().getPassword());
                          session.connect();
                          if(!session.isConnected())
                              logger.log(Level.WARNING, "SFTP client: unable to 
connect (user/password) to {0}:{1} ...", new 
Object[]{getConnection().getHost(), getConnection().getPort()});
                      }

                      this.sftp = (ChannelSftp) session.openChannel("sftp");
                      this.sftp.connect();
                      if(!sftp.isConnected())
                              logger.log(Level.WARNING, "SFTP client: unable to 
connect sftp Channel ( {0}:{1} ) ...", new Object[]{getConnection().getHost(), 
getConnection().getPort()});

                      return;
                  }
                  catch (Exception ex) {
                      if (logger.isLoggable(Level.WARNING)) {
                          logger.log(Level.WARNING, "SFTP client connection 
failed.", ex);
                      }

                      throw new StorageConnectException(ex);
                  }                        
              }

              if (logger.isLoggable(Level.SEVERE)) {
                  logger.log(Level.SEVERE, "RETRYING FAILED: SFTP client 
connection failed.");
              }
          }
      }

  
  In function disconnect sometimes appears the null pointer exception because 
sftp or session is null.
  I solved with this:

      @Override
      public void disconnect() {
          if(sftp != null){
              this.sftp.quit();
              this.sftp.disconnect();
          }
          if(session != null){
              this.session.disconnect();
          }
      }

  
  Regards.

To manage notifications about this bug go to:
https://bugs.launchpad.net/syncany/+bug/991771/+subscriptions

-- 
Mailing list: https://launchpad.net/~syncany-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~syncany-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to