Keepers 2f6d731993
rename connector -> m365 (#3600)
renames /internal/connector to /internal/m365.  No logic changes in this PR.  Only the dir rename, import renames, and one linter shadowing rename.

---

#### Does this PR need a docs update or release note?

- [x]  No

#### Type of change

- [x] 🧹 Tech Debt/Cleanup

#### Issue(s)

* #1996

#### Test Plan

- [x]  Unit test
- [x] 💚 E2E
2023-06-13 18:35:39 +00:00

146 lines
3.7 KiB
Go

package graph
import (
"context"
"github.com/alcionai/corso/src/pkg/logger"
"github.com/alcionai/corso/src/pkg/path"
)
const (
AttachmentChunkSize = 4 * 1024 * 1024
// Upper limit on the number of concurrent uploads as we
// create buffer pools for each upload. This is not the actual
// number of uploads, but the max that can be specified. This is
// added as a safeguard in case we misconfigure the values.
maxConccurrentUploads = 20
// CopyBufferSize is used for chunked upload
// Microsoft recommends 5-10MB buffers
// https://docs.microsoft.com/en-us/graph/api/driveitem-createuploadsession?view=graph-rest-1.0#best-practices
CopyBufferSize = 5 * 1024 * 1024
)
// ---------------------------------------------------------------------------
// item response AdditionalData
// ---------------------------------------------------------------------------
const (
// AddtlDataRemoved is the key value in the AdditionalData map
// for when an item was deleted.
//nolint:lll
// https://learn.microsoft.com/en-us/graph/delta-query-overview?tabs=http#resource-representation-in-the-delta-query-response
AddtlDataRemoved = "@removed"
)
// ---------------------------------------------------------------------------
// Metadata Files
// ---------------------------------------------------------------------------
const (
// DeltaURLsFileName is the name of the file containing delta token(s) for a
// given endpoint. The endpoint granularity varies by service.
DeltaURLsFileName = "delta"
// PreviousPathFileName is the name of the file containing previous path(s) for a
// given endpoint.
PreviousPathFileName = "previouspath"
)
// ---------------------------------------------------------------------------
// Runtime Configuration
// ---------------------------------------------------------------------------
type parallelism struct {
// sets the collection buffer size before blocking.
collectionBuffer int
// sets the parallelism of item population within a collection.
item int
// sets the parallelism of concurrent uploads within a collection
itemUpload int
}
func (p parallelism) CollectionBufferSize() int {
if p.collectionBuffer == 0 {
return 1
}
return p.collectionBuffer
}
func (p parallelism) CollectionBufferOverride(ctx context.Context, override int) int {
logger.Ctx(ctx).Infow(
"collection buffer parallelism",
"default_parallelism", p.collectionBuffer,
"requested_paralellism", override)
if !isWithin(1, p.collectionBuffer, override) {
return p.collectionBuffer
}
return override
}
func (p parallelism) ItemOverride(ctx context.Context, override int) int {
logger.Ctx(ctx).Infow(
"item-level parallelism",
"default_parallelism", p.item,
"requested_paralellism", override)
if !isWithin(1, p.item, override) {
return p.item
}
return override
}
func (p parallelism) Item() int {
if p.item == 0 {
return 1
}
return p.item
}
func (p parallelism) ItemUpload() int {
if p.itemUpload == 0 {
return 1
}
if p.itemUpload > maxConccurrentUploads {
return maxConccurrentUploads
}
return p.itemUpload
}
// returns low <= v <= high
// if high < low, returns low <= v
func isWithin(low, high, v int) bool {
return v >= low && (high < low || v <= high)
}
var sp = map[path.ServiceType]parallelism{
path.ExchangeService: {
collectionBuffer: 4,
item: 4,
},
path.OneDriveService: {
collectionBuffer: 5,
item: 4,
itemUpload: 7,
},
// sharepoint libraries are considered "onedrive" parallelism.
// this only controls lists/pages.
path.SharePointService: {
collectionBuffer: 5,
item: 4,
},
}
// Parallelism returns the Parallelism for the requested service.
func Parallelism(srv path.ServiceType) parallelism {
return sp[srv]
}