blob: 8ad9d307ade56fb312d7acca04dc20441f383675 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vsync
import (
"v.io/v23/security/access"
)
// temporary types
type ObjId string
type Version uint64
type GroupId uint64
// DeviceId is the globally unique Id of a device.
type DeviceId string
// GenId is the unique Id per generation per device.
type GenId uint64
// SeqNum is the log sequence number.
type SeqNum uint64
// GenVector is the generation vector.
type GenVector map[DeviceId]GenId
// TxId is the unique Id per transaction.
type TxId uint64
// GroupIdSet is the list of SyncGroup Ids.
type GroupIdSet []GroupId
const (
// NodeRec type log record adds a new node in the dag.
NodeRec = byte(0)
// LinkRec type log record adds a new link in the dag.
LinkRec = byte(1)
// Sync interface has Object name "global/vsync/<devid>/sync".
SyncSuffix = "sync"
// temporary nil values
NoObjId = ObjId("")
NoVersion = Version(0)
NoGroupId = GroupId(0)
)
// LogRec represents a single log record that is exchanged between two
// peers.
//
// It contains log related metadata: DevId is the id of the device
// that created the log record, SyncRootId is the id of a SyncRoot this log
// record was created under, GNum is the Id of the generation that the
// log record is part of, SeqNum is the log sequence number of the log
// record in the generation GNum, and RecType is the type of log
// record.
//
// It also contains information relevant to the updates to an object
// in the store: ObjId is the id of the object that was
// updated. CurVers is the current version number of the
// object. Parents can contain 0, 1 or 2 parent versions that the
// current version is derived from, and Value is the actual value of
// the object mutation.
type LogRec struct {
// Log related information.
DevId DeviceId
SyncRootId ObjId
GenNum GenId
SeqNum SeqNum
RecType byte
// Object related information.
ObjId ObjId
CurVers Version
Parents []Version
Value LogValue
}
// LogValue represents an object mutation within a transaction.
type LogValue struct {
// Mutation is the store mutation representing the change in the object.
//Mutation raw.Mutation
// SyncTime is the timestamp of the mutation when it arrives at the Sync server.
SyncTime int64
// Delete indicates whether the mutation resulted in the object being
// deleted from the store.
Delete bool
// TxId is the unique Id of the transaction this mutation belongs to.
TxId TxId
// TxCount is the number of mutations in the transaction TxId.
TxCount uint32
}
// DeviceStats contains high-level information on a device participating in
// peer-to-peer synchronization.
type DeviceStats struct {
DevId DeviceId // Device Id.
LastSync int64 // Timestamp of last sync from the device.
GenVectors map[ObjId]GenVector // Generation vectors per SyncRoot.
IsSelf bool // True if the responder is on this device.
}
// SyncGroupStats contains high-level information on a SyncGroup.
type SyncGroupStats struct {
Name string // Global name of the SyncGroup.
Id GroupId // Global Id of the SyncGroup.
Path string // Local store path for the root of the SyncGroup.
RootObjId ObjId // Id of the store object at the root path.
NumJoiners uint32 // Number of members currently in the SyncGroup.
}
// SyncGroupMember contains information on a SyncGroup member.
type SyncGroupMember struct {
Name string // Name of SyncGroup member.
Id GroupId // Global Id of the SyncGroup.
Metadata JoinerMetaData // Extra member metadata.
}
// A SyncGroupInfo is the conceptual state of a SyncGroup object.
type SyncGroupInfo struct {
Id GroupId // Globally unique SyncGroup Id.
ServerName string // Global Vanadium name of SyncGroupServer.
GroupName string // Relative name of group; global name is ServerName/GroupName.
Config SyncGroupConfig // Configuration parameters of this SyncGroup.
ETag string // Version Id for concurrency control.
// A map from joiner names to the associated metaData for devices that
// have called Join() or Create() and not subsequently called Leave()
// or had Eject() called on them. The map returned by the calls below
// may contain only a subset of joiners if the number is large.
Joiners map[string]JoinerMetaData
// Blessings for joiners of this SyncGroup will be self-signed by the
// SyncGroupServer, and will have names matching
// JoinerBlessingPrefix/Name/...
JoinerBlessingPrefix string
}
// A SyncGroupConfig contains some fields of SyncGroupInfo that
// are passed at create time, but which can be changed later.
type SyncGroupConfig struct {
Desc string // Human readable description.
Options map[string]any // Options for future evolution.
Permissions access.Permissions // The object's Permissions.
// Mount tables used to advertise for synchronization.
// Typically, we will have only one entry. However, an array allows
// mount tables to be changed over time.
MountTables []string
BlessingsDurationNanos int64 // Duration of blessings, in nanoseconds. 0 => use server default.
}
// A JoinerMetaData contains the non-name information stored per joiner.
type JoinerMetaData struct {
// SyncPriority is a hint to bias the choice of syncing partners.
// Members of the SyncGroup should choose to synchronize more often
// with partners with lower values.
SyncPriority int32
}
// Sync allows a device to GetDeltas from another device.
type Sync interface {
// GetDeltas returns a device's current generation vector and all
// the missing log records when compared to the incoming generation vector.
GetDeltas(in map[ObjId]GenVector, sgs map[ObjId]GroupIdSet, clientId DeviceId) stream<_, LogRec> (map[ObjId]GenVector | error) {access.Write}
// GetObjectHistory returns the mutation history of a store object.
GetObjectHistory(oid ObjId) stream<_, LogRec> (Version | error)
// GetDeviceStats returns information on devices participating in
// peer-to-peer synchronization.
GetDeviceStats() stream<_, DeviceStats> error {access.Admin}
// GetSyncGroupMembers returns information on SyncGroup members.
// If SyncGroup names are specified, only members of these SyncGroups
// are returned. Otherwise, if the slice of names is nil or empty,
// members of all SyncGroups are returned.
GetSyncGroupMembers(sgNames []string) stream<_, SyncGroupMember> error {access.Admin}
// GetSyncGroupStats returns high-level information on all SyncGroups.
GetSyncGroupStats() stream<_, SyncGroupStats> error {access.Admin}
// Dump writes to the Sync log internal information used for debugging.
Dump() error {access.Admin}
}