gfspapp

package
v0.2.3-alpha.10 Latest Latest
Warning

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

Go to latest
Published: Jul 25, 2023 License: GPL-3.0 Imports: 46 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// EnvLocal defines the default environment.
	EnvLocal = "local"
	// EnvDevnet defines the devnet environment.
	EnvDevnet = "devnet"
	// EvnQanet defines the qanet environment.
	EvnQanet = "qanet"
	// EvnTestnet defines the testnet environment.
	EvnTestnet = "testnet"
	// EnvMainnet defines the mainnet environment. And as default environment.
	EnvMainnet = "mainnet"

	// DefaultGfSpAppIDPrefix defines the default app id prefix.
	DefaultGfSpAppIDPrefix = "gfsp"
	// DefaultGRPCAddress defines the default gRPC address.
	DefaultGRPCAddress = "localhost:9333"
	// DefaultMetricsAddress defines the default metrics service address.
	DefaultMetricsAddress = "localhost:24367"
	// DefaultPProfAddress defines the default pprof service address.
	DefaultPProfAddress = "localhost:24368"

	// DefaultChainID defines the default greenfield chainID.
	DefaultChainID = "greenfield_9000-121"
	// DefaultChainAddress defines the default greenfield address.
	DefaultChainAddress = "http://localhost:26750"

	// DefaultMemoryLimit defines the default memory limit for resource manager.
	DefaultMemoryLimit = 8 * 1024 * 1024 * 1024
	// DefaultTaskTotalLimit defines the default total task limit for resource manager.
	DefaultTaskTotalLimit = 10240
	// DefaultHighTaskLimit defines the default high priority task limit for resource manager.
	DefaultHighTaskLimit = 128
	// DefaultMediumTaskLimit defines the default medium priority task limit for resource manager.
	DefaultMediumTaskLimit = 1024
	// DefaultLowTaskLimit defines the default low priority task limit for resource manager.
	DefaultLowTaskLimit = 16
)
View Source
const (
	ApproverSuccessGetBucketApproval = "approver_get_bucket_success"
	ApproverFailureGetBucketApproval = "approver_get_bucket_failure"
	ApproverSuccessGetObjectApproval = "approver_get_object_success"
	ApproverFailureGetObjectApproval = "approver_get_object_failure"

	AuthSuccess = "auth_success"
	AuthFailure = "auth_failure"

	DownloaderSuccessGetPiece         = "downloader_get_piece_success"
	DownloaderFailureGetPiece         = "downloader_get_piece_failure"
	DownloaderSuccessGetChallengeInfo = "downloader_get_challenge_info_success"
	DownloaderFailureGetChallengeInfo = "downloader_get_challenge_info_failure"

	ManagerBeginUpload           = "manager_begin_upload_success"
	ManagerFailureBeginUpload    = "manager_begin_upload_failure"
	ManagerSuccessDispatchTask   = "manager_dispatch_task_success"
	ManagerDispatchReplicateTask = "manager_dispatch_replicate_task_success"
	ManagerDispatchSealTask      = "manager_dispatch_seal_task_success"
	ManagerDispatchReceiveTask   = "manager_dispatch_receive_task_success"
	ManagerDispatchGCObjectTask  = "manager_dispatch_gc_object_task_success"
	ManagerDispatchRecoveryTask  = "manager_dispatch_recovery_task_success"
	ManagerNoDispatchTask        = "manager_no_dispatch_task_failure"
	ManagerFailureDispatchTask   = "manager_dispatch_task_failure"
	ManagerReportTask            = "manager_report_task_success"
	ManagerReportUploadTask      = "manager_report_upload_task_success"
	ManagerReportReplicateTask   = "manager_report_replicate_task_success"
	ManagerReportSealTask        = "manager_report_seal_task_success"
	ManagerReportReceiveTask     = "manager_report_receive_task_success"
	ManagerReportGCObjectTask    = "manager_report_gc_object_task_success"
	ManagerReportRecoveryTask    = "manager_report_recovery_task_success"

	ReceiverSuccessReplicatePiece     = "receiver_replicate_piece_success"
	ReceiverFailureReplicatePiece     = "receiver_replicate_piece_failure"
	ReceiverSuccessDoneReplicatePiece = "receiver_done_replicate_piece_success"
	ReceiverFailureDoneReplicatePiece = "receiver_done_replicate_piece_failure"

	SignerSuccess                      = "signer_success"
	SignerFailure                      = "signer_failure"
	SignerSuccessBucketApproval        = "signer_bucket_approval_success"
	SignerFailureBucketApproval        = "signer_bucket_approval_failure"
	SignerSuccessMigrateBucketApproval = "signer_bucket_approval_success"
	SignerFailureMigrateBucketApproval = "signer_bucket_approval_failure"
	SignerSuccessObjectApproval        = "signer_object_approval_success"
	SignerFailureObjectApproval        = "signer_object_approval_failure"
	SignerSuccessSealObject            = "signer_seal_object_success"
	SignerFailureSealObject            = "signer_seal_object_failure"
	SignerSuccessRejectUnSealObject    = "signer_reject_unseal_object_success"
	SignerFailureRejectUnSealObject    = "signer_reject_unseal_object_failure"
	SignerSuccessDiscontinueBucket     = "signer_discontinue_bucket_success"
	SignerFailureDiscontinueBucket     = "signer_discontinue_bucket_failure"
	SignerSuccessIntegrityHash         = "signer_integrity_hash_success"
	SignerFailureIntegrityHash         = "signer_integrity_hash_failure"
	SignerSuccessPing                  = "signer_ping_success"
	SignerFailurePing                  = "signer_ping_failure"
	SignerSuccessPong                  = "signer_pong_success"
	SignerFailurePong                  = "signer_pong_failure"
	SignerSuccessReceiveTask           = "signer_receive_task_success"
	SignerFailureReceiveTask           = "signer_receive_task_failure"
	SignerSuccessReplicateApproval     = "signer_secondary_approval_success"
	SignerFailureReplicateApproval     = "signer_secondary_approval_failure"
	SignerSuccessRecoveryTask          = "signer_recovery_task_success"
	SignerFailureRecoveryTask          = "signer_recovery_task_failure"

	UploaderSuccessPutObject = "uploader_put_object_success"
	UploaderFailurePutObject = "uploader_put_object_failure"
)
View Source
const (
	// MiB defines the MB size
	MiB = 1024 * 1024
	// MinSpeed defines the min speed for data transfer
	MinSpeed = 10 * MiB
	// NotUseTimeout defines the default task timeout.
	NotUseTimeout int64 = 0
	// MinUploadTime defines the min timeout to upload object.
	MinUploadTime int64 = 2
	// MaxUploadTime defines the max timeout to upload object.
	MaxUploadTime int64 = 300
	// MinReplicateTime defines the min timeout to replicate object.
	MinReplicateTime int64 = 90
	// MaxReplicateTime defines the max timeout to replicate object.
	MaxReplicateTime int64 = 500
	// MinReceiveTime defines the min timeout to confirm the received piece whether is sealed on greenfield.
	MinReceiveTime int64 = 90
	// MaxReceiveTime defines the max timeout to confirm the received piece whether is sealed on greenfield.
	MaxReceiveTime int64 = 300
	// MinSealObjectTime defines the min timeout to seal object to greenfield.
	MinSealObjectTime int64 = 90
	// MaxSealObjectTime defines the max timeout to seal object to greenfield.
	MaxSealObjectTime int64 = 300
	// MinDownloadTime defines the min timeout to download object.
	MinDownloadTime int64 = 2
	// MaxDownloadTime defines the max timeout to download object.
	MaxDownloadTime int64 = 300
	// MinGcObjectTime defines the min timeout to gc object.
	MinGcObjectTime int64 = 300
	// MaxGcObjectTime defines the max timeout to gc object.
	MaxGcObjectTime int64 = 600
	// MinGcZombieTime defines the min timeout to gc zombie piece.
	MinGcZombieTime int64 = 300
	// MaxGcZombieTime defines the max timeout to gc zombie piece.
	MaxGcZombieTime int64 = 600
	// MinGCMetaTime defines the min timeout to gc meta.
	MinGCMetaTime int64 = 300
	// MaxGCMetaTime defines the max timeout to gc meta.
	MaxGCMetaTime int64 = 600
	// MinRecoveryTime defines the min timeout to recovery object.
	MinRecoveryTime int64 = 10
	// MaxRecoveryTime defines the max timeout to replicate object.
	MaxRecoveryTime int64 = 50
	// MinMigratePieceTime defines the min timeout to migrate piece.
	MinMigratePieceTime int64 = 10
	// MaxMigratePieceTime defines the max timeout to migrate piece.
	MaxMigratePieceTime int64 = 50
	// MinMigrateGVGTime defines the min timeout to migrate gvg.
	MinMigrateGVGTime int64 = 10
	// MaxMigrateGVGTime defines the max timeout to migrate gvg.
	MaxMigrateGVGTime int64 = 50

	// NotUseRetry defines the default task max retry.
	NotUseRetry int64 = 0
	// MinReplicateRetry defines the min retry number to replicate object.
	MinReplicateRetry = 3
	// MaxReplicateRetry defines the max retry number to replicate object.
	MaxReplicateRetry = 6
	// MinReceiveConfirmRetry defines the min retry number to confirm received piece is sealed on greenfield.
	MinReceiveConfirmRetry = 1
	// MaxReceiveConfirmRetry defines the max retry number to confirm received piece is sealed on greenfield.
	MaxReceiveConfirmRetry = 3
	// MinSealObjectRetry defines the min retry number to seal object.
	MinSealObjectRetry = 3
	// MaxSealObjectRetry defines the max retry number to seal object.
	MaxSealObjectRetry = 10
	// MinGCObjectRetry defines the min retry number to gc object.
	MinGCObjectRetry = 3
	// MaxGCObjectRetry defines the min retry number to gc object.
	MaxGCObjectRetry = 5
	// MinRecoveryRetry defines the min retry number to recovery piece.
	MinRecoveryRetry = 2
	// MaxRecoveryRetry  defines the max retry number to recovery piece.
	MaxRecoveryRetry = 3
	// MinMigratePieceRetry defines the min retry number to migrate piece.
	MinMigratePieceRetry = 2
	// MaxMigratePieceRetry  defines the max retry number to migrate piece.
	MaxMigratePieceRetry = 3
	// MinMigrateGVGRetry defines the min retry number to migrate gvg.
	MinMigrateGVGRetry = 2
	// MaxMigrateGVGRetry  defines the max retry number to migrate gvg.
	MaxMigrateGVGRetry = 3
)
View Source
const (
	BaseCodeSpace = "gfsp-base-app"
)
View Source
const (
	// DefaultStopTime defines the default timeout for stopping services.
	DefaultStopTime = 30
)
View Source
const (
	// MaxServerCallMsgSize defines the max message size for grpc server
	MaxServerCallMsgSize = 3 * 1024 * 1024 * 1024
)

Variables

View Source
var (
	ErrApprovalTaskDangling    = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990101, "OoooH... request lost")
	ErrApprovalExhaustResource = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990102, "server overload, try again later")
)
View Source
var (
	ErrDownloadTaskDangling    = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990301, "OoooH... request lost")
	ErrDownloadExhaustResource = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990302, "server overload, try again later")
)
View Source
var (
	ErrUploadTaskDangling  = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990601, "OoooH... request lost")
	ErrUnsupportedTaskType = gfsperrors.Register(BaseCodeSpace, http.StatusNotFound, 990602, "unsupported task type")
	ErrNoTaskMatchLimit    = gfsperrors.Register(BaseCodeSpace, http.StatusNotFound, 990603, "no task to dispatch below the require limits")
)
View Source
var (
	ErrReceiveTaskDangling    = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990801, "OoooH... request lost")
	ErrReceiveExhaustResource = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990802, "server overload, try again later")
)
View Source
var (
	ErrUploadObjectDangling  = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 991101, "OoooH... request lost")
	ErrUploadExhaustResource = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 991102, "server overload, try again later")
	ErrExceptionsStream      = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 991103, "stream closed abnormally")
)
View Source
var (
	ErrFutureSupport = gfsperrors.Register(BaseCodeSpace, http.StatusNotFound, 995301, "future support")
)
View Source
var (
	ErrReplicatePieceApprovalTaskDangling = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 990701, "OoooH... request lost")
)
View Source
var (
	ErrSingTaskDangling = gfsperrors.Register(BaseCodeSpace, http.StatusBadRequest, 991001, "OoooH... request lost")
)

Functions

func DefaultGfBsDB

func DefaultGfBsDB(config *config.SQLDBConfig)

DefaultGfBsDB cast block syncer db connections, user and password if not loaded from env vars

func DefaultGfBsDBOption

func DefaultGfBsDBOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpClientOption

func DefaultGfSpClientOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpConsensusOption

func DefaultGfSpConsensusOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpDBOption

func DefaultGfSpDBOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpMetricOption

func DefaultGfSpMetricOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpModulusOption

func DefaultGfSpModulusOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpPieceOpOption

func DefaultGfSpPieceOpOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpPieceStoreOption

func DefaultGfSpPieceStoreOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpPprofOption

func DefaultGfSpPprofOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpResourceManagerOption

func DefaultGfSpResourceManagerOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGfSpTQueueOption

func DefaultGfSpTQueueOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func DefaultGrpcServerOptions

func DefaultGrpcServerOptions() []grpc.ServerOption

func DefaultStaticOption

func DefaultStaticOption(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

func GeKeepAliveServerOptions

func GeKeepAliveServerOptions() []grpc.ServerOption

GeKeepAliveServerOptions returns keepalive gRPC server options

func GetRPCRemoteAddress

func GetRPCRemoteAddress(ctx context.Context) string

func GetRegisterModulus

func GetRegisterModulus() []string

GetRegisterModulus returns the list registered modules.

func GetRegisterModulusDescription

func GetRegisterModulusDescription() string

GetRegisterModulusDescription returns the list registered modules' description.

func RegisterModular

func RegisterModular(name string, description string, newFunc NewModularFunc)

RegisterModular registers the module info to the global ModularManager

Types

type GfSpBaseApp

type GfSpBaseApp struct {
	// contains filtered or unexported fields
}

func NewGfSpBaseApp

func NewGfSpBaseApp(cfg *gfspconfig.GfSpConfig, opts ...gfspconfig.Option) (*GfSpBaseApp, error)

func (*GfSpBaseApp) AppID

func (g *GfSpBaseApp) AppID() string

AppID returns the GfSpBaseApp ID, the default value is prefix(gfsp) add started modules' name.

func (*GfSpBaseApp) ChainID

func (g *GfSpBaseApp) ChainID() string

ChainID returns the chain ID used by this sp instance

func (*GfSpBaseApp) Consensus

func (g *GfSpBaseApp) Consensus() consensus.Consensus

Consensus returns greenfield consensus query client.

func (*GfSpBaseApp) Done

func (g *GfSpBaseApp) Done() <-chan struct{}

Done check context is done.

func (*GfSpBaseApp) EnableMetrics

func (g *GfSpBaseApp) EnableMetrics() bool

EnableMetrics returns an indicator whether enable the metrics service.

func (*GfSpBaseApp) GetAuthNonce

GetAuthNonce get the auth nonce for which the Dapp or client can generate EDDSA key pairs.

func (*GfSpBaseApp) GfBsDB

func (g *GfSpBaseApp) GfBsDB() bsdb.BSDB

GfBsDB returns the block syncer db client.

func (*GfSpBaseApp) GfBsDBBackup

func (g *GfSpBaseApp) GfBsDBBackup() bsdb.BSDB

GfBsDBBackup returns the backup block syncer db client.

func (*GfSpBaseApp) GfBsDBMaster

func (g *GfSpBaseApp) GfBsDBMaster() bsdb.BSDB

GfBsDBMaster returns the master block syncer db client.

func (*GfSpBaseApp) GfSpAskTask

func (*GfSpBaseApp) GfSpClient

func (g *GfSpBaseApp) GfSpClient() *gfspclient.GfSpClient

GfSpClient returns the sp client that includes inner grpc and outer http protocol.

func (*GfSpBaseApp) GfSpDB

func (g *GfSpBaseApp) GfSpDB() spdb.SPDB

GfSpDB returns the sp db client.

func (*GfSpBaseApp) GfSpDoneReplicatePiece

func (*GfSpBaseApp) GfSpPickVirtualGroupFamily added in v0.2.3

func (*GfSpBaseApp) GfSpReplicatePiece

func (*GfSpBaseApp) GfSpResumableUploadObject added in v0.2.3

func (*GfSpBaseApp) GfSpSign

func (*GfSpBaseApp) GfSpUploadObject

func (*GfSpBaseApp) OnAskCreateBucketApproval

func (g *GfSpBaseApp) OnAskCreateBucketApproval(ctx context.Context, task task.ApprovalCreateBucketTask) (allow bool, err error)

func (*GfSpBaseApp) OnAskCreateObjectApproval

func (g *GfSpBaseApp) OnAskCreateObjectApproval(ctx context.Context, task task.ApprovalCreateObjectTask) (allow bool, err error)

func (*GfSpBaseApp) OnAskMigrateBucketApproval added in v0.2.3

func (g *GfSpBaseApp) OnAskMigrateBucketApproval(ctx context.Context, task task.ApprovalMigrateBucketTask) (bool, error)

func (*GfSpBaseApp) OnAskTask

func (g *GfSpBaseApp) OnAskTask(ctx context.Context, limit corercmgr.Limit) (coretask.Task, error)

func (*GfSpBaseApp) OnBeginResumableUploadObjectTask added in v0.2.3

func (g *GfSpBaseApp) OnBeginResumableUploadObjectTask(ctx context.Context, task coretask.ResumableUploadObjectTask) error

func (*GfSpBaseApp) OnBeginUploadObjectTask

func (g *GfSpBaseApp) OnBeginUploadObjectTask(ctx context.Context, task coretask.UploadObjectTask) (err error)

func (*GfSpBaseApp) OnChallengePieceTask

func (g *GfSpBaseApp) OnChallengePieceTask(ctx context.Context, challengePieceTask task.ChallengePieceTask) (
	integrity []byte, checksums [][]byte, data []byte, err error)

func (*GfSpBaseApp) OnDownloadObjectTask

func (g *GfSpBaseApp) OnDownloadObjectTask(ctx context.Context, downloadObjectTask task.DownloadObjectTask) (
	[]byte, error)

func (*GfSpBaseApp) OnDownloadPieceTask

func (g *GfSpBaseApp) OnDownloadPieceTask(ctx context.Context, downloadPieceTask task.DownloadPieceTask) (
	data []byte, err error)

func (*GfSpBaseApp) OperatorAddress

func (g *GfSpBaseApp) OperatorAddress() string

OperatorAddress returns the sp operator address.

func (*GfSpBaseApp) PieceOp

func (g *GfSpBaseApp) PieceOp() piecestore.PieceOp

PieceOp returns piece helper struct instance.

func (*GfSpBaseApp) PieceStore

func (g *GfSpBaseApp) PieceStore() piecestore.PieceStore

PieceStore returns the piece store client.

func (*GfSpBaseApp) RegisterServices

func (g *GfSpBaseApp) RegisterServices(services ...corelifecycle.Service)

RegisterServices register services of an application.

func (*GfSpBaseApp) ResourceManager

func (g *GfSpBaseApp) ResourceManager() corercmgr.ResourceManager

ResourceManager returns the resource manager for module to open own resource span.

func (*GfSpBaseApp) ServerForRegister

func (g *GfSpBaseApp) ServerForRegister() *grpc.Server

ServerForRegister returns the Grpc server for module register own service.

func (*GfSpBaseApp) SetGfBsDB

func (g *GfSpBaseApp) SetGfBsDB(setDB bsdb.BSDB) bsdb.BSDB

SetGfBsDB sets the block syncer db client.

func (*GfSpBaseApp) Signals

func (g *GfSpBaseApp) Signals(sigs ...os.Signal) corelifecycle.Lifecycle

Signals registers monitor signals.

func (*GfSpBaseApp) Start

func (g *GfSpBaseApp) Start(ctx context.Context) error

Start the GfSpBaseApp and blocks the progress until signal.

func (*GfSpBaseApp) StartRPCServer

func (g *GfSpBaseApp) StartRPCServer(ctx context.Context) error

func (*GfSpBaseApp) StartServices

func (g *GfSpBaseApp) StartServices(ctx context.Context) corelifecycle.Lifecycle

StartServices starts running services.

func (*GfSpBaseApp) StopRPCServer

func (g *GfSpBaseApp) StopRPCServer(ctx context.Context) error

func (*GfSpBaseApp) StopServices

func (g *GfSpBaseApp) StopServices(ctx context.Context)

StopServices stop services when context is done or timeout.

func (*GfSpBaseApp) TaskMaxRetry

func (g *GfSpBaseApp) TaskMaxRetry(task coretask.Task) int64

TaskMaxRetry returns the task max retry by task type.

func (*GfSpBaseApp) TaskPriority

func (g *GfSpBaseApp) TaskPriority(task coretask.Task) coretask.TPriority

TaskPriority returns the task priority by task type, it is the default options. the task priority support self define and dynamic settings.

func (*GfSpBaseApp) TaskPriorityLevel

func (g *GfSpBaseApp) TaskPriorityLevel(task coretask.Task) coretask.TPriorityLevel

TaskPriorityLevel returns the task priority level, it is computed by task priority.

func (*GfSpBaseApp) TaskTimeout

func (g *GfSpBaseApp) TaskTimeout(task coretask.Task, size uint64) int64

TaskTimeout returns the task timeout by task type and some task need payload size to compute, example: upload, download, etc.

func (*GfSpBaseApp) UpdateUserPublicKey

UpdateUserPublicKey updates the user public key once the Dapp or client generates the EDDSA key pairs.

func (*GfSpBaseApp) VerifyOffChainSignature

VerifyOffChainSignature verifies the signature signed by user's EDDSA private key.

func (*GfSpBaseApp) Wait

func (g *GfSpBaseApp) Wait(ctx context.Context)

Wait blocks until context is done.

type ModularManager

type ModularManager struct {
	// contains filtered or unexported fields
}

ModularManager manages the modules, record the module info, module info include: module name, module description and new module func. Module name is an indexer for starting, the start module name comes from config file or '--service' command flag. Module description uses for 'list' command that shows the SP supports modules info. New module func is help module manager to init the module instance.

type NewModularFunc

type NewModularFunc = func(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) (coremodule.Modular, error)

NewModularFunc defines the module new instance func type.

func GetNewModularFunc

func GetNewModularFunc(name string) NewModularFunc

GetNewModularFunc returns the list registered module's new instances func.

type Option

type Option func(app *GfSpBaseApp, cfg *gfspconfig.GfSpConfig) error

Option defines the GfSpBaseApp and module init options func type.

Jump to

Keyboard shortcuts

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