Commit Graph

182 Commits

Author SHA1 Message Date
Taizeng Wu 5cd7f324f9 Use channel to implement a simple way to wait 2018-12-05 16:30:09 +08:00
Taizeng Wu 3a53acc96b Reimplement Wait method to make it can be called concurrently from multiple goroutines 2018-12-05 14:47:03 +08:00
Taizeng Wu fbf9e05c66 Add Wait method to detect underlying SFTP connection closed
Closes #278
2018-12-03 17:46:45 +08:00
gm42 f9330fc78c Allow to configure maxConcurrentRequests 2018-05-28 09:44:19 +02:00
Nick Craig-Wood 0fc9a33d9a Document that ReadFrom/WriteTo are best for high throughput - fixes #158 2018-05-24 16:41:25 +01:00
Urjit Singh Bhatia 831654e4aa Client.MkdirAll - mimic os.MkdirAll code for consistency & perf 2018-04-25 08:13:19 -07:00
Urjit Singh Bhatia a03704e892 Add mkdirall implementation 2018-04-24 23:58:10 -07:00
John Eikenberry 49488377fa fix client deadlock on server death during writes
Fixes #234

Similar to #181 (which was about read methods), the client deadlocks on
server drop on write methods (Write/ReadFrom). This is another case of
broadcastErr() and dispatchRequest() deadlocking.

The fix is to bump up the channel used to communicate about inflight
packets to maxConcurrentRequests+1 (+1 is new). It seems that it can
have the full set of packets going and hit the error (triggering
broadcastErr) yet it still tries to call dispatchRequest again. More
details in that ticket.

I'm also bumping up the chan buffer in the read methods to keep them
consistent. I can't reproduce the problem, but it looks like it should
have it. So it might just be a much harder race to trigger.

This also includes 2 tests which reprocuded the issue for ReadFrom and
Write.
2018-03-15 13:53:30 -07:00
John Eikenberry 51703e3702
Merge pull request #220 from CodyDWJones/master
Expanded limits to the MaxPacket option.
2018-03-04 17:16:37 -08:00
Cody Jones f8a9ce48ad Allow the use of packets smaller than 32768 bytes, and add MaxPacketChecked/Unchecked client options to prevent developers from accidentally using larger, potentially incompatible sizes. 2018-02-22 14:05:13 -08:00
John Eikenberry 9fa3832aa2 update seek constants 2018-02-15 10:27:33 -08:00
John Eikenberry 0159c83e42 mention OpenFile as option to Create
Fixes #227
2018-02-06 14:03:47 -08:00
Paul c2bca6d357
Merge pull request #1 from pkg/master
Update from pkg/sftp
2017-12-20 15:29:39 +01:00
John Eikenberry f6ec992e48 expand docs on InternalInconsistency
Fixes #190

Add notes on possible causes and state of client object.
2017-11-04 12:48:40 -07:00
Iain Wade 9b6cdb8fab Add PosixRename method which uses the posix-rename@openssh.com extension
to support actual rename() operations rather than the link() call
effectively mandated by the sftp v3/draft-2 requirement that targets
not be overwritten.
2017-09-05 04:46:03 -07:00
John Eikenberry 22f089b9c4 Document internal inconsistency error 2017-07-25 21:04:32 -07:00
John Eikenberry babb028c61 Fix #189; add ClientOption type
Convert func(*Client)error places to use that type.

Did this mainly for consistency with ServerOption and improved
documentation.
2017-07-23 17:47:47 -07:00
John Eikenberry 08f9799191 Fix #185; add max packet size check and docs 2017-07-23 16:40:34 -07:00
John Eikenberry 737aa1dc61 Fixes #181: client deadlock on server death
The client was deadlocking if you killed the server when a file transfer
was occuring. The problem occured when you had many requests sent and
were waiting on responses when the server dies. The errors for all those
pending requests get sent along the response channel which is also used
for the errors reported by the new requests being made. The new request
channel send is in the same loop as the channel reading, so when it
blocked due to all other errors filling the channel it deadlocked the
program.

There were 2 possible fixes, changing the new request error channel
usage to be in a separate goroutine to keep it from blocking the loop or
to increase the size of the buffer to handle all the errors. This
implements the latter.

Included is a test that reproduces the problem most of the time. Due to
the required timing of the issue, it was impossible to reproduce 100% of
the time.
2017-06-29 11:27:52 -07:00
John Eikenberry 700027f436 drain inFlight packets in read/write methods
Fixes issue #167

File read/write client methods were breaking out of the packet handling
loops with packets still 'in flight' (packets sent without reply from
server) when errors occured. This caused problems after the fact with
the returning packets interfearing with later calls.

This change makes sure all the in flight packets are processed (even if
just discarded) before breaking out of the loop and returning.
2017-04-24 11:52:02 -07:00
John Eikenberry 027e3db83b handle all status packet results the same 2017-04-17 17:52:26 -07:00
unclejack 94df0a367c client,packet: remove redundant select & return
Signed-off-by: Cristian Staretu <cristian.staretu@gmail.com>
2017-02-25 12:56:13 -08:00
John Eikenberry ff7e52ffd7 Fix deadlock issue in client Read and WriteTo
Same bug from ReadFrom and Write as referenced in ticket #145.
See a couple back for commit message with explanation.
2017-02-13 17:36:29 -08:00
John Eikenberry 15a2bdbeee Fix deadlock issue in client ReadFrom and Write
Fixes github issue #145

Increase the buffer of channel for dispatchRequest() responses to be
equal to the maximum possible difference between desiredInFlight minus
inFlight, as this is the maximum possible error returns it would get
before moving on to channel handling code.
2017-02-13 00:32:44 -08:00
Allan Feid dab2d69fc2 Make remove directory public 2017-02-05 15:08:02 -08:00
Andrew Kupasrimonkol 59640f4fcc Make SSH_FXP_STATUS "message" field optional.
Cisco SSH 2.0 server doesn't fill out the "message" field,
even though it returns valid status codes. This makes
File.Read method error out without actually reading the
file due to unmarshalStatus returning a "packet too short"
error.
2017-02-05 14:53:51 -08:00
Paul Komkoff b4b1d297a4 Fix hang on error in WriteTo.
When writer returns an error, the code would mess up inFlight counter
and the loop will never finish as the result.

We switch to only use inFlight to count requests to sftp server -
we delete from pendingWrites now so we can use len(pendingWrites) to
count.
2017-02-05 14:25:51 -08:00
Paul Komkoff caba5e8043 Fix memory leak in WriteTo.
When reassembling out-of-order responses, give Go a chance to
free blocks we already wrote.
2017-02-05 14:25:51 -08:00
John Eikenberry f37534d398 Fixes #83, documentation of File.Read()
Docs had it following semantics of os.File.Read when it was actually
adhering to io.Reader.Read semantics.
2017-01-13 19:58:21 -08:00
Carl Jackson 8197a2e580 client: satisfy go vet (#136) 2016-09-08 20:00:35 +10:00
Dave Cheney ea1a7bcdfc conn: seperate io.Reader and io.WriteCloser (#118)
Reading and Writing are less coupled in the sftp client and server than
they may be over a traditional ReadWriter. This mirrors the full duplex
/ half close nature of a TCP connection.

In essence conn.Reader cannot be closed locally, it can only close in
response to the remote side using conn.WriteCloser.Close(), or a network
error, which is effectively the same thing.

Make this behaviour super clear by no longer smooshing the type into a
ReadWriteCloser.
2016-06-15 20:19:51 +10:00
Dave Cheney 1a25dc501f rename sendRequest to sendPacket
clientConn.sendPacket now obscures clientConn.conn.sendPacket with a
diferent signature.
2016-06-15 18:57:05 +10:00
Dave Cheney 0847713e96 Migrate sendRequest to clientConn 2016-06-15 18:30:05 +10:00
Dave Cheney c91ab27c13 Move client.Close to clientConn.Close 2016-06-15 18:23:51 +10:00
Dave Cheney 9184483985 Introduce clientConn
clientConn embeds a conn and adds the basic loop/recv methods.
2016-06-15 18:08:04 +10:00
Dave Cheney a3218d2747 client: break out recv into loop and recv (#115)
This isolates the use of broadcastErr from the normal recv/lookup loop.
2016-06-15 17:58:19 +10:00
Dave Cheney 7d4fc94878 Introduce sftp.conn type to handle common send/recv behaviour (#113)
Introduce sftp.conn type to bind packet send/recv to a
io.ReadWriteCloser.
2016-06-15 11:50:02 +10:00
Dave Cheney 04d5f67e72 Small cleanups 2016-06-14 18:05:33 +10:00
akupas f4e06643a3 Make SSH_FXP_STATUS error message optional (#109)
Some SSH implementations do not include an error message in the
SSH_FXP_STATUS response causing an "index out of range" panic.
2016-06-14 12:24:38 +10:00
Dave Cheney 530345cb99 client: use a waitgroup rather than a close channel (#112) 2016-06-13 22:40:12 +10:00
Dave Cheney aca140bc99 Revert "Fix sendRequest"
This reverts commit 7500207056.
2016-06-13 21:37:38 +10:00
Dave Cheney 7500207056 Fix sendRequest
sendRequest was not returning a value to the channel if there was
_not_ an error. How did this even work ?!?

Also remove server_test.go because it was wrong, it was testing that
sending a properly formed, but invalid (ie, requested wrong extended
packet) packet would cause an error during send ... which is wrong.
sendRequest will only return an error if the client connection was
closed.
2016-06-13 21:29:13 +10:00
Dave Cheney 5e9ad277fc Use pkg/errors for error handling (#101) 2016-05-19 15:16:48 +10:00
Matt Layher 9374ae613d *: golint: add and fix up comments on exported types 2016-01-07 15:16:34 -05:00
Matt Layher b348482b1a *: golint (part 1) 2016-01-07 12:10:24 -05:00
Matt Layher 3fa7dab0f1 client: add normaliseError, make Client.{Lstat,Open,Stat} satisfy os.IsNotExist 2016-01-03 16:10:58 -05:00
Dave Cheney bd1c81068b Always pass buffered channel to Read/Write
Fixes #55

c.sendRequest always does the right thing, but a few fast paths were not
constructing a buffered channel which would cause c.dispatchRequest to
block on error.
2015-12-25 18:35:37 +01:00
xiu 00e2b63272 Merge branch 'master' into bugfix/35-cant-remove-directories-on-servu 2015-12-23 17:14:04 +01:00
Matthew Sykes f5afc8315a Add Getwd to client 2015-12-22 09:04:46 -05:00
Dave Cheney 167ae32ca7 Handle osx returning EPERM not ENOTDIR
Fixes #57

Also fix the integration tests to run on darwin by default.
2015-12-22 13:34:21 +09:00
xiu 2034fcb625 Support SSH_FX_FILE_IS_A_DIRECTORY while trying to remove a directory 2015-12-21 16:27:15 +01:00
Dave Cheney e09e01e6e1 Merge pull request #53 from boomlinde/missing-language-tag
make the StatusError language tag optional
2015-10-31 11:23:59 +11:00
Philip Linde e6dc896441 make the StatusError language tag optional 2015-10-27 12:16:11 +01:00
Josh Deprez d434a0c545 Add Name method to File
Similar to os.File's Name.
2015-09-25 17:55:20 +10:00
Mark Sheahan a6fc4b8c1f Add comments for *Client.Stat and *Client.Lstat 2015-09-07 23:04:52 -07:00
Mark Sheahan d80ae36051 rmdir and symlink packet handling 2015-09-07 01:05:16 -07:00
Mark Sheahan 7bb2083ca9 Address review comments; about to change decodePacket() 2015-09-06 23:55:15 -07:00
Mark Sheahan 0aec5ce5ec use merge-to target branches, not ScriptRock ones 2015-09-06 21:54:42 -07:00
Mark Sheahan 4325c3654b fix format of 'name' packets (shortname, longname, attrs), add Stat 2015-08-05 12:57:28 -07:00
Mark Sheahan 2f3ef8b897 Merge branch 'master' into server 2015-08-04 21:11:01 -07:00
Mark Sheahan 615df6108a Merge branch 'master' of https://github.com/pkg/sftp 2015-08-04 21:00:34 -07:00
Mark Sheahan f4c4138a0e update client integration tests for more coverage 2015-08-04 20:47:26 -07:00
Mark Sheahan 0f2bc1aa17 server is passing the client integration tests now. I don't understand the ATTRs field, it has a name in it. 2015-07-31 23:09:51 -07:00
Mark Sheahan 5b6348f034 version, lstat 2015-07-25 01:19:29 -07:00
Dave Cheney c1748e2776 Fix typo in slice creation.
Fixes #43
2015-06-15 20:12:08 +10:00
Glenn Griffin 34978efaaf Address review comments and fix a data race.
Previously sftp.Close() would only shutdown the write side of the
connection and return. The sftp server would then shutdown the read side
of the connection at which point the recv goroutine would receive a
failure and return. When using a local sftp server in the intergration
tests we first call sftp.Close() followed by cmd.Wait(). cmd.Wait()
calls close on stdout while the sftp recv goroutine is still reading
from it. The fix is to block in sftp.Close() until the sftp server has
closed the receive end of the connection and the recv goroutine has
subsequently exited.
2015-06-03 09:33:09 -07:00
Glenn Griffin 29600148e4 Handle recvPacket in a single goroutine.
Previously recvPacket would be invoked in several goroutines. This meant
that when multiple concurrent requests were in flight there were N
goroutines each waiting on recvPacket. For optimal throughput the goal
is to send a new request as quickly as possible once a response is
received. The previous mechanism worked counter to this because the
goroutine sending new requests would be competing against N recvPacket
goroutines that may become runnable as data streams in. Having a single
goroutine responsible for recvPacket means that the recv and send
goroutines will ping-pong back and forth optimizing throughput.

This changes shows a ~10-25% increase in throughput in the the *Delay*
benchmark tests.

$ go test -bench=. -integration
PASS
BenchmarkRead1k	       2	 840068631 ns/op	  12.48 MB/s
BenchmarkRead16k	      20	  72968548 ns/op	 143.70 MB/s
BenchmarkRead32k	      30	  56871347 ns/op	 184.38 MB/s
BenchmarkRead128k	     100	  34150953 ns/op	 307.05 MB/s
BenchmarkRead512k	     100	  15730685 ns/op	 666.59 MB/s
BenchmarkRead1MiB	     200	  10462421 ns/op	1002.24 MB/s
BenchmarkRead4MiB	     200	   7325236 ns/op	1431.47 MB/s
BenchmarkRead4MiBDelay10Msec	      10	 186893765 ns/op	  56.11 MB/s
BenchmarkRead4MiBDelay50Msec	       2	 907127114 ns/op	  11.56 MB/s
BenchmarkRead4MiBDelay150Msec	       1	2708025060 ns/op	   3.87 MB/s
BenchmarkWrite1k	       1	1623940932 ns/op	   6.46 MB/s
BenchmarkWrite16k	      10	 174293843 ns/op	  60.16 MB/s
BenchmarkWrite32k	      10	 120377272 ns/op	  87.11 MB/s
BenchmarkWrite128k	      20	  54592205 ns/op	 192.08 MB/s
BenchmarkWrite512k	      50	  66449591 ns/op	 157.80 MB/s
BenchmarkWrite1MiB	      50	  70965660 ns/op	 147.76 MB/s
BenchmarkWrite4MiB	      50	  69234861 ns/op	 151.45 MB/s
BenchmarkWrite4MiBDelay10Msec	       5	 276624260 ns/op	  37.91 MB/s
BenchmarkWrite4MiBDelay50Msec	       1	1318396552 ns/op	   7.95 MB/s
BenchmarkWrite4MiBDelay150Msec	       1	3918416658 ns/op	   2.68 MB/s
BenchmarkCopyDown10MiBDelay10Msec	      10	 152240808 ns/op	  68.88 MB/s
BenchmarkCopyDown10MiBDelay50Msec	       2	 715003188 ns/op	  14.67 MB/s
BenchmarkCopyDown10MiBDelay150Msec	       1	2116878801 ns/op	   4.95 MB/s
BenchmarkCopyUp10MiBDelay10Msec	      10	 192748258 ns/op	  54.40 MB/s
BenchmarkCopyUp10MiBDelay50Msec	       2	 691486538 ns/op	  15.16 MB/s
BenchmarkCopyUp10MiBDelay150Msec	       1	1997162991 ns/op	   5.25 MB/s
BenchmarkMarshalInit	 2000000	       644 ns/op
BenchmarkMarshalOpen	 3000000	       562 ns/op
BenchmarkMarshalWriteWorstCase	   20000	     75166 ns/op
BenchmarkMarshalWrite1k	  500000	      3862 ns/op
ok  	github.com/pkg/sftp	71.174s
2015-06-02 13:13:32 -07:00
Glenn Griffin de236e835b Implement ReadFrom for *sftp.File
Improve the naive io.Copy case by splitting up the transfer into
multiple concurrent chunks similar to how large Write's are performed. This
improves the throughput on the BenchmarkCopyUp tests by 15-20x.

$ go test -bench=. -integration
PASS
BenchmarkRead1k	      20	  78382052 ns/op	 133.78 MB/s
BenchmarkRead16k	     100	  14038681 ns/op	 746.93 MB/s
BenchmarkRead32k	     100	  12076514 ns/op	 868.29 MB/s
BenchmarkRead128k	     200	   8892708 ns/op	1179.16 MB/s
BenchmarkRead512k	     300	   5937224 ns/op	1766.13 MB/s
BenchmarkRead1MiB	     300	   5383775 ns/op	1947.68 MB/s
BenchmarkRead4MiB	     300	   5896306 ns/op	1778.38 MB/s
BenchmarkRead4MiBDelay10Msec	       5	 213987487 ns/op	  49.00 MB/s
BenchmarkRead4MiBDelay50Msec	       1	1013717329 ns/op	  10.34 MB/s
BenchmarkRead4MiBDelay150Msec	       1	3012666692 ns/op	   3.48 MB/s
BenchmarkWrite1k	      10	 189878293 ns/op	  55.22 MB/s
BenchmarkWrite16k	      50	  57726712 ns/op	 181.65 MB/s
BenchmarkWrite32k	      30	  79804300 ns/op	 131.39 MB/s
BenchmarkWrite128k	      20	  71296126 ns/op	 147.08 MB/s
BenchmarkWrite512k	      20	 101823875 ns/op	 102.98 MB/s
BenchmarkWrite1MiB	      50	  70351842 ns/op	 149.05 MB/s
BenchmarkWrite4MiB	      20	  70187426 ns/op	 149.40 MB/s
BenchmarkWrite4MiBDelay10Msec	       5	 333251686 ns/op	  31.47 MB/s
BenchmarkWrite4MiBDelay50Msec	       1	1576708254 ns/op	   6.65 MB/s
BenchmarkWrite4MiBDelay150Msec	       1	4823796059 ns/op	   2.17 MB/s
BenchmarkCopyDown10MiBDelay10Msec	      10	 196175368 ns/op	  53.45 MB/s
BenchmarkCopyDown10MiBDelay50Msec	       2	 918624682 ns/op	  11.41 MB/s
BenchmarkCopyDown10MiBDelay150Msec	       1	2880111274 ns/op	   3.64 MB/s
BenchmarkCopyUp10MiBDelay10Msec	       5	 246048181 ns/op	  42.62 MB/s
BenchmarkCopyUp10MiBDelay50Msec	       2	 872059111 ns/op	  12.02 MB/s
BenchmarkCopyUp10MiBDelay150Msec	       1	2516801139 ns/op	   4.17 MB/s
BenchmarkMarshalInit	 2000000	       690 ns/op
BenchmarkMarshalOpen	 3000000	       579 ns/op
BenchmarkMarshalWriteWorstCase	   20000	     60438 ns/op
BenchmarkMarshalWrite1k	  300000	      4318 ns/op
ok  	github.com/pkg/sftp	70.210s
2015-06-02 13:13:32 -07:00
Glenn Griffin 828850be97 Implement WriteTo for *sftp.File
Improve the naive io.Copy case by splitting up the transfer into
multiple concurrent chunks similar to how large Read's are performed. This
improves the throughput on the BenchmarkCopyDown tests by 15-20x.

$ go test -bench=. -integration
PASS
BenchmarkRead1k	      20	  80039871 ns/op	 131.01 MB/s
BenchmarkRead16k	     100	  13109576 ns/op	 799.86 MB/s
BenchmarkRead32k	     100	  13002925 ns/op	 806.42 MB/s
BenchmarkRead128k	     200	   9189480 ns/op	1141.07 MB/s
BenchmarkRead512k	     300	   5863892 ns/op	1788.21 MB/s
BenchmarkRead1MiB	     300	   5350731 ns/op	1959.71 MB/s
BenchmarkRead4MiB	     300	   5880209 ns/op	1783.25 MB/s
BenchmarkRead4MiBDelay10Msec	       5	 211600615 ns/op	  49.56 MB/s
BenchmarkRead4MiBDelay50Msec	       1	1014580728 ns/op	  10.34 MB/s
BenchmarkRead4MiBDelay150Msec	       1	3015748763 ns/op	   3.48 MB/s
BenchmarkWrite1k	      10	 210602614 ns/op	  49.79 MB/s
BenchmarkWrite16k	      30	  53914210 ns/op	 194.49 MB/s
BenchmarkWrite32k	      20	  68630676 ns/op	 152.79 MB/s
BenchmarkWrite128k	      50	  70518854 ns/op	 148.70 MB/s
BenchmarkWrite512k	      30	  69846510 ns/op	 150.13 MB/s
BenchmarkWrite1MiB	      30	  70971873 ns/op	 147.75 MB/s
BenchmarkWrite4MiB	      20	  68902426 ns/op	 152.18 MB/s
BenchmarkWrite4MiBDelay10Msec	       5	 334770724 ns/op	  31.32 MB/s
BenchmarkWrite4MiBDelay50Msec	       1	1439154435 ns/op	   7.29 MB/s
BenchmarkWrite4MiBDelay150Msec	       1	4381710538 ns/op	   2.39 MB/s
BenchmarkCopyDown10MiBDelay10Msec	      10	 161331837 ns/op	  64.99 MB/s
BenchmarkCopyDown10MiBDelay50Msec	       2	 844679071 ns/op	  12.41 MB/s
BenchmarkCopyDown10MiBDelay150Msec	       1	2721133400 ns/op	   3.85 MB/s
BenchmarkCopyUp10MiBDelay10Msec	       1	3410147635 ns/op	   3.07 MB/s
BenchmarkCopyUp10MiBDelay50Msec	       1	16310789039 ns/op	   0.64 MB/s
BenchmarkCopyUp10MiBDelay150Msec	       1	48479031068 ns/op	   0.22 MB/s
BenchmarkMarshalInit	 2000000	       685 ns/op
BenchmarkMarshalOpen	 3000000	       606 ns/op
BenchmarkMarshalWriteWorstCase	   20000	     81904 ns/op
BenchmarkMarshalWrite1k	  300000	      4646 ns/op
ok  	github.com/pkg/sftp	128.842s
2015-06-02 13:13:32 -07:00
Glenn Griffin d9e7820587 Increase throughput of Read/Write.
Break up Read/Write calls into multiple concurrent requests to allow the
roundtrip time to the server to overlap. This provides a roughly 10x
throughput increase when using large buffers over a high latency link. This
does not help the naive io.Copy case since io.Copy defaults to an 8k buffer.

$ go test -bench=. -integration
PASS
BenchmarkRead1k	      20	  82017395 ns/op	 127.85 MB/s
BenchmarkRead16k	     100	  14634723 ns/op	 716.51 MB/s
BenchmarkRead32k	     100	  13706765 ns/op	 765.02 MB/s
BenchmarkRead128k	     200	   9614364 ns/op	1090.65 MB/s
BenchmarkRead512k	     200	   5778457 ns/op	1814.65 MB/s
BenchmarkRead1MiB	     300	   5624251 ns/op	1864.41 MB/s
BenchmarkRead4MiB	     200	   5798324 ns/op	1808.43 MB/s
BenchmarkRead4MiBDelay10Msec	       5	 214369945 ns/op	  48.91 MB/s
BenchmarkRead4MiBDelay50Msec	       1	1014850552 ns/op	  10.33 MB/s
BenchmarkRead4MiBDelay150Msec	       1	3016993337 ns/op	   3.48 MB/s
BenchmarkWrite1k	      10	 200740041 ns/op	  52.24 MB/s
BenchmarkWrite16k	      50	  74597799 ns/op	 140.57 MB/s
BenchmarkWrite32k	      20	  63229429 ns/op	 165.84 MB/s
BenchmarkWrite128k	      20	  78691019 ns/op	 133.25 MB/s
BenchmarkWrite512k	      20	  64372711 ns/op	 162.89 MB/s
BenchmarkWrite1MiB	      20	  95393443 ns/op	 109.92 MB/s
BenchmarkWrite4MiB	      20	  72211301 ns/op	 145.21 MB/s
BenchmarkWrite4MiBDelay10Msec	       3	 335329748 ns/op	  31.27 MB/s
BenchmarkWrite4MiBDelay50Msec	       1	1668562466 ns/op	   6.28 MB/s
BenchmarkWrite4MiBDelay150Msec	       1	4535944414 ns/op	   2.31 MB/s
BenchmarkCopyDown10MiBDelay10Msec	       1	3371273197 ns/op	   3.11 MB/s
BenchmarkCopyDown10MiBDelay50Msec	       1	16250399252 ns/op	   0.65 MB/s
BenchmarkCopyDown10MiBDelay150Msec	       1	48459210755 ns/op	   0.22 MB/s
BenchmarkCopyUp10MiBDelay10Msec	       1	3410202609 ns/op	   3.07 MB/s
BenchmarkCopyUp10MiBDelay50Msec	       1	16291168491 ns/op	   0.64 MB/s
BenchmarkCopyUp10MiBDelay150Msec	       1	48478335678 ns/op	   0.22 MB/s
BenchmarkMarshalInit	 2000000	       716 ns/op
BenchmarkMarshalOpen	 2000000	       638 ns/op
BenchmarkMarshalWriteWorstCase	   20000	     61127 ns/op
BenchmarkMarshalWrite1k	  300000	      4724 ns/op
ok  	github.com/pkg/sftp	186.575s
2015-06-02 13:13:15 -07:00
Dave Cheney 2fc1e77011 Final cleanup 2015-05-24 14:56:15 +10:00
Dave Cheney a17c010174 use a named type for readability 2015-05-24 14:51:18 +10:00
Dave Cheney c020667ac1 Make c.sendRequest concurrent
This is an attempt to permit overlapping requests.

For each request sent, we spin off a goroutine to send the request for us
then handle _a_ response. That goroutine will try to dispatch the request
to the original sender. As every request is initiated from the client, there
will always be a matching number of replies from the server so eventally
every worker goroutine will process a request and exit.
2015-05-23 22:51:29 +10:00
Dave Cheney be8bb997e5 Add MaxPacket option to increase the size of the payload
% buffered-read-benchmark
2015/05/23 21:51:27 reading 1e+09 bytes
2015/05/23 21:51:53 read 1000000000 bytes in 25.668237836s
% buffered-read-benchmark -s 65536
2015/05/23 21:52:02 reading 1e+09 bytes
2015/05/23 21:52:20 read 1000000000 bytes in 18.419390056s
% buffered-read-benchmark -s 262144
2015/05/23 21:52:50 reading 1e+09 bytes
2015/05/23 21:53:08 read 1000000000 bytes in 18.367038236s
2015-05-23 21:53:59 +10:00
Dave Cheney 50631306d7 Push c.mu.Lock/Unlock down to sendRequest
Also includes gofmt cleanups
2015-05-23 17:10:22 +10:00
Maximilian Pachl 267a179e16 added integration test for client.StatVFS 2015-05-16 00:54:02 +02:00
Maximilian Pachl 0b805e96f9 added statvfs@openssh.com extension request 2015-05-15 20:37:52 +02:00
Mark Sheahan 1165da51c7 Updated to use github.com/Scriptrock/crypto/ssh 2015-02-13 09:59:47 -08:00
Mark Sheahan 074b201d7d Reference ScriptRock ssh library, not current google one 2015-01-08 20:33:06 -08:00
Javier Blazquez 62281627fa Fixed write errors not bubbling up correctly 2014-12-18 17:22:24 -08:00
Otto Bretz 1c05ca70ba New import paths for Go sub-respositories
see https://groups.google.com/forum/?fromgroups#!topic/golang-nuts/eD8dh3T9yyA
2014-11-06 09:30:12 +01:00
Alexander Neumann e2bfa2bf74 Reduce code duplication in init 2014-10-09 21:10:54 +02:00
Alexander Neumann 24e228535b Check version on init 2014-10-09 21:10:54 +02:00
Alexander Neumann 5af3cfa4ea Add sftp.NewClientPipe()
This method returns a Client from a pair of pipes.  This can be used for
connecting to an SFTP server over TCP/TLS or by using the system's ssh
client program (e.g. via exec.Command).

An Example function is added, and the client integration test uses the
function.
2014-09-30 00:49:01 +02:00
Matthieu Rakotojaona 6c93917172 Manually marshal readlink packet 2014-09-28 03:57:44 +02:00
Dave Cheney 09a8c3d9c0 Merge pull request #18 from rakoo/marshalling
Manually marshal packets for more speed
2014-09-28 11:01:28 +10:00
Matthieu Rakotojaona c01839afa0 Manually marshal packets for more speed 2014-09-27 14:29:57 +02:00
Andy Hochhaus a2df54ebb9 ReadLink cleanups. 2014-09-23 14:42:28 -04:00
Andy Hochhaus f64817295f Implement ssh_FXP_READLINK 2014-09-22 22:29:20 -04:00
Donavan Pantke 1260413c8e Switch from fi to fs for type clarity. 2014-06-24 02:06:55 -04:00
Donavan Pantke 5ea2cc512e Refactor stat functions to look more like Go's original. Also allows for access to fields we can access from SFTP but do not conform to os.FileInfo. 2014-06-22 23:11:28 -04:00
Donavan Pantke 1fdb26e0b9 Fix a few various typecasting bugs. 2014-06-22 16:01:04 -04:00
Donavan Pantke 0ed9339c17 Implement aliases to client methods in an individual File. 2014-06-22 01:48:11 -04:00
Donavan Pantke 17a3539b2a Remove old Chtimes implementation. 2014-06-22 01:26:53 -04:00
Donavan Pantke 311e0fd159 Slightly refactor Chtimes and add support for other variants of setstat. 2014-06-22 01:25:40 -04:00
Donavan Pantke 7b37dffc24 Merge commit 'ecc928e8ba95a479858406dd87029a55cbd3262b' 2014-06-21 20:48:56 -04:00
Donavan Pantke c077755e5d Convert Chtimes to a setstat call for reuse with other stat setting functions. 2014-06-21 20:48:40 -04:00
Sean Treadway b5d9767c0a Consistent puncutation, names and constants
* European sentence punctuation, consistent with package docs
  * Match os.SEEK_* constants instead of numeric constants from io.Seeker
  * Consistent (shorter) receiver name for quickcheck value
2014-06-13 10:22:04 +02:00
Sean Treadway 68aec0278e Implement io.Seeker for *sftp.File
Test that reads at the seeked offset of sftp.File are consistent with
the reads of offset of os.File for the same file.

Error conditions and undefined seeks are not tested.
2014-06-11 21:17:53 +02:00
Dave Cheney 452cdf6b53 Merge from nemith-master 2014-05-25 14:31:57 +10:00