| // 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 interfaces |
| |
| import ( |
| "time" |
| |
| wire "v.io/v23/services/syncbase/nosql" |
| ) |
| |
| const ( |
| NoGroupId = GroupId(0) |
| ) |
| |
| // TODO(hpucha): These are not final yet. This is an intermediate step. |
| |
| 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. Link records are |
| // added when a conflict is resolved by picking the local or the remote |
| // version as the resolution of a conflict, instead of creating a new |
| // version. |
| LinkRec = byte(1) |
| ) |
| |
| // PrefixGenVector is the generation vector for a data prefix, which maps each |
| // device id to its last locally known generation in the scope of that prefix. |
| // TODO(hpucha): Rename this type. |
| type PrefixGenVector map[uint64]uint64 |
| |
| // GenVector is the generation vector for a Database, and maps prefixes to their |
| // generation vectors. Note that the prefixes in a GenVector are relative to the |
| // the Application and Database name. |
| type GenVector map[string]PrefixGenVector |
| |
| // LogRecMetadata represents the metadata of a single log record that is |
| // exchanged between two peers. Each log record represents a change made to an |
| // object in the store. |
| // |
| // TODO(hpucha): Add readset/scanset. Look into sending tx metadata only once |
| // per transaction. |
| type LogRecMetadata struct { |
| // Log related information. |
| Id uint64 // device id that created the log record. |
| Gen uint64 // generation number for the log record. |
| RecType byte // type of log record. |
| |
| // Object related information. |
| |
| // Id of the object that was updated. This id is relative to Application |
| // and Database names and is the store key for a particular row in a |
| // table. |
| ObjId string |
| CurVers string // current version number of the object. |
| Parents []string // 0, 1 or 2 parent versions that the current version is derived from. |
| UpdTime time.Time // timestamp when the update is generated. |
| PermId string // id of the permissions object controlling this version. |
| PermVers string // current version of the permissions object. |
| Shell bool // true when the mutation data is hidden due to permissions. |
| Delete bool // indicates whether the update resulted in object being deleted from the store. |
| BatchId uint64 // unique id of the Batch this update belongs to. |
| BatchCount uint64 // number of objects in the Batch. |
| } |
| |
| // LogRec represents the on-wire representation of an entire log record: its |
| // metadata and data. Value is the actual value of a store object. |
| type LogRec struct { |
| Metadata LogRecMetadata |
| Value []byte |
| } |
| |
| // GroupId is a globally unique syncgroup ID. |
| // TODO(hpucha): Make this a string since now the syncgroup id is an object id. |
| type GroupId uint64 |
| |
| // Possible states for a syncgroup. |
| type SyncgroupStatus enum { |
| // Indicates that a syncgroup is operational, but publishing to the |
| // remote server is pending. |
| PublishPending |
| |
| // Indicates that the syncgroup is operational, but the publishing |
| // failed. |
| PublishRejected |
| |
| // Indicates that the syncgroup is operational and published. |
| Running |
| } |
| |
| // Syncgroup contains the state of a syncgroup. |
| type Syncgroup struct { |
| Id GroupId // globally unique identifier generated by Syncbase |
| Name string // globally unique Vanadium name chosen by app |
| SpecVersion string // version on syncgroup spec for concurrency control |
| Spec wire.SyncgroupSpec // app-given specification |
| Creator string // Creator's Vanadium name |
| AppName string // Globally unique App name |
| DbName string // Database name within the App |
| Status SyncgroupStatus // Status of the syncgroup |
| Joiners map[string]wire.SyncgroupMemberInfo // map of joiners to their metadata |
| } |
| |
| // DeltaReq contains a request to sync either data or syncgroup metadata for a |
| // Database. |
| type DeltaReq union { |
| Sgs SgDeltaReq |
| Data DataDeltaReq |
| } |
| |
| // DataDeltaReq contains the initiator's genvector and the set of syncgroups it |
| // is interested in within a Database (specified by the AppName/DbName) when |
| // requesting deltas for that Database. |
| type DataDeltaReq struct { |
| AppName string |
| DbName string |
| SgIds set[GroupId] |
| InitVec GenVector |
| } |
| |
| // SgDeltaReq contains the initiator's genvector for the syncgroups it is |
| // interested in within a Database (specified by the AppName/DbName) when |
| // requesting deltas for those syncgroups. |
| type SgDeltaReq struct { |
| AppName string |
| DbName string |
| InitVec GenVector // Contains a genvector per syncgroup. |
| } |
| |
| // DeltaResp contains the responder's genvector or the missing log records |
| // returned in response to an initiator's request for deltas for a Database. |
| type DeltaResp union { |
| Rec LogRec |
| RespVec GenVector |
| } |
| |
| // ChunkHash contains the hash of a chunk that is part of a blob's recipe. |
| type ChunkHash struct { |
| Hash []byte |
| } |
| |
| // ChunkData contains the data of a chunk. |
| type ChunkData struct { |
| Data []byte |
| } |
| |
| // TimeReq contains the send timestamp from the requester. |
| type TimeReq struct { |
| SendTs time.Time |
| } |
| |
| // TimeResp contains timestamps needed by the requester to correctly estimate |
| // the difference between the two clocks along with clock metadata required |
| // by the requester to decide which clock is more accurate. |
| type TimeResp struct { |
| // The send timestamp received in TimeReq from the originator. |
| OrigTs time.Time |
| |
| // Time when the request was received. |
| RecvTs time.Time |
| |
| // Time when the response was sent. |
| SendTs time.Time |
| |
| // Timestamp received from NTP during last NTP sync. The last NTP sync could |
| // be done either by this device or some other device that this device |
| // synced its clock with. |
| LastNtpTs ?time.Time |
| |
| // Number of reboots since last NTP sync. |
| NumReboots uint16 |
| |
| // Number of hops between this device and the device that did the last |
| // NTP sync. |
| NumHops uint16 |
| } |