Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
af35d88
hardlink skip support for NFS
dphulkar-msft Jan 6, 2026
f4034aa
hardlink skip support for NFS
dphulkar-msft Jan 6, 2026
b2b40f9
hardlink skip support for NFS
dphulkar-msft Jan 7, 2026
b0b48f3
hardlink skip support for NFS
dphulkar-msft Jan 7, 2026
7aa9dcf
hardlink skip support for NFS
dphulkar-msft Jan 8, 2026
c10059a
hardlink skip support for NFS
dphulkar-msft Jan 8, 2026
3b2aec7
hardlink skip support for NFS
dphulkar-msft Jan 13, 2026
5ec8ad1
hardlink skip support for NFS
dphulkar-msft Jan 13, 2026
7e301cf
hardlink skip support for NFS
dphulkar-msft Jan 13, 2026
375d159
fixing test case
dphulkar-msft Jan 13, 2026
04499eb
fixing test case
dphulkar-msft Jan 14, 2026
0eabde3
fixing test case
dphulkar-msft Jan 14, 2026
d56d23d
fixing test case
dphulkar-msft Jan 14, 2026
4304cc0
fixing test case
dphulkar-msft Jan 14, 2026
a330784
Merge branch 'dphulkar/NFSHardlinkSkipSupport' of https://github.com/…
dphulkar-msft Jan 20, 2026
610bfa5
Hardlink preserve support for local to file NFS
dphulkar-msft Jan 21, 2026
1169ddf
hardlink preserve support for local to nfs
dphulkar-msft Jan 22, 2026
a303aee
hardlink preserve support for local to nfs
dphulkar-msft Jan 24, 2026
5e4a2d9
hardlink support for File NFS to local
dphulkar-msft Jan 26, 2026
047923e
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Jan 26, 2026
7436ae3
hardlink support for local to filenfs
dphulkar-msft Jan 28, 2026
9e7da8c
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Jan 28, 2026
1997557
hardlink support for local to nfs
dphulkar-msft Jan 28, 2026
bb4284b
Merge branch 'dphulkar/hardlinkDesignPOC' of https://github.com/Azure…
dphulkar-msft Jan 29, 2026
493f1c7
hardlink support for nfs to local
dphulkar-msft Feb 2, 2026
964747f
hardlink support for nfs to local
dphulkar-msft Feb 3, 2026
69bd8e8
hardlink support for nfs to local
dphulkar-msft Feb 3, 2026
314ecd5
hardlink support for nfs to nfs in progress
dphulkar-msft Feb 3, 2026
bbc83fc
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Feb 4, 2026
6b17d71
added E2E tests
dphulkar-msft Feb 5, 2026
fcc1826
added E2E tests
dphulkar-msft Feb 5, 2026
3cc85bc
incorporated review comments
dphulkar-msft Feb 9, 2026
c72dad8
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Feb 9, 2026
e04a654
incorporated review comments
dphulkar-msft Feb 9, 2026
94185c1
bug fix
dphulkar-msft Feb 10, 2026
8384620
nfs tests update
dphulkar-msft Feb 10, 2026
d0c9431
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Feb 10, 2026
7a967e8
hardlink sync support
dphulkar-msft Feb 17, 2026
751d1bf
hardlink sync support
dphulkar-msft Feb 19, 2026
d6d7159
panic fix
dphulkar-msft Feb 20, 2026
b44f27c
hardlink sync support for local to NFS
dphulkar-msft Feb 24, 2026
40810ce
hardlink sync support for local to NFS
dphulkar-msft Feb 24, 2026
3ed65af
hardlink sync support for download and S2S
dphulkar-msft Feb 24, 2026
36f98a4
added E2E tests for sync hardlink preserve scenarios
dphulkar-msft Feb 24, 2026
9a915ca
added E2E tests for sync hardlink preserve scenarios
dphulkar-msft Feb 24, 2026
704985a
inode architecture
dphulkar-msft Feb 24, 2026
76608b7
fixing test cases
dphulkar-msft Feb 25, 2026
319be96
fixing test cases
dphulkar-msft Feb 27, 2026
1066697
fixing code
dphulkar-msft Mar 2, 2026
d818301
fixed issue with taregt hardlink path
dphulkar-msft Mar 2, 2026
f44579f
fixed issue with taregt hardlink path
dphulkar-msft Mar 7, 2026
46a4afe
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Mar 7, 2026
46f9579
handled edge case scenarios for upload hardlink sync
dphulkar-msft Mar 10, 2026
8580d4d
handled edge case scenarios for upload hardlink sync
dphulkar-msft Mar 10, 2026
942cfa4
handled edge case scenarios for upload hardlink sync
dphulkar-msft Mar 10, 2026
7b3f3d2
fixed test cases
dphulkar-msft Mar 12, 2026
8ae5395
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 12, 2026
0693c5a
add hardlink preserve support for download and S2S
dphulkar-msft Mar 13, 2026
4988731
fixed test cases
dphulkar-msft Mar 13, 2026
5de8971
fixed test cases
dphulkar-msft Mar 13, 2026
8609fa9
fixed test cases
dphulkar-msft Mar 16, 2026
7904934
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
fda4f5f
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
0ffb9bb
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
2954484
fixed comments and added UTs
dphulkar-msft Mar 16, 2026
2818fd3
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 16, 2026
6865929
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
9e7d400
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
c51ddcd
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
c02e39b
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
7a232b5
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
cc7aeda
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
012d386
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
110f26e
fixed comments
dphulkar-msft Mar 16, 2026
56733f9
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 16, 2026
29ff83e
fixed TCs
dphulkar-msft Mar 16, 2026
f4f8ce5
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 16, 2026
e1b7566
resolved conflicts
dphulkar-msft Mar 16, 2026
359442d
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
a935c28
Potential fix for pull request finding
dphulkar-msft Mar 16, 2026
48198c3
fixed Tcs
dphulkar-msft Mar 17, 2026
48f8ed9
Merge branch 'dphulkar/hardlinkSyncDwldAndS2S' of https://github.com/…
dphulkar-msft Mar 17, 2026
b42e8a4
build fix
dphulkar-msft Mar 17, 2026
9408430
resolved review comments
dphulkar-msft Mar 24, 2026
bbe88b7
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 25, 2026
e92b9d0
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Mar 25, 2026
cbad3b1
Merge branch 'dphulkar/NFSOverRESTSupport' of https://github.com/Azur…
dphulkar-msft Mar 25, 2026
ab119d8
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 26, 2026
643aa0a
fixed map cocurrent access issue
dphulkar-msft Mar 26, 2026
fcb361e
Merge branch 'dphulkar/hardlinkSync' of https://github.com/Azure/azur…
dphulkar-msft Mar 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions azcopy/copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,12 @@ func (c *Client) Copy(ctx context.Context, src, dest string, opts CopyOptions) (
common.LogPathFolder = ""
}

var t *transferExecutor
ctx = context.WithValue(ctx, ste.ServiceAPIVersionOverride, ste.DefaultServiceApiVersion)
t, err := newCopyTransferExecutor(ctx, jobID, src, dest, opts, c.GetUserOAuthTokenManagerInstance())
if err != nil {
return CopyResult{}, err
}
defer t.Close()

// handle from/to pipe
if t.opts.fromTo.IsRedirection() {
Expand Down Expand Up @@ -254,9 +254,20 @@ func (c *Client) Copy(ctx context.Context, src, dest string, opts CopyOptions) (
}

type transferExecutor struct {
opts *CookedTransferOptions
trp *remoteProvider
tpt *transferProgressTracker
opts *CookedTransferOptions
trp *remoteProvider
tpt *transferProgressTracker
inodeStore *common.InodeStore
}

// Close releases resources held by the transferExecutor, including the inode store.
func (t *transferExecutor) Close() error {
if t == nil || t.inodeStore == nil {
return nil
}
err := t.inodeStore.Close()
t.inodeStore = nil
return err
}

func newCopyTransferExecutor(ctx context.Context, jobID common.JobID, src, dst string, opts CopyOptions, uotm *common.UserOAuthTokenManager) (t *transferExecutor, err error) {
Expand All @@ -271,7 +282,12 @@ func newCopyTransferExecutor(ctx context.Context, jobID common.JobID, src, dst s
return nil, err
}

store, err := common.NewInodeStore(jobID)
if err != nil {
return nil, fmt.Errorf("failed to initialize inode store: %w", err)
}

progressTracker := newTransferProgressTracker(jobID, opts.Handler, cookedOpts.fromTo)

return &transferExecutor{opts: cookedOpts, trp: copyRemote, tpt: progressTracker}, nil
return &transferExecutor{opts: cookedOpts, trp: copyRemote, tpt: progressTracker, inodeStore: store}, nil
}
1 change: 1 addition & 0 deletions azcopy/copyEnumerator.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ func (t *transferExecutor) initCopyEnumerator(ctx context.Context, logLevel comm

ExcludeContainers: t.opts.excludeContainers,
IncrementEnumeration: t.tpt.incEnumeration,
InodeStore: t.inodeStore,
})
if err != nil {
return nil, err
Expand Down
2 changes: 2 additions & 0 deletions azcopy/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ Number of Copy Transfers Failed: %v
Number of Deletions at Destination: %v
Number of Symbolic Links Skipped: %v
Number of Special Files Skipped: %v
Number of Hardlinks Transferred: %v
Number of Hardlinks Converted: %v
Number of Hardlinks Skipped: %v
Total Number of Bytes Transferred: %v
Expand All @@ -175,6 +176,7 @@ Final Job Status: %v%s%s
result.DeleteTransfersCompleted,
result.SkippedSymlinkCount,
result.SkippedSpecialFileCount,
result.HardlinksTransferCount,
result.HardlinksConvertedCount,
result.SkippedHardlinkCount,
result.TotalBytesTransferred,
Expand Down
31 changes: 27 additions & 4 deletions azcopy/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"context"
"errors"
"fmt"
"runtime"
"time"

"github.com/Azure/azure-storage-azcopy/v10/common"
Expand Down Expand Up @@ -232,9 +233,20 @@ func (c *Client) Sync(ctx context.Context, src, dest string, opts SyncOptions) (
}

type syncer struct {
opts *cookedSyncOptions
srp *remoteProvider
spt *syncProgressTracker
opts *cookedSyncOptions
srp *remoteProvider
spt *syncProgressTracker
inodeStore *common.InodeStore
}

// Close releases any resources held by the syncer, including the inode store.
func (s *syncer) Close() error {
if s == nil || s.inodeStore == nil {
return nil
}
err := s.inodeStore.Close()
s.inodeStore = nil
return err
}

func newSyncer(ctx context.Context, jobID common.JobID, src, dst string, opts SyncOptions, uotm *common.UserOAuthTokenManager) (s *syncer, err error) {
Expand All @@ -247,6 +259,17 @@ func newSyncer(ctx context.Context, jobID common.JobID, src, dst string, opts Sy
if err != nil {
return nil, err
}
store, err := common.NewInodeStore(jobID)
if err != nil {
return nil, fmt.Errorf("failed to initialize inode store: %w", err)
}
progressTracker := newSyncProgressTracker(jobID, opts.Handler)
return &syncer{opts: cookedOpts, srp: syncRemote, spt: progressTracker}, nil
sync := &syncer{opts: cookedOpts, srp: syncRemote, spt: progressTracker, inodeStore: store}

// Ensure that resources are eventually released even if the caller forgets to close the syncer.
runtime.SetFinalizer(sync, func(s *syncer) {
_ = s.Close()
})

return sync, nil
}
Loading
Loading