mirror of
https://github.com/rclone/rclone.git
synced 2024-12-23 07:29:35 +01:00
smb: implement multi-threaded writes for copies to smb
smb2.File implements the WriterAtCloser interface defined in fs/types.go. Expose it via a OpenWriterAt method on the fs struct to support multi-threaded writes.
This commit is contained in:
parent
a79887171c
commit
c3989d1906
@ -475,6 +475,45 @@ func (f *Fs) About(ctx context.Context) (_ *fs.Usage, err error) {
|
|||||||
return usage, nil
|
return usage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenWriterAt opens with a handle for random access writes
|
||||||
|
//
|
||||||
|
// Pass in the remote desired and the size if known.
|
||||||
|
//
|
||||||
|
// It truncates any existing object
|
||||||
|
func (f *Fs) OpenWriterAt(ctx context.Context, remote string, size int64) (fs.WriterAtCloser, error) {
|
||||||
|
var err error
|
||||||
|
o := &Object{
|
||||||
|
fs: f,
|
||||||
|
remote: remote,
|
||||||
|
}
|
||||||
|
share, filename := o.split()
|
||||||
|
if share == "" || filename == "" {
|
||||||
|
return nil, fs.ErrorIsDir
|
||||||
|
}
|
||||||
|
|
||||||
|
err = o.fs.ensureDirectory(ctx, share, filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to make parent directories: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
filename = o.fs.toSambaPath(filename)
|
||||||
|
|
||||||
|
o.fs.addSession() // Show session in use
|
||||||
|
defer o.fs.removeSession()
|
||||||
|
|
||||||
|
cn, err := o.fs.getConnection(ctx, share)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fl, err := cn.smbShare.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to open: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fl, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Shutdown the backend, closing any background tasks and any
|
// Shutdown the backend, closing any background tasks and any
|
||||||
// cached connections.
|
// cached connections.
|
||||||
func (f *Fs) Shutdown(ctx context.Context) error {
|
func (f *Fs) Shutdown(ctx context.Context) error {
|
||||||
|
Loading…
Reference in New Issue
Block a user