apc

package
v1.4.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 13, 2026 License: MIT Imports: 16 Imported by: 8

Documentation

Overview

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API constant and control messages

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2024-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2025, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved.

Package apc: API control messages and constants

  • Copyright (c) 2018-2026, NVIDIA CORPORATION. All rights reserved.

Index

Constants

View Source
const (
	// object-level
	AceGET       = AccessAttrs(1) << iota // read object contents
	AceObjHEAD                            // read object metadata (properties)
	AcePUT                                // write object
	AceAPPEND                             // append to object
	AceObjDELETE                          // delete object
	AceObjMOVE                            // move/rename object
	AcePromote                            // promote local files
	AceObjUpdate                          // update object metadata; TODO: must be checked on target (NIY)

	// bucket-level
	AceBckHEAD   // read bucket metadata (properties)
	AceObjLIST   // list objects in a bucket
	AcePATCH     // set bucket properties
	AceBckSetACL // set bucket permissions

	// cluster-level
	AceListBuckets   // list all buckets in cluster
	AceShowCluster   // view cluster information
	AceCreateBucket  // create new bucket
	AceDestroyBucket // destroy/delete bucket
	AceMoveBucket    // move/rename bucket
	AceAdmin         // full administrative access: all cluster operations

	// note: must be the last one
	AceMax
)

ACL aka access permissions

View Source
const (
	// encompasses all ACEs, current and future
	AccessAll      = AccessAttrs(^uint64(0))
	AllowAllAccess = "su"

	// read-only and read-write access to bucket
	AccessRO             = AceGET | AceObjHEAD | AceBckHEAD | AceObjLIST
	AllowReadOnlyAccess  = "ro"
	AccessRW             = AccessRO | AcePUT | AceAPPEND | AceObjDELETE | AceObjMOVE | AcePromote
	AllowReadWriteAccess = "rw"

	// bucket admin operations
	AccessBucketAdmin = AcePATCH | AceBckSetACL | AceObjUpdate

	// read-only and read-write access to cluster
	ClusterAccessRO = AceListBuckets | AceShowCluster
	ClusterAccessRW = ClusterAccessRO | AceCreateBucket | AceDestroyBucket | AceMoveBucket

	AccessNone = AccessAttrs(0)
)

derived (convenience) constants

View Source
const (
	ActCreateBck   = "create-bck"  // NOTE: compare w/ ActAddRemoteBck below
	ActDestroyBck  = "destroy-bck" // destroy bucket data and metadata
	ActSetBprops   = "set-bprops"
	ActResetBprops = "reset-bprops"

	ActSummaryBck = "summary-bck"

	ActECEncode  = "ec-encode" // erasure code a bucket
	ActECGet     = "ec-get"    // read erasure coded objects
	ActECPut     = "ec-put"    // erasure code objects
	ActECRespond = "ec-resp"   // respond to other targets' EC requests

	ActCopyBck = "copy-bck"
	ActETLBck  = "etl-bck"

	ActETLInline = "etl-inline"

	ActDsort    = "dsort"
	ActDownload = "download"

	ActBlobDl = "blob-download"

	ActMakeNCopies = "make-n-copies"
	ActPutCopies   = "put-copies"
	ActRechunk     = "rechunk"
	ActIndexShard  = "index-shard"

	ActRebalance = "rebalance"
	ActMoveBck   = "move-bck"

	ActResilver = "resilver"

	ActElection = "election"

	ActLRU          = "lru"
	ActStoreCleanup = "cleanup-store"

	ActEvictRemoteBck = "evict-remote-bck" // evict remote bucket's data
	ActList           = "list"
	ActLoadLomCache   = "load-lom-cache"
	ActNewPrimary     = "new-primary"
	ActPromote        = "promote"
	ActRenameObject   = "rename-obj"

	// multipart upload
	ActMptUpload   = "mpt-upload"   // create a new multipart upload
	ActMptComplete = "mpt-complete" // complete a multipart upload
	ActMptAbort    = "mpt-abort"    // abort a multipart upload

	// cp (reverse)
	ActResetStats  = "reset-stats"
	ActResetConfig = "reset-config"
	ActSetConfig   = "set-config"

	ActRotateLogs = "rotate-logs"

	ActReloadBackendCreds = "reload-creds"

	ActClearLcache = "clear-lcache"

	ActShutdownCluster = "shutdown" // see also: ActShutdownNode

	// multi-object (via `ListRange`)
	ActCopyObjects     = "copy-listrange"
	ActDeleteObjects   = "delete-listrange"
	ActETLObjects      = "etl-listrange"
	ActEvictObjects    = "evict-listrange"
	ActPrefetchObjects = "prefetch-listrange"
	ActArchive         = "archive" // see ArchiveMsg

	ActAttachRemAis = "attach"
	ActDetachRemAis = "detach"

	ActEnableBackend  = "enable-bend"
	ActDisableBackend = "disable-bend"

	// node maintenance & cluster membership (see also ActRmNodeUnsafe below)
	ActStartMaintenance = "start-maintenance" // put into maintenance state
	ActStopMaintenance  = "stop-maintenance"  // cancel maintenance state
	ActShutdownNode     = "shutdown-node"     // shutdown node
	ActDecommissionNode = "decommission-node" // start rebalance and, when done, remove node from Smap

	ActDecommissionCluster = "decommission" // decommission all nodes in the cluster (cleanup system data)

	ActAdminJoinTarget = "admin-join-target"
	ActSelfJoinTarget  = "self-join-target"
	ActAdminJoinProxy  = "admin-join-proxy"
	ActSelfJoinProxy   = "self-join-proxy"
	ActKeepaliveUpdate = "keepalive-update"

	// IC
	ActListenToNotif     = "watch-xaction"
	ActMergeOwnershipTbl = "ic-merge-own-tbl"
	ActRegGlobalXaction  = "reg-global-xaction"

	// advanced usage
	ActCheckLock = "check-lock"

	// api/ml.go; x-moss
	ActGetBatch = "get-batch"

	// native bucket inventory
	ActCreateNBI  = "create-inventory"
	ActDestroyNBI = "destroy-inventory"
	ActShowNBI    = "show-inventory"
)

ActMsg.Action includes Xaction.Kind == ActMsg.Action (when the action is asynchronous)

View Source
const (
	// Actions on mountpaths (/v1/daemon/mountpaths)
	ActMountpathAttach  = "attach-mp"
	ActMountpathEnable  = "enable-mp"
	ActMountpathDetach  = "detach-mp"
	ActMountpathDisable = "disable-mp"

	ActMountpathRescan = "rescan-mp"
	ActMountpathFSHC   = "fshc-mp"

	// Actions on xactions
	ActXactStop  = Stop
	ActXactStart = Start
)
View Source
const (
	ActAddRemoteBck = "add-remote-bck"         // add to BMD existing remote bucket, usually on the fly
	ActHeadBckWith  = "head-bck-with-bprops"   // HEAD(cloud bucket) with one-shot bprops (such as `extra.aws.profile` et al.)
	ActRmNodeUnsafe = "rm-unsafe"              // primary => the node to be removed
	ActStartGFN     = "start-gfn"              // get-from-neighbor
	ActStopGFN      = "stop-gfn"               // off
	ActSelfRemove   = "self-initiated-removal" // e.g., when losing last mountpath
	ActPrimaryForce = "primary-force"          // set primary with force (BEWARE! advanced usage only)
	ActBumpMetasync = "bump-metasync"          // when executing ActPrimaryForce - the final step
)

intra-cluster actions (internal use)

View Source
const (
	NodeMaintenance  = "maintenance"
	NodeDecommission = "decommission"
)
View Source
const (
	ActOpenSDM  = "open-shared-dm"
	ActCloseSDM = "close-shared-dm"
)
View Source
const (
	ActOpenEC    = "open-ec-streams"
	ActCloseEC   = "close-ec-streams"
	ActEcRecover = "recover" // check and recover missing or corrupted EC metadata and/or slices, if any
)
View Source
const (
	CompressAlways = "always"
	CompressNever  = "never"
)

Compression enum

View Source
const (
	Proxy  = "proxy"
	Target = "target"
)
View Source
const (
	DeploymentK8s = "K8s"
	DeploymentDev = "dev"
)

deployment types

View Source
const (
	ReadHeaderTimeout    = 16 * time.Second
	EnvReadHeaderTimeout = "AIS_READ_HEADER_TIMEOUT"
)

in re: "Slowloris Attack"

View Source
const (
	UlimitProxy  = 16384
	UlimitTarget = 262144
)

ulimits

View Source
const (
	DefaultTimeout = time.Duration(-1)
	LongTimeout    = time.Duration(-2)
)

timeouts for intra-cluster requests

View Source
const (
	LockNone = iota
	LockRead
	LockWrite
)

locks

View Source
const (
	LsoCtlMsgPaging = ", paging"
	LsoCtlMsgRemote = ", remote"
)
View Source
const (

	// bucket inventory - request inventory-backed listing (implemented via NBI)
	HdrInventory = aisPrefix + "Bucket-Inventory" // must be present and must be "true" (or "y", "yes", "on" case-insensitive)
	HdrInvName   = aisPrefix + "Inv-Name"         // optional; name of the inventory (to override the system default)

	// GET via x-blob-download
	HdrBlobDownload    = aisPrefix + "Blob-Download"     // must be present and must be "true" (or "y", "yes", "on" case-insensitive)
	HdrBlobChunk       = aisPrefix + "Blob-Chunk"        // optional; e.g., 1mb, 2MIB, 3m, or 1234567 (bytes)
	HdrBlobWorkers     = aisPrefix + "Blob-Workers"      // optional: num concurrent downloading readers (see also: xs/nwp.go, "media type", load.Advice)
	HdrBlobReadTimeout = aisPrefix + "Blob-Read-Timeout" // per-attempt timeout for backend range read; zero selects default

	// Bucket props headers
	HdrBucketProps      = aisPrefix + "Bucket-Props"       // => cmn.Bprops
	HdrBucketSumm       = aisPrefix + "Bucket-Summ"        // => cmn.BsummResult (see also: QparamFltPresence)
	HdrBucketVerEnabled = aisPrefix + "Versioning-Enabled" // Enable/disable object versioning in a bucket.
	HdrBackendProvider  = aisPrefix + "Provider"           // ProviderAmazon et al. - see cmn/bck.go.

	// including BucketProps.Extra.AWS
	HdrS3Region   = aisPrefix + "Cloud_region"
	HdrS3Endpoint = aisPrefix + "Endpoint"
	HdrS3Profile  = aisPrefix + "Profile"

	// including BucketProps.Extra.OCI
	HdrOCIRegion = aisPrefix + "Oci-Region"

	// including BucketProps.Extra.HTTP
	HdrOrigURLBck = aisPrefix + "Original-Url"

	// remote AIS
	HdrRemAisUUID  = aisPrefix + "Remote-Ais-Uuid"
	HdrRemAisAlias = aisPrefix + "Remote-Ais-Alias"
	HdrRemAisURL   = aisPrefix + "Remote-Ais-Url"

	HdrRemoteOffline = aisPrefix + "Remote-Offline" // When accessing cached remote bucket with no backend connectivity.

	// Object props headers
	HdrObjCksumType = aisPrefix + "Checksum-Type"  // Checksum type, one of SupportedChecksums().
	HdrObjCksumVal  = aisPrefix + "Checksum-Value" // Checksum value.
	HdrObjAtime     = aisPrefix + "Atime"          // Object access time.
	HdrObjCustomMD  = aisPrefix + "Custom-Md"      // Object custom metadata.
	HdrObjVersion   = aisPrefix + "Version"        // Object version/generation - ais or cloud.

	// Append object header
	HdrAppendHandle = aisPrefix + "Append-Handle"

	// api.PutApndArchArgs message flags
	HdrPutApndArchFlags = aisPrefix + "Pine"

	// Query objects handle header
	HdrHandle = aisPrefix + "Query-Handle"

	// Reverse proxy header
	HdrNodeID = aisPrefix + "Node-Id"

	// uptimes, respectively
	HdrNodeUptime    = aisPrefix + "Node-Uptime"
	HdrClusterUptime = aisPrefix + "Cluster-Uptime"

	HdrNodeURL   = aisPrefix + "Node-Url"
	HdrNodeFlags = aisPrefix + "Node-Flags"
)
View Source
const (
	HdrAuthorization         = "Authorization" // https://developer.mozilla.org/en-US/docs/Web/HTTP/Hdrs/Authorization
	AuthenticationTypeBearer = "Bearer"
)

AuthN consts

View Source
const (
	//
	// TODO: update as aisPrefix + "Sender..."; keeping for now for backward compat.
	//
	HdrSenderID        = aisPrefix + "Caller-Id"
	HdrSenderName      = aisPrefix + "Caller-Name"
	HdrSenderIsPrimary = aisPrefix + "Caller-Is-Primary"
	HdrSenderSmapVer   = aisPrefix + "Caller-Smap-Ver"

	HdrT2TPutterID = aisPrefix + "Putter-Id" // DaemonID of the target that performs intra-cluster PUT

	HdrXactionID = aisPrefix + "Xaction-Id"

	// intra-cluster streams
	HdrSessID   = aisPrefix + "Session-Id"
	HdrCompress = aisPrefix + "Compress" // LZ4

	// Promote(dir)
	HdrPromoteNamesHash = aisPrefix + "Promote-Names-Hash"
	HdrPromoteNamesNum  = aisPrefix + "Promote-Names-Num"

	// ETL
	HdrETLPodInfo      = aisPrefix + "ETL-Pod-Info" // serialized etl.Info
	HdrDirectPutLength = aisPrefix + "Direct-Put-Length"

	// shared streams
	HdrActiveEC = aisPrefix + "Ec"
	HdrActiveDM = aisPrefix + "Dm"

	// (advanced use)
	HdrReadyToJoinClu = aisPrefix + "Ready-Join-Clu"
)

Internal (intra-cluster) headers

View Source
const (
	LocationPropSepa = ":"
	LsPropsSepa      = ","
)
View Source
const (
	// only list in-cluster objects, i.e., those from the respective remote bucket that are present (\"cached\")
	// see also: flt* enum and `LsNotCached` below
	LsCached = 1 << iota

	// include missing main obj (with copy existing)
	LsMissing

	// include obj-s marked for deletion (TODO: not implemented yet)
	LsDeleted

	// expand archives as directories
	LsArchDir

	// return only object names and, separately, statuses
	LsNameOnly

	// same as above and size (minor speedup)
	LsNameSize

	// same as fltPresence == apc.Present (see query.go)
	LsBckPresent

	// LsDontHeadRemote is introduced primarily to support GCP buckets with
	// ACL policies that allow public _anonymous_ access.
	//
	// It appears that sometimes those policies do honor HEAD(bucket),
	// while other times they don't, failing the request with 401 or 403 status.
	// See also:
	// * https://cloud.google.com/storage/docs/access-control/making-data-public
	// * cmd/cli/cli/const.go for `dontHeadRemoteFlag`
	// * `QparamDontHeadRemote` (this package)
	LsDontHeadRemote

	// list remote buckets without adding them to aistore
	// See also:
	// * cmd/cli/cli/const.go for `dontAddRemoteFlag`
	// * `QparamDontAddRemote` (this package)
	LsDontAddRemote

	// strict opposite of the `LsCached`
	LsNotCached

	// list objects without recursion (POSIX-wise).
	// see related feature flag: feat.DontOptimizeVirtualDir
	LsNoRecursion

	// bidirectional (remote <-> in-cluster) diff requires remote metadata-capable (`HasVersioningMD`) buckets;
	// it entails:
	// - checking whether remote version exists,
	//   and if it does,
	// - checking whether it differs from its in-cluster copy.
	// see related `cmn.LsoEnt` flags: `EntryVerChanged` and `EntryVerRemoved`, respectively.
	LsDiff

	// do not return virtual subdirectories - do not include them as `cmn.LsoEnt` entries
	LsNoDirs

	// the caller is s3 compatibility API
	LsIsS3

	// instead of (remote) bucket: list native bucket inventory (NBI) snapshot
	// NOTE on pagination:
	// in the context of inventory listing, lsmsg.PageSize (if non-zero) is best-effort and approximate:
	// each target delivers an approximate share of the requested page size,
	// subject to local chunking, minimum bounds, and slight overfetch
	LsNBI
)

LsoMsg flags

View Source
const (
	MaxPageSizeAIS   = 10000
	MaxPageSizeAWS   = 1000 // note: SwiftStack/AWS = 10_000
	MaxPageSizeGCP   = 1000
	MaxPageSizeAzure = 5000
	MaxPageSizeOCI   = 1000

	MaxPageSizeGlobal = MaxPageSizeAIS // NOTE: maximum across all providers
)

max page sizes see also: bprops Extra.AWS.MaxPageSize

View Source
const (
	// location _status_
	LocOK = iota
	LocMisplacedNode
	LocMisplacedMountpath
	LocIsCopy
	LocIsCopyMissingObj // missing "main replica"

	// LsoEntry Flags
	EntryIsCached   = 1 << (statusBits + 1)
	EntryInArch     = 1 << (statusBits + 2)
	EntryIsDir      = 1 << (statusBits + 3)
	EntryIsArchive  = 1 << (statusBits + 4)
	EntryVerChanged = 1 << (statusBits + 5) // see also: QparamLatestVer, et al.
	EntryVerRemoved = 1 << (statusBits + 6) // ditto
	EntryHeadFail   = 1 << (statusBits + 7)
	// added v4.0
	EntryIsChunked = 1 << (statusBits + 8) // see NOTE above
)

NOTE: approaching uint16 limit - bits 9,14,15 remaining

View Source
const (
	GetPropsName     = "name"
	GetPropsSize     = "size"
	GetPropsVersion  = "version"
	GetPropsChecksum = "checksum"
	GetPropsAtime    = "atime"
	GetPropsCached   = "cached"
	GetPropsStatus   = "status"
	GetPropsCopies   = "copies"
	GetPropsEC       = "ec"
	GetPropsCustom   = "custom"
	GetPropsLocation = "location" // advanced usage

	// 4.0
	GetPropsChunked = "chunked"
	// 4.2
	GetPropsLastModified = "last-modified"
	GetPropsETag         = "etag"
)

LsoMsg and HEAD(object) enum

View Source
const (
	MossMetaPart = "metadata"
	MossDataPart = "archive"
)
View Source
const (
	DfltInvNamesPerChunk = 2 * MaxPageSizeAIS  // 20K
	MaxInvNamesPerChunk  = 64 * MaxPageSizeAIS // 640K
	MinInvNamesPerChunk  = 2
)
View Source
const (
	AIS   = "ais"
	AWS   = "aws"
	Azure = "azure"
	GCP   = "gcp"
	OCI   = "oci"
	HT    = "ht"

	AllProviders = "ais, aws (s3://), gcp (gs://), azure (az://), oci (oc://), ht://" // NOTE: must include all

	NsUUIDPrefix = '@' // BEWARE: used by on-disk layout
	NsNamePrefix = '#' // BEWARE: used by on-disk layout

	// consistent with rfc2396.txt "Uniform Resource Identifiers (URI): Generic Syntax"
	BckProviderSeparator = "://"

	// scheme://
	DefaultScheme = "https"
	OCIScheme     = "oc"
	GSScheme      = "gs"
	S3Scheme      = "s3"
	AZScheme      = "az"
	AISScheme     = "ais"
)

Backend Provider enum

View Source
const (
	ArchAppend = 1 << iota
	ArchAppendIfExist
)

api.PutApndArchArgs flags

View Source
const (
	// see related "GET(what)" set of APIs: api/cluster and api/daemon
	QparamWhat = "what" // "smap" | "bmd" | "config" | "stats" | "xaction" ... (enum below)

	QparamProps = "props" // e.g. "checksum, size"|"atime, size"|"cached"|"bucket, size"| ...

	QparamTransient = "transient" // transient - in-memory only

	QparamUUID  = "uuid"  // Transaction/xaction UUID identifier
	QparamJobID = "jobid" // Job identifier

	// etl
	QparamETLName          = "etl_name"
	QparamETLPipeline      = "etl_pipeline"
	QparamETLTransformArgs = "etl_args"
	QparamETLFQN           = "etl_fqn"
	QparamETLSecret        = "etl_secret" // secret generated during ETL init to validate directly target access from trusted ETL

	QparamRegex      = "regex"       // dsort: list regex
	QparamOnlyActive = "only_active" // dsort: list only active

	// remove existing custom keys and store new custom metadata
	// NOTE: making an s/_/-/ naming exception because of the namesake CLI usage
	QparamNewCustom = "set-new-custom"

	// Main bucket query params.
	QparamProvider  = "provider"  // Backend provider: one of "ais", "aws", "gcp", "azure", "oci", "ht". Defaults to "ais".
	QparamNamespace = "namespace" // Bucket namespace; used for remote buckets and cross-cluster operations. Leave empty for the default namespace.

	// e.g., usage: copy bucket, copy object
	QparamBckTo = "bck_to"    // Destination bucket for copy/move operations
	QparamObjTo = "object_to" // Destination object name for copy/move operations

	// Do not add remote bucket to cluster's BMD e.g. when checking existence
	// via api.HeadBucket
	// By default, when existence of a remote buckets is confirmed the bucket's
	// metadata gets automatically (and transactionally) added to the cluster's BMD.
	// This query parameter can be used to override the default behavior.
	QparamDontAddRemote = "dont_add_remote_bck_md" // Skip auto-registering the remote bucket in cluster metadata (by default, remote buckets are registered on first access).

	// Add remote bucket to BMD _unconditionally_ and without executing HEAD request
	// (to check access and load the bucket's properties)
	// NOTE: usage is limited to setting up bucket properties with alternative
	// profile and/or endpoint
	// See also:
	// - `LsDontHeadRemote`
	// - docs/bucket.md
	// - docs/cli/aws_profile_endpoint.md
	QparamDontHeadRemote = "dont_head_remote_bck" // Add remote bucket without HEAD request validation

	// When evicting, keep remote bucket in BMD (i.e., evict data only)
	QparamKeepRemote = "keep_bck_md" // Keep bucket metadata when evicting remote bucket data

	// (api.GetBucketInfo)
	// NOTE: non-empty value indicates api.GetBucketInfo; "true" value further requires "with remote obj-s"
	QparamBinfoWithOrWithoutRemote = "bsumm_remote" // Request bucket info (any non-empty value); set to "true" to also include remote (out-of-cluster) objects in the summary.

	// "presence" in a given cluster shall not be confused with "existence" (possibly, remote).
	// See also:
	// - Flt* enum below
	// - ListObjsMsg flags, docs/providers.md (for terminology)
	QparamFltPresence = "presence" // Presence filter (integer code): 0 exists, 1 exists-no-props, 2 present, 3 present-no-props, 4 present-in-cluster, 5 exists-outside-cluster.

	// APPEND(object) operation - QparamAppendType enum below
	QparamAppendType   = "append_type"   // Type of append operation (append, flush)
	QparamAppendHandle = "append_handle" // Handle for ongoing append operations

	// HTTP bucket support.
	QparamOrigURL = "original_url" // Original URL for HTTP bucket objects

	// Get logs
	QparamLogSev  = "severity" // see { LogInfo, ...} enum
	QparamLogOff  = "offset"
	QparamAllLogs = "all"

	// The following 4 (four) QparamArch* parameters are all intended for usage with sharded datasets,
	// whereby the shards are (.tar, .tgz (or .tar.gz), .zip, and/or .tar.lz4) formatted objects.
	//
	// For the most recently updated list of supported serialization formats, please see cmn/archive package.
	//
	// "archpath" and "archmime", respectively, specify archived pathname and expected format (mime type)
	// of the containing shard; the latter is especially usable with non-standard shard name extensions;
	QparamArchpath = "archpath"
	QparamArchmime = "archmime"

	// In addition, the following two closely related parameters can be used to select multiple matching files
	// from a given shard.
	//
	// In particular, "archregx" specifies prefix, suffix, WebDataset key, _or_ general-purpose regular expression
	// that can be used to match archived filenames, and select possibly multiple files
	// (that will be then archived as a TAR and returned in one shot);
	QparamArchregx = "archregx"

	// "archmode", on the other hand, tells aistore whether to interpret "archregx" (above) as a
	// general-purpose regular expression or (alternativelyr) use it for simple and fast string comparison;
	// the latter is further formalized as `MatchMode` enum in the cmn/archive package,
	// with enumerated values including: "regexp", "prefix", "suffix", "substr", "wdskey".
	//
	// for example:
	// - given a shard containing (subdir/aaa.jpg, subdir/aaa.json, subdir/bbb.jpg, subdir/bbb.json, ...)
	//   and "wdskey" = "subdir/aaa", aistore will match and return (subdir/aaa.jpg, subdir/aaa.json).
	QparamArchmode = "archmode" // see `MatchMode` enum in cmn/archive/read

	// Skip loading existing object's metadata, in part to
	// compare its Checksum and update its existing Version (if exists).
	// Can be used to reduce PUT latency when:
	// - we massively write new content into a bucket, and/or
	// - we simply don't care.
	QparamSkipVC = "skip_vc"

	// force operation
	// used to overcome certain restrictions, e.g.:
	// - shutdown the primary and the entire cluster
	// - attach invalid mountpath
	QparamForce = "frc" // Force operation to override restrictions

	// same as `Versioning.ValidateWarmGet` (cluster config and bucket props)
	// - usage: GET and (copy|transform) x (bucket|multi-object) operations
	// - implies remote backend
	QparamLatestVer = "latest-ver" // Get latest version of objects from remote backend

	// in addition to the latest-ver (above), also entails removing remotely
	// deleted objects
	QparamSync = "synchronize"

	// validate (ie., recompute and check) in-cluster object's checksums
	QparamValidateCksum = "validate-checksum"

	// when true, skip nlog.Error and friends
	// (to opt-out logging too many messages and/or benign warnings)
	QparamSilent = "sln" // Suppress error logging and warnings

	// (see api.AttachMountpath vs. LocalConfig.FSP)
	QparamMpathLabel = "mountpath_label"

	// Request to restore an object
	QparamECObject = "object"

	QparamMptUploads  = "uploads"    // Start multipart upload
	QparamMptUploadID = "uploadId"   // Complete, abort, or list parts of specific multipart upload
	QparamMptPartNo   = "partNumber" // Part number for multipart upload
)
View Source
const (
	FltExists         = iota // (object | bucket) exists inside and/or outside cluster
	FltExistsNoProps         // same as above but no need to return props/info
	FltPresent               // bucket: is present | object: present and properly located
	FltPresentNoProps        // same as above but no need to return props/info

	// Objects are present on any target, any disk inside the cluster (including replicas, EC slices, misplaced, or rebalancing).
	// TODO: Currently, `FltPresentCluster` only checks whether the LOM can be loaded, and tries to find/restore it on the same target if loading fails.
	// This should be extended to check whether the object is present on any target or any disk inside the cluster (see also: `t.headObjBcast()`).
	FltPresentCluster
	FltExistsOutside // not present - exists _outside_ cluster (NOTE: currently, only list-buckets)
)

QparamFltPresence enum.

Describes both buckets and objects with respect to their existence/presence (or non-existence/non-presence) in AIS cluster.

"FltPresent*" refers to availability ("presence") in the cluster. For details, see the values and comments below.

Remote object or bucket that is currently not present can still be accessed with the very first access making it "present", etc.

View Source
const (
	AppendOp = "append"
	FlushOp  = "flush"
)

QparamAppendType enum.

View Source
const (
	QparamHealthReadiness = "readiness" // used by external watchdogs (K8s)
	QparamHealthReady     = QparamHealthReadiness + "=true"

	QparamAskPrimary      = "apr" // true: the caller is directing health request to primary
	QparamPrimaryReadyReb = "prr" // true: check whether primary is ready to start rebalancing cluster
)

health

View Source
const (
	QparamPID              = "pid" // ID of a redirecting proxy.
	QparamPrimaryCandidate = "can" // candidate for the primary proxy (voting ID, force URL)
	QparamPrepare          = "prp" // 2-phase commit where 'true' corresponds to 'begin'; usage: (primary election; set-primary)
	QparamUnixTime         = "utm" // Unix time since 01/01/70 UTC (nanoseconds)
	QparamIsGFNRequest     = "gfn" // true if the request is a Get-From-Neighbor
	QparamRebStatus        = "rbs" // true: get detailed rebalancing status
	QparamRebData          = "rbd" // true: get EC rebalance data (pulling data if push way fails)
	QparamClusterInfo      = "cii" // true: /Health to return `cos.NodeStateInfo` including cluster metadata versions and state flags
	QparamOWT              = "owt" // object write transaction enum { OwtPut, ..., OwtGet* }

	QparamDontResilver = "dntres" // true: do not resilver data off of mountpaths that are being disabled/detached

	// dsort
	QparamTotalCompressedSize       = "tcs"
	QparamTotalInputShardsExtracted = "tise"
	QparamTotalUncompressedSize     = "tunc"

	// 2PC transactions - control plane
	QparamNetwTimeout  = "xnt" // [begin, start-commit] timeout
	QparamHostTimeout  = "xht" // [begin, txn-done] timeout
	QparamWaitMetasync = "xwm" // true: wait for metasync (used only when there's an alternative)

	// promote
	QparamConfirmFshare = "confirm-fshr" // confirm file share
	QparamActNoXact     = "act-no-xact"  // execute synchronously, i.e. without xaction

	// Notification target's node ID (usually, the node that initiates the operation).
	QparamNotifyMe = "nft"

	// added in v4.1
	QparamSmapVer = "vpams"
	QparamNonce   = "x"
	QparamHMAC    = "u"

	// GetBatch
	QparamTID   = "tid"   // designated target
	QparamColoc = "coloc" // colocation hint: enum { 0=ColocNone, 1=ColocOne, 2=ColocTwo }

	// System
	QparamSystem = "sys"
)

Internal query params.

View Source
const (
	// cluster metadata
	WhatSmap = "smap"
	WhatBMD  = "bmd"

	// config
	WhatNodeConfig    = "config"         // query specific node for (cluster config + overrides, local config)
	WhatClusterConfig = "cluster_config" // as the name implies; identical (compressed, checksummed, versioned) copy on each node

	// configured backends
	WhatBackends = "backends"

	// stats and status
	WhatNodeStats          = "node_stats"  // redundant
	WhatNodeStatsAndStatus = "node_status" // current

	WhatDiskRWUtilCap = "disk" // read/write stats, disk utilization, capacity

	WhatMetricNames = "metrics"

	// assorted
	WhatMountpaths = "mountpaths"
	WhatRemoteAIS  = "remote"
	WhatSmapVote   = "smapvote"
	WhatSysInfo    = "sysinfo"
	WhatTargetIPs  = "target_ips" // comma-separated list of all target IPs (compare w/ GetWhatSnode)

	// log
	WhatLog = "log"

	// xactions
	WhatOneXactStatus   = "status"      // IC status by uuid (returns a single matching xaction or none)
	WhatAllXactStatus   = "status_all"  // ditto - all matching xactions
	WhatXactStats       = "getxstats"   // stats: xaction by uuid
	WhatQueryXactStats  = "qryxstats"   // stats: all matching xactions
	WhatAllRunningXacts = "running_all" // e.g. e.g.: put-copies[D-ViE6HEL_j] list[H96Y7bhR2s] ...

	// internal
	WhatSnode    = "snode"
	WhatICBundle = "ic_bundle"

	// tls
	WhatCertificate = "tls_certificate"
)

QparamWhat enum.

View Source
const (
	LogInfo = "info"
	LogWarn = "warning"
	LogErr  = "error"
)

QparamLogSev enum.

View Source
const (
	Buckets  = "buckets"
	Objects  = "objects"
	EC       = "ec"
	Daemon   = "daemon"
	Metasync = "metasync"
	Health   = "health"
	Vote     = "vote"
	S3       = "s3"
	ML       = "ml"

	// extensions
	Download = "download" // downloader
	Sort     = "sort"     // dsort
	ETL      = "etl"

	// proxy only
	Cluster = "cluster" // primary
	Tokens  = "tokens"  // auth & access
	Reverse = "reverse" // as in: reverse proxy
	IC      = "ic"      // information center
	Notifs  = "notifs"  // intra-cluster notifications

	// target only
	ObjStream = "objstream" // transport streams
	Xactions  = "xactions"  // jobs
	Txn       = "txn"       // 2PC transactions
)

API endpoints (l2)

View Source
const (
	Users      = "users"
	Clusters   = "clusters"
	Roles      = "roles"
	OIDCPrefix = ".well-known"
	OIDCConfig = "openid-configuration"
	JWKS       = "jwks.json"
	PubKey     = "public-key"
	Rotate     = "rotate-key"
)

AuthN server endpoints (l2)

View Source
const (
	Voteres  = "result"
	VoteInit = "init"
	PriStop  = "primary-stopping"

	// (see the corresponding action messages above)
	Keepalive = "keepalive"
	AdminJoin = "join-by-admin" // when node is added by admin
	SelfJoin  = "autoreg"       // self-joining cluster at node startup

	// target
	Mountpaths = "mountpaths"

	// Prometheus metrics
	Metrics = "metrics"

	// dsort, downloader
	Records     = "records"
	Shards      = "shards"
	FinishedAck = "finished_ack"
	UList       = "list"
	Remove      = "remove"

	LoadX509 = "load-x509"

	// ETL
	ETLLogs    = "logs"
	ETLObject  = "_object"
	ETLHealth  = "health"
	ETLMetrics = "metrics"

	// ETL webserver
	ETLDownload = "download"

	// ETL proxy only
	ETLStart = Start
	ETLStop  = Stop

	// ETL target only
	ETLDetails = "details"

	// ML
	Moss = "moss"
)

l3 ---

View Source
const (
	Init  = "init"
	Start = "start"
	Stop  = "stop"
	Abort = "abort"

	Finished = "finished"
	Progress = "progress"
)

common

View Source
const (
	Begin2PC  = "begin"
	Commit2PC = "commit"
	Abort2PC  = Abort

	Query2PC = "query"
)

2PC

View Source
const (
	WriteImmediate = WritePolicy("immediate") // immediate write (default)
	WriteDelayed   = WritePolicy("delayed")   // cache and flush when not accessed for a while (lom_cache_hk.go)
	WriteNever     = WritePolicy("never")     // transient - in-memory only

	WriteDefault = WritePolicy("") // same as `WriteImmediate` - see IsImmediate() below
)
View Source
const ETLPipelineSeparator = ","
View Source
const GetPropsNameSize = GetPropsName + LsPropsSepa + GetPropsSize
View Source
const HdrError = "Hdr-Error"
View Source
const (
	// HdrSignedRequestStyle describes what type of request style was used to sign the request.
	// This is important because we don't really have way of knowing if the request
	// was signed with the style:
	//	* `virtual-hosted` - https://<bucket>.s3.<region>.amazonaws.com/<path_to_object> or,
	//	* `path`           - https://s3.<region>.amazonaws.com/<bucket>/<path_to_object>.
	// By default, (if the header is empty or not set) we use `virtual-hosted` style.
	// In case, the value of this header is not valid, the error will be thrown.
	HdrSignedRequestStyle = aisPrefix + "S3-Signed-Request-Style"
)

Custom S3 headers

View Source
const HdrUA = aisPrefix + "Node"

the value for cos.HdrUserAgent header (internal usage)

View Source
const LZ4Compression = "lz4"

sent via req.Header.Set(apc.HdrCompress, LZ4Compression) (alternative to lz4 compressions upon popular request)

View Source
const (
	LsoStatusMask = (1 << statusBits) - 1
)

cmn/objlist_utils

View Source
const (
	MossMissingDir = "__404__"
)
View Source
const RemAIS = "remais" // to differentiate ais vs "remote" ais; also, default (remote ais cluster) alias
View Source
const ResetToken = "none"

[convention] reset features flags, log modules, slices inside cluster config, and more (see also: docs/cli.md "Special keywords")

View Source
const SyncSmap = "syncsmap" // obsolete (keeping it)
View Source
const Version = "v1"

API version (l1)

Variables

View Source
var (
	// TODO [v4.5]: remove V1 props and HeadObject() API and impl. - superseded by V2
	GetPropsMinimal      = []string{GetPropsName, GetPropsSize, GetPropsCached}
	GetPropsDefaultCloud = []string{GetPropsName, GetPropsSize, GetPropsCached,
		GetPropsChecksum, GetPropsVersion, GetPropsCustom}

	GetPropsDefaultAIS = []string{GetPropsName, GetPropsSize, GetPropsChecksum, GetPropsAtime}
	GetPropsAll        = []string{GetPropsName, GetPropsSize, GetPropsChecksum, GetPropsAtime,
		GetPropsVersion, GetPropsCached, GetPropsStatus, GetPropsCopies, GetPropsEC, GetPropsCustom, GetPropsLocation}

	// GetPropsAllV2 extends GetPropsAll with fields exclusive to ObjectPropsV2.
	// Note: GetPropsCached ("cached") and GetPropsStatus ("status") are intentionally
	// omitted — the V2 HEAD handler rejects them; `present` is always returned separately.
	GetPropsAllV2 = []string{GetPropsName, GetPropsSize, GetPropsChecksum, GetPropsAtime,
		GetPropsVersion, GetPropsLastModified, GetPropsETag,
		GetPropsCopies, GetPropsEC, GetPropsCustom, GetPropsLocation, GetPropsChunked}

	GetPropsMinimalV2      = []string{GetPropsName, GetPropsSize}
	GetPropsDefaultCloudV2 = []string{GetPropsName, GetPropsSize, GetPropsChecksum, GetPropsVersion, GetPropsCustom, GetPropsLastModified, GetPropsETag}
)

NOTE: update when changing any of the above :NOTE

View Source
var (
	URLPathS3 = urlpath(S3) // URLPath{[]string{S3}, S3}

	URLPathBuckets  = urlpath(Version, Buckets)
	URLPathObjects  = urlpath(Version, Objects)
	URLPathEC       = urlpath(Version, EC)
	URLPathNotifs   = urlpath(Version, Notifs)
	URLPathTxn      = urlpath(Version, Txn)
	URLPathXactions = urlpath(Version, Xactions)
	URLPathIC       = urlpath(Version, IC)
	URLPathHealth   = urlpath(Version, Health)
	URLPathMetasync = urlpath(Version, Metasync)

	URLPathClu        = urlpath(Version, Cluster)
	URLPathCluProxy   = urlpath(Version, Cluster, Proxy)
	URLPathCluUserReg = urlpath(Version, Cluster, AdminJoin)
	URLPathCluAutoReg = urlpath(Version, Cluster, SelfJoin)
	URLPathCluKalive  = urlpath(Version, Cluster, Keepalive)
	URLPathCluDaemon  = urlpath(Version, Cluster, Daemon) // (internal)
	URLPathCluSetConf = urlpath(Version, Cluster, ActSetConfig)
	URLPathCluAttach  = urlpath(Version, Cluster, ActAttachRemAis)
	URLPathCluDetach  = urlpath(Version, Cluster, ActDetachRemAis)

	URLPathCluX509 = urlpath(Version, Cluster, LoadX509)

	URLPathCluBendDisable = urlpath(Version, Cluster, ActDisableBackend)
	URLPathCluBendEnable  = urlpath(Version, Cluster, ActEnableBackend)

	URLPathDae          = urlpath(Version, Daemon)
	URLPathDaeProxy     = urlpath(Version, Daemon, Proxy)
	URLPathDaeSetConf   = urlpath(Version, Daemon, ActSetConfig)
	URLPathDaeAdminJoin = urlpath(Version, Daemon, AdminJoin)
	URLPathDaeForceJoin = urlpath(Version, Daemon, ActPrimaryForce)

	URLPathDaeBendDisable = urlpath(Version, Daemon, ActDisableBackend)
	URLPathDaeBendEnable  = urlpath(Version, Daemon, ActEnableBackend)

	URLPathDaeX509 = urlpath(Version, Daemon, LoadX509)

	URLPathReverse    = urlpath(Version, Reverse)
	URLPathReverseDae = urlpath(Version, Reverse, Daemon)

	URLPathVote        = urlpath(Version, Vote)
	URLPathVoteInit    = urlpath(Version, Vote, Init)
	URLPathVoteProxy   = urlpath(Version, Vote, Proxy)
	URLPathVoteVoteres = urlpath(Version, Vote, Voteres)
	URLPathVotePriStop = urlpath(Version, Vote, PriStop)

	URLPathdSort        = urlpath(Version, Sort)
	URLPathdSortInit    = urlpath(Version, Sort, Init)
	URLPathdSortStart   = urlpath(Version, Sort, Start)
	URLPathdSortList    = urlpath(Version, Sort, UList)
	URLPathdSortAbort   = urlpath(Version, Sort, Abort)
	URLPathdSortShards  = urlpath(Version, Sort, Shards)
	URLPathdSortRecords = urlpath(Version, Sort, Records)
	URLPathdSortMetrics = urlpath(Version, Sort, Metrics)
	URLPathdSortAck     = urlpath(Version, Sort, FinishedAck)
	URLPathdSortRemove  = urlpath(Version, Sort, Remove)

	URLPathDownload       = urlpath(Version, Download)
	URLPathDownloadAbort  = urlpath(Version, Download, Abort)
	URLPathDownloadRemove = urlpath(Version, Download, Remove)

	URLPathETL       = urlpath(Version, ETL)
	URLPathETLObject = urlpath(Version, ETL, ETLObject)

	URLPathTokens   = urlpath(Version, Tokens) // authn
	URLPathUsers    = urlpath(Version, Users)
	URLPathClusters = urlpath(Version, Clusters)
	URLPathRoles    = urlpath(Version, Roles)
	URLPathPubKey   = urlpath(Version, PubKey)
	URLPathOIDC     = urlpath(OIDCPrefix, OIDCConfig)
	URLPathJWKS     = urlpath(OIDCPrefix, JWKS)
	URLPathRotate   = urlpath(Version, Rotate)

	URLPathML = urlpath(Version, ML)
)
View Source
var Providers = cos.NewStrSet(AIS, GCP, AWS, Azure, OCI, HT)
View Source
var SupportedCompression = [...]string{CompressNever, CompressAlways}

Functions

func AccessOp

func AccessOp(access AccessAttrs) string

func DisplayProvider

func DisplayProvider(p string) string

func IsCloudProvider added in v1.3.16

func IsCloudProvider(p string) bool

func IsFltNoProps

func IsFltNoProps(v int) bool

func IsFltPresent

func IsFltPresent(v int) bool

func IsProvider

func IsProvider(p string) bool

func IsRemoteProvider added in v1.3.16

func IsRemoteProvider(p string) bool

NOTE: not to confuse w/ bck.IsRemote() which also includes remote AIS

func IsValidCompression

func IsValidCompression(c string) bool

func JoinProps added in v1.4.5

func JoinProps(props ...string) string

join object property names for the `props` query parameter; empty input maps to the default "name,size"

func NormalizeProvider

func NormalizeProvider(p string) string

func PropToHeader added in v1.3.22

func PropToHeader(prop string) string

internal (json) obj prop => canonical http header usage: - target InitObjProps2Hdr - api/object

func Ptr added in v1.3.22

func Ptr[T any](v T) *T

func SupportedPermissions

func SupportedPermissions() []string

verbs

func ToScheme

func ToScheme(p string) string

Types

type AccessAttrs

type AccessAttrs uint64

func StrToAccess

func StrToAccess(accessStr string) (access AccessAttrs, err error)

func (AccessAttrs) Describe

func (a AccessAttrs) Describe(all bool) string

func (AccessAttrs) Has

func (a AccessAttrs) Has(perms AccessAttrs) bool

func (AccessAttrs) String

func (a AccessAttrs) String() string

type ActMsg added in v1.3.16

type ActMsg struct {
	Value  any    `json:"value"`  // action-specific and optional
	Action string `json:"action"` // ActShutdown, ActRebalance, and many more (see apc/const.go)
	Name   string `json:"name"`   // action-specific info of any kind (not necessarily "name")
}

ActMsg is a JSON-formatted control structures used in a majority of API calls

func (*ActMsg) String added in v1.3.16

func (msg *ActMsg) String() string

func (*ActMsg) StringEx added in v1.3.18

func (msg *ActMsg) StringEx() string

type ActValRmNode

type ActValRmNode struct {
	DaemonID          string `json:"sid"`
	SkipRebalance     bool   `json:"skip_rebalance"`
	RmUserData        bool   `json:"rm_user_data"`        // decommission-only
	KeepInitialConfig bool   `json:"keep_initial_config"` // ditto (to be able to restart a node from scratch)
	NoShutdown        bool   `json:"no_shutdown"`
}

ActMsg is a JSON-formatted control structures used in a majority of API calls

type ArchiveMsg added in v1.3.18

type ArchiveMsg struct {
	TxnUUID     string `json:"-"` // Internal use only
	FromBckName string `json:"-"` // Internal use only
	// Destination archive object name, including a supported archive
	// extension (`.tar`, `.tgz`, `.tar.gz`, `.zip`, `.tar.lz4`).
	ArchName string `json:"archname"`
	// Override the archive MIME type. When set, takes precedence over
	// the extension inferred from `archname`.
	Mime string `json:"mime"` // +gen:optional
	ListRange
	// Store archived entries under each source object's base name
	// only, stripping any virtual directory prefix.
	BaseNameOnly bool `json:"bnonly"` // +gen:optional
	// Prefix archived entry names with the source bucket name.
	InclSrcBname bool `json:"isbn"` // +gen:optional
	// Append to the destination archive if it already exists.
	AppendIfExists bool `json:"aate"` // +gen:optional
	// Soft-error semantics for per-entry retrieval or processing
	// failures. Support varies by job.
	ContinueOnError bool `json:"coer"` // +gen:optional
	// Do not archive contents of nested virtual subdirectories.
	NonRecurs bool `json:"non-recurs,omitempty"` // +gen:optional
}

ArchiveMsg parameterizes archiving multiple objects into a single archive ("shard") object - one of `.tar`, `.tgz` / `.tar.gz`, `.zip`, or `.tar.lz4`. Source objects are selected via ListRange. See cmn.ArchiveMsg for the full request that wraps this with a destination bucket.

For the single-object append variant, see api.PutApndArchArgs.

type BlobMsg added in v1.3.22

type BlobMsg struct {
	ChunkSize        int64        `json:"chunk-size"`                   // as in: chunk size
	FullSize         int64        `json:"full-size"`                    // user-specified (full) size of the object to download
	ChunkReadTimeout cos.Duration `json:"chunk-read-timeout,omitempty"` // per-attempt timeout for backend range read; zero selects default
	NumWorkers       int          `json:"num-workers"`                  // number of concurrent workers; auto-computed when zero (see xs/nwp.go, "media type", load.Advice)
	LatestVer        bool         `json:"latest-ver"`                   // when true and in-cluster: check with remote whether (deleted | version-changed)
}

func (*BlobMsg) FromHeader added in v1.3.22

func (msg *BlobMsg) FromHeader(hdr http.Header) error

using textproto.CanonicalMIMEHeaderKey() to check presence - if a given key is present and is an empty string, it's an error

type BsummCtrlMsg added in v1.3.18

type BsummCtrlMsg struct {
	// Stable ID that ties together the pages/streaming chunks of
	// one summary computation. Server-assigned on the first
	// response; the client echoes it back on each subsequent page.
	UUID string `json:"uuid"` // +gen:optional
	// Include only objects whose name starts with this prefix.
	Prefix string `json:"prefix"` // +gen:optional
	// Restrict the summary to objects currently cached in the
	// cluster. When `false`, remote objects are also counted.
	ObjCached bool `json:"cached"` // +gen:optional
	// Require the bucket to already be present in BMD. When
	// `false` and the bucket is remote-not-yet-present, the server
	// may add it on the fly (unless `dont_add_remote` is also set).
	BckPresent bool `json:"present"` // +gen:optional
	// Do not add a remote bucket to BMD as a side effect of
	// summarizing it. Takes precedence over `present`.
	DontAddRemote bool `json:"dont_add_remote"` // +gen:optional
}

BsummCtrlMsg is the control message for computing a bucket summary (object count, total size, used percentage, etc.). Depending on the flags below, the summary covers only cached-in-cluster objects or all objects (cached + remote).

func (*BsummCtrlMsg) Str added in v1.3.26

func (msg *BsummCtrlMsg) Str(cname string, sb *cos.SB)

type BsummResult added in v1.3.18

type BsummResult struct {
	ObjCount struct {
		Present uint64 `json:"obj_count_present,string"`
		Remote  uint64 `json:"obj_count_remote,string"`
	}
	ObjSize struct {
		Min int64 `json:"obj_min_size"`
		Avg int64 `json:"obj_avg_size"`
		Max int64 `json:"obj_max_size"`
	}
	TotalSize struct {
		OnDisk      uint64 `json:"size_on_disk,string"`          // sum(dir sizes) aka "apparent size"
		PresentObjs uint64 `json:"size_all_present_objs,string"` // sum(cached object sizes)
		RemoteObjs  uint64 `json:"size_all_remote_objs,string"`  // sum(all object sizes in a remote bucket)
		Disks       uint64 `json:"total_disks_size,string"`
	}
	UsedPct      uint64 `json:"used_pct"`
	IsBckPresent bool   `json:"is_present"` // in BMD
}

"summarized" result for a given bucket

type CapacityInfo

type CapacityInfo struct {
	Used    uint64  `json:"fs_used,string"`
	Total   uint64  `json:"fs_capacity,string"`
	PctUsed float64 `json:"pct_fs_used"`
}

sysinfo

type ClusterSysInfo

type ClusterSysInfo struct {
	Proxy  map[string]*MemCPUInfo `json:"proxy"`
	Target map[string]*TSysInfo   `json:"target"`
}

sysinfo

type ClusterSysInfoRaw

type ClusterSysInfoRaw struct {
	Proxy  cos.JSONRawMsgs `json:"proxy"`
	Target cos.JSONRawMsgs `json:"target"`
}

sysinfo

type ColocLevel added in v1.4.3

type ColocLevel uint8
const (
	ColocNone ColocLevel = iota // no optimization
	ColocOne                    // target-aware: when routing request, select DT (leader) to maximize number of entries per target
	ColocTwo                    // shard-aware: ColocOne + cache hot shards in memory
)

type CopyBckMsg

type CopyBckMsg struct {
	// Prefix prepended to destination object names.
	Prepend string `json:"prepend"` // +gen:optional
	// Select only source objects (or virtual subdirectories)
	// whose names start with this prefix.
	Prefix string `json:"prefix"` // +gen:optional
	// Visit all source objects but make no modifications (preview).
	DryRun bool `json:"dry_run"` // +gen:optional
	// Force the operation even when other xactions with limited
	// coexistence are already running.
	Force bool `json:"force"` // +gen:optional
	// For remote sources, revalidate each object's latest version
	// before copying. Overrides the bucket's
	// `versioning.validate_warm_get`.
	LatestVer bool `json:"latest-ver"` // +gen:optional
	// Synchronize destination with source by deleting destination
	// objects no longer present at source. Overrides the bucket's
	// `versioning.synchronize`.
	Sync bool `json:"synchronize"` // +gen:optional
	// Do not recurse into nested virtual subdirectories.
	NonRecurs bool `json:"non-recurs,omitempty"` // +gen:optional
}

CopyBckMsg is the shared knobs subset used by offline bucket-to-bucket and multi-object copy/transform.

func (*CopyBckMsg) Str added in v1.3.26

func (msg *CopyBckMsg) Str(sb *cos.SB, fromCname, toCname, tag string)

type CreateNBIMsg added in v1.4.3

type CreateNBIMsg struct {
	// Optional inventory name. Must be unique per bucket.
	Name string `json:"name,omitempty"` // +gen:optional
	LsoMsg

	// Number of object names to store in each inventory chunk; zero
	// selects a server-side default (DfltInvNamesPerChunk). Requested
	// properties are stored alongside each name. Advanced tuning only.
	NamesPerChunk int64 `json:"names_per_chunk,omitempty"` // +gen:optional

	// Remove any existing inventory for this bucket before creating
	// the new one (only one inventory per bucket is supported).
	Force bool `json:"force,omitempty"` // +gen:optional
}

CreateNBIMsg requests creation of a Native Bucket Inventory (NBI): a local, flat, lexicographically-ordered snapshot of a remote bucket's namespace (object names plus selected properties). Once created, inventories can back fast, cheap listings that do not re-walk the remote backend. NBI applies to remote buckets only (S3, GCS, Azure, OCI, remote AIS); not to ais:// buckets. Embeds LsoMsg to reuse prefix, props, and flag semantics during inventory generation. See docs/nbi.md for the full design.

func (*CreateNBIMsg) SetValidate added in v1.4.3

func (m *CreateNBIMsg) SetValidate() error

validate; set defaults

type ETLPipeline added in v1.4.0

type ETLPipeline []string

func (*ETLPipeline) Join added in v1.4.0

func (ep *ETLPipeline) Join(node string)

func (*ETLPipeline) Pack added in v1.4.0

func (ep *ETLPipeline) Pack() string

func (*ETLPipeline) String added in v1.4.0

func (ep *ETLPipeline) String() string

type EvdMsg added in v1.3.28

type EvdMsg struct {
	ListRange
	// Number of concurrent workers:
	//   - `0`: Auto-computed.
	//   - `-1`: Serial execution in the iterating goroutine.
	//   - `>0`: Exact worker count.
	NumWorkers int `json:"num-workers,omitempty"` // +gen:optional
	// Soft-error semantics for per-object retrieval or processing
	// failures. Support varies by job.
	ContinueOnError bool `json:"coer,omitempty"` // +gen:optional
	// Do not recurse into nested virtual subdirectories.
	NonRecurs bool `json:"non-recurs,omitempty"` // +gen:optional
}

EvdMsg parameterizes multi-object delete and evict ("evd") operations. Objects are selected via ListRange. For evict, only the in-cluster (cached) copy is removed; for delete, the object is removed from both the cluster and (when applicable) the remote backend.

type IndexShardMsg added in v1.4.5

type IndexShardMsg struct {
	Prefix     string `json:"prefix,omitempty"`      // only index shards whose name begins with Prefix
	NumWorkers int    `json:"num-workers,omitempty"` // number of concurrent workers; (-1) none; (0) auto-computed (media type + load)
	SkipVerify bool   `json:"skip-verify,omitempty"` // if shard already has an index, trust it without loading+verifying staleness (fast re-run)
}

IndexShardMsg is the control message for ActIndexShard xaction.

type JoinNodeResult

type JoinNodeResult struct {
	DaemonID    string `json:"daemon_id"`
	RebalanceID string `json:"rebalance_id"`
}

type ListRange added in v1.3.18

type ListRange struct {
	// Range template selecting objects by name (e.g.
	// `"shard-{001..999}.tar"`).
	Template string `json:"template"` // +gen:optional
	// Explicit list of object names.
	ObjNames []string `json:"objnames"` // +gen:optional
}

ListRange selects the objects a multi-object operation will act on. Three modes:

  • `objnames` set: operate on exactly those named objects
  • `template` set: operate on objects matching the range template (e.g. `"shard-{001..999}.tar"`)
  • both empty: operate on all objects in the source bucket

func (*ListRange) HasTemplate added in v1.3.18

func (lrm *ListRange) HasTemplate() bool

func (*ListRange) IsList added in v1.3.18

func (lrm *ListRange) IsList() bool

func (*ListRange) Str added in v1.3.26

func (lrm *ListRange) Str(sb *cos.SB, isPrefix bool)

type LsoMsg

type LsoMsg struct {
	// Request headers forwarded to the backend (remote buckets only).
	Header http.Header `json:"hdr,omitempty"` // +gen:optional
	// Stable ID that ties all pages of one listing together.
	// Server-assigned on the first response; echoed by the client
	// on each subsequent page.
	UUID string `json:"uuid"` // +gen:optional
	// Comma-separated list of object properties to include per
	// entry (e.g. `"checksum,size,custom"`). See the `GetProps*`
	// constants in this package for the full set. Empty selects
	// server-side defaults.
	Props string `json:"props"` // +gen:optional
	// Go time format used to render time-valued properties.
	// Defaults to RFC822.
	TimeFormat string `json:"time_format,omitempty"` // +gen:optional
	// Return only entries whose name starts with this prefix. For
	// archive objects, the prefix also matches paths inside the
	// archive (e.g. `"A.tar/tutorials/"`).
	Prefix string `json:"prefix"` // +gen:optional
	// Start listing strictly after this name (exclusive). AIS
	// buckets only.
	StartAfter string `json:"start_after,omitempty"` // +gen:optional
	// Opaque token returned by the previous page; pass it back to
	// fetch the next page. Empty on the first request; empty again
	// once the listing is exhausted.
	ContinuationToken string `json:"continuation_token"` // +gen:optional
	// Pin the backend list-objects call to a single target by
	// daemon ID. Advanced; typically left empty.
	SID string `json:"target"` // +gen:optional
	// Bit flags selecting presentation and filters (see the `Ls*`
	// constants, e.g. `LsCached`, `LsNotCached`, `LsDiff`,
	// `LsNameOnly`, `LsNameSize`, `LsNoRecursion`).
	Flags uint64 `json:"flags,string"` // +gen:optional
	// Maximum entries returned in a single page. `0` selects the
	// server-side default.
	PageSize int64 `json:"pagesize"` // +gen:optional
}

LsoMsg is the list-objects control message. It carries paging state (`uuid`, `continuation_token`) plus filters and presentation options that select which objects to return and which properties to include. For multi-page listings, the server echoes an opaque `continuation_token` that the client passes back on the next request; `uuid` ties all pages of the same listing together.

func (*LsoMsg) AddProps

func (lsmsg *LsoMsg) AddProps(propNames ...string)

func (*LsoMsg) ClearFlag added in v1.3.21

func (lsmsg *LsoMsg) ClearFlag(flag uint64)

func (*LsoMsg) Clone

func (lsmsg *LsoMsg) Clone() *LsoMsg

func (*LsoMsg) IsFlagSet

func (lsmsg *LsoMsg) IsFlagSet(flags uint64) bool

func (*LsoMsg) NormalizeNameSizeDflt added in v1.4.3

func (lsmsg *LsoMsg) NormalizeNameSizeDflt()

default props & flags => user-provided message

func (*LsoMsg) PropsSet

func (lsmsg *LsoMsg) PropsSet() (s cos.StrSet)

func (*LsoMsg) SetFlag

func (lsmsg *LsoMsg) SetFlag(flag uint64)

LsoMsg flags enum: LsCached, ...

func (*LsoMsg) Str added in v1.3.26

func (lsmsg *LsoMsg) Str(cname string, sb *cos.SB)

func (*LsoMsg) ValidateNBI added in v1.4.3

func (m *LsoMsg) ValidateNBI() error

func (*LsoMsg) WantOnlyRemoteProps

func (lsmsg *LsoMsg) WantOnlyRemoteProps() bool

func (*LsoMsg) WantProp

func (lsmsg *LsoMsg) WantProp(propName string) bool

type MemCPUInfo added in v1.3.16

type MemCPUInfo struct {
	MemUsed    uint64      `json:"mem_used" msg:"u"`
	MemAvail   uint64      `json:"mem_avail" msg:"a"`
	PctMemUsed float64     `json:"pct_mem_used" msg:"p"`
	PctCPUUsed float64     `json:"pct_cpu_used" msg:"c"`
	LoadAvg    sys.LoadAvg `json:"load_avg" msg:"l"`
	// added in 4.4
	CPUUtil      int64 `json:"cpu_util" msg:"t"`
	CPUThrottled int64 `json:"cpu_throttled,omitempty" msg:"h,omitempty"`
	// added in 4.5
	Mem  *sys.MemStat   `json:"mem,omitempty" msg:"m,omitempty"`
	Proc *sys.ProcStats `json:"proc,omitempty" msg:"r,omitempty"`
}

func GetMemCPU added in v1.3.16

func GetMemCPU() MemCPUInfo

func (*MemCPUInfo) DecodeMsg added in v1.4.5

func (z *MemCPUInfo) DecodeMsg(dc *msgp.Reader) (err error)

DecodeMsg implements msgp.Decodable

func (*MemCPUInfo) EncodeMsg added in v1.4.5

func (z *MemCPUInfo) EncodeMsg(en *msgp.Writer) (err error)

EncodeMsg implements msgp.Encodable

func (*MemCPUInfo) Msgsize added in v1.4.5

func (z *MemCPUInfo) Msgsize() (s int)

Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message

type MossIn added in v1.3.30

type MossIn struct {
	ObjName string `json:"objname"`
	// optional fields
	Bucket   string `json:"bucket,omitempty"`   // if present, overrides cmn.Bck from the GetBatch request
	Provider string `json:"provider,omitempty"` // e.g. "s3", "ais", etc.
	Uname    string `json:"uname,omitempty"`    // per-object, fully qualified - defines the entire (bucket, provider, objname) triplet, and more
	ArchPath string `json:"archpath,omitempty"` // extract the specified file from an object ("shard") formatted as: .tar, .tgz or .tar.gz, .zip, .tar.lz4;
	Opaque   []byte `json:"opaque,omitempty"`   // user-provided identifier - e.g., to maintain one-to-many
	Start    int64  `json:"start,omitempty"`
	Length   int64  `json:"length,omitempty"`
}

func (*MossIn) NameInRespArch added in v1.3.30

func (in *MossIn) NameInRespArch(bucket string, onlyObjName bool) string

in-archive naming [convention]: bucket/object skipping provider, uuid, and/or namespace

func (*MossIn) UnmarshalJSON added in v1.3.30

func (in *MossIn) UnmarshalJSON(data []byte) error

validate ArchPath and ObjName

type MossOut added in v1.3.30

type MossOut struct {
	ObjName  string `json:"objname"`            // same as the corresponding MossIn.ObjName
	ArchPath string `json:"archpath,omitempty"` // ditto
	Bucket   string `json:"bucket"`             // ditto
	Provider string `json:"provider"`           // ditto
	ErrMsg   string `json:"err_msg,omitempty"`  // e.g., when missing
	Opaque   []byte `json:"opaque,omitempty"`   // from the corresponding MossIn; multi-objname logic on the client side
	Size     int64  `json:"size"`
}

type MossReq added in v1.3.30

type MossReq struct {
	OutputFormat  string     `json:"mime,omitempty"`  // enum { archive.ExtTar, archive.ExtTGZ, ... } from "cmn/archive/mime.go"; empty string defaults to TAR
	In            []MossIn   `json:"in"`              // of arbitrary size >= 1
	ContinueOnErr bool       `json:"coer,omitempty"`  // primary usage: ignore missing files and/or objects - include them under "__404__/" prefix and keep going
	OnlyObjName   bool       `json:"onob"`            // name-in-archive: default naming convention is <Bucket>/<ObjName>; set this flag to have <ObjName> only
	StreamingGet  bool       `json:"strm"`            // stream resulting archive prior to finalizing it in memory
	Colocation    ColocLevel `json:"coloc,omitempty"` // enum { 0=ColocNone, 1=ColocOne, 2=ColocTwo }
}

type MossResp added in v1.3.30

type MossResp struct {
	UUID string    `json:"uuid"`
	Out  []MossOut `json:"out"`
}

type MountpathList

type MountpathList struct {
	Available []string `json:"available"`
	WaitingDD []string `json:"waiting_dd"`
	Disabled  []string `json:"disabled"`
}

MountpathList contains two lists:

  • Available - list of local mountpaths available to the storage target
  • WaitingDD - waiting for resilvering completion to be detached or disabled (moved to `Disabled`)
  • Disabled - list of disabled mountpaths, the mountpaths that generated IO errors followed by (FSHC) health check, etc.

type MptCompletedPart added in v1.4.0

type MptCompletedPart struct {
	ETag       string `json:"etag"`
	PartNumber int    `json:"part-number"`
}

type MptCompletedParts added in v1.4.0

type MptCompletedParts []MptCompletedPart

func (MptCompletedParts) Len added in v1.4.0

func (m MptCompletedParts) Len() int

type NBIInfo added in v1.4.3

type NBIInfo struct {
	Bucket  string `json:"bucket"`
	Name    string `json:"name"`
	ObjName string `json:"obj_name"`
	Size    int64  `json:"size"` // inventory size on disk
	NBIMeta
}

type NBIInfoMap added in v1.4.3

type NBIInfoMap map[string]*NBIInfo // by NBIInfo.ObjName

func (NBIInfoMap) Names added in v1.4.3

func (m NBIInfoMap) Names() []string

func (NBIInfoMap) SingleName added in v1.4.3

func (m NBIInfoMap) SingleName() string

type NBIMeta added in v1.4.3

type NBIMeta struct {
	Prefix   string `json:"prefix,omitempty"`   // lsmsg.Prefix
	Started  int64  `json:"started,omitempty"`  // time started creating (ns)
	Finished int64  `json:"finished,omitempty"` // finished (ns)
	Ntotal   int64  `json:"ntotal,omitempty"`   // total number of names in the inventory
	SmapVer  int64  `json:"smap_ver,omitempty"` // cluster map when writing inventory
	Chunks   int32  `json:"chunks,omitempty"`   // number of chunks (manifest.Count())
	Nat      int32  `json:"nat,omitempty"`      // number of active (not in maintenance) targets
}

type PrefetchMsg added in v1.3.22

type PrefetchMsg struct {
	ListRange
	// Object-size threshold (bytes): objects larger than this are
	// fetched via the blob downloader; smaller objects are fetched as
	// a single cold GET. `0` selects the server default.
	BlobThreshold int64 `json:"blob-threshold"` // +gen:optional
	// Chunk size for blob-downloads started by prefetch
	BlobChunkSize int64 `json:"blob-chunk-size,omitempty"` // +gen:optional
	// Number of workers for each blob-download started by prefetch; auto-computed when zero
	BlobNumWorkers int `json:"blob-num-workers,omitempty"` // +gen:optional
	// Number of concurrent workers:
	//   - `0`: Auto-computed.
	//   - `-1`: No additional workers.
	//   - `>0`: Exact worker count.
	NumWorkers int `json:"num-workers"` // +gen:optional
	// Soft-error semantics for per-object retrieval or processing
	// failures. Support varies by job.
	ContinueOnError bool `json:"coer"` // +gen:optional
	// For in-cluster objects, revalidate against the remote backend
	// and refetch if the remote copy was deleted or its version
	// changed. Overrides the bucket's `versioning.validate_warm_get`.
	LatestVer bool `json:"latest-ver"` // +gen:optional
	// Do not recurse into nested virtual subdirectories.
	NonRecurs bool `json:"non-recurs,omitempty"` // +gen:optional
}

PrefetchMsg parameterizes multi-object prefetch from a remote bucket into the cluster. Objects are selected via ListRange. Objects already cached in-cluster are skipped unless `latest-ver` is set, in which case their version is revalidated against the backend.

func (*PrefetchMsg) Str added in v1.3.26

func (msg *PrefetchMsg) Str(isPrefix bool) string

+ctlmsg

type PromoteArgs added in v1.3.22

type PromoteArgs struct {
	DaemonID  string `json:"tid,omitempty"` // target ID
	SrcFQN    string `json:"src,omitempty"` // source file or directory (must be absolute pathname)
	ObjName   string `json:"obj,omitempty"` // destination object name or prefix
	Recursive bool   `json:"rcr,omitempty"` // recursively promote nested dirs
	// once successfully promoted:
	OverwriteDst bool `json:"ovw,omitempty"` // overwrite destination
	DeleteSrc    bool `json:"dls,omitempty"` // remove source when (and after) successfully promoting
	// explicit request _not_ to treat the source as a potential file share
	// and _not_ to try to auto-detect if it is;
	// (auto-detection takes time, etc.)
	SrcIsNotFshare bool `json:"notshr,omitempty"` // the source is not a file share equally accessible by all targets
}

common part that's used in `api.PromoteArgs` and `PromoteParams`(server side), both

func (*PromoteArgs) Str added in v1.4.1

func (msg *PromoteArgs) Str(sb *cos.SB)

type RechunkMsg added in v1.4.3

type RechunkMsg struct {
	// Object-size threshold (bytes):
	//   - `0`: Disable chunking; restore any existing chunked objects
	//     to monolithic form.
	//   - `>0`: Rechunk objects at or above this size.
	ObjSizeLimit int64 `json:"objsize-limit"` // +gen:optional
	// Target chunk size in bytes.
	ChunkSize int64 `json:"chunk-size"` // +gen:optional
	// Rechunk only objects whose name starts with this prefix. Empty
	// applies to all objects in the bucket.
	Prefix string `json:"prefix"` // +gen:optional
	// Also write rechunked objects back to the remote backend.
	SyncRemote bool `json:"sync-remote"` // +gen:optional
}

RechunkMsg parameterizes an in-place transform of a bucket's objects between monolithic and chunked storage formats.

Rechunk operates only on in-cluster (cached) objects and does not fetch from remote backends. Set `sync-remote` to also write the rechunked result back to the remote backend.

type TCBMsg

type TCBMsg struct {
	// Destination object extension remap (e.g. `{"jpg": "png"}`).
	// Warning: if source objects share a base name but differ only
	// in extension, remapping may cause overwrites at the
	// destination. May be deprecated in a future release.
	Ext cos.StrKVs `json:"ext"` // +gen:optional

	CopyBckMsg
	Transform

	// Number of concurrent workers:
	//   - `0`: Auto-computed.
	//   - `-1`: Run serially (TCO) or one worker per mountpath (TCB).
	//   - `>0`: Exact worker count.
	NumWorkers int `json:"num-workers,omitempty"` // +gen:optional

	// Soft-error semantics for per-object retrieval or processing
	// failures. Support varies by job.
	ContinueOnError bool `json:"coer,omitempty"` // +gen:optional
}

TCBMsg parameterizes offline bucket-to-bucket copy and transform (TCB). The multi-object variant is cmn.TCOMsg.

func (*TCBMsg) ToName

func (msg *TCBMsg) ToName(name string) string

Replace extension and add suffix if provided.

type TCOMsg added in v1.3.24

type TCOMsg struct {
	TxnUUID string // Internal plstcx client transaction ID (one control message).
	ListRange
	TCBMsg
}

TCOMsg is the multi-object copy & transform payload. Source objects are selected via ListRange. See cmn.TCOMsg for the full request that wraps this with a destination bucket.

type TSysInfo

type TSysInfo struct {
	MemCPUInfo
	CapacityInfo
}

sysinfo

type Transform added in v1.3.16

type Transform struct {
	// Name of the ETL to apply as the primary transform.
	Name string `json:"id,omitempty"` // +gen:optional
	// Additional ETL names, applied in order after the primary.
	Pipeline []string `json:"pipeline,omitempty"` // +gen:optional
	// Per-object transform request timeout (Go duration, e.g. `"30s"`).
	Timeout cos.Duration `json:"request_timeout,omitempty"` // +gen:optional
}

Transform selects an ETL transformation (or pipeline) to apply to each object during copy/transform. All fields are interpreted only for the ETL actions (etl-bck, etl-objects, etl-listrange); ignored for the plain copy actions (copy-bck, copy-objects, copy-listrange).

type URLPath

type URLPath struct {
	S string
	L []string
}

func (URLPath) Join

func (u URLPath) Join(words ...string) string

type WritePolicy

type WritePolicy string

write policy (enum and accessors) applies to both AIS metadata and data; bucket-configurable with global defaults via cluster config

func (WritePolicy) IsImmediate

func (wp WritePolicy) IsImmediate() bool

func (WritePolicy) Validate

func (wp WritePolicy) Validate() (err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL