本文整理汇总了Golang中github.com/cockroachdb/cockroach/util/hlc.ManualClock函数的典型用法代码示例。如果您正苦于以下问题:Golang ManualClock函数的具体用法?Golang ManualClock怎么用?Golang ManualClock使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ManualClock函数的16个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: TestCoordinatorHeartbeat
// TestCoordinatorHeartbeat verifies periodic heartbeat of the
// transaction record.
func TestCoordinatorHeartbeat(t *testing.T) {
db, _, manual := createTestDB(t)
defer db.Close()
// Set heartbeat interval to 1ms for testing.
db.coordinator.heartbeatInterval = 1 * time.Millisecond
txnID := engine.Key("txn")
<-db.Put(createPutRequest(engine.Key("a"), []byte("value"), txnID))
// Verify 3 heartbeats.
var heartbeatTS proto.Timestamp
for i := 0; i < 3; i++ {
if err := util.IsTrueWithin(func() bool {
ok, txn, err := getTxn(db, engine.MakeKey(engine.KeyLocalTransactionPrefix, txnID))
if !ok || err != nil {
return false
}
// Advance clock by 1ns.
// Locking the coordinator to prevent a data race.
db.coordinator.Lock()
*manual = hlc.ManualClock(*manual + 1)
db.coordinator.Unlock()
if heartbeatTS.Less(*txn.LastHeartbeat) {
heartbeatTS = *txn.LastHeartbeat
return true
}
return false
}, 50*time.Millisecond); err != nil {
t.Error("expected initial heartbeat within 50ms")
}
}
}
开发者ID:bdotdub,项目名称:cockroach,代码行数:35,代码来源:coordinator_test.go
示例2: TestCoordinatorGC
// TestCoordinatorGC verifies that the coordinator cleans up extant
// transactions after the lastUpdateTS exceeds the timeout.
func TestCoordinatorGC(t *testing.T) {
db, _, manual := createTestDB(t)
defer db.Close()
// Set heartbeat interval to 1ms for testing.
db.coordinator.heartbeatInterval = 1 * time.Millisecond
txnID := engine.Key("txn")
<-db.Put(createPutRequest(engine.Key("a"), []byte("value"), txnID))
// Now, advance clock past the default client timeout.
// Locking the coordinator to prevent a data race.
db.coordinator.Lock()
*manual = hlc.ManualClock(defaultClientTimeout.Nanoseconds() + 1)
db.coordinator.Unlock()
if err := util.IsTrueWithin(func() bool {
// Locking the coordinator to prevent a data race.
db.coordinator.Lock()
_, ok := db.coordinator.txns[string(txnID)]
db.coordinator.Unlock()
return !ok
}, 50*time.Millisecond); err != nil {
t.Error("expected garbage collection")
}
}
开发者ID:bdotdub,项目名称:cockroach,代码行数:28,代码来源:coordinator_test.go
示例3: TestCoordinatorAddRequest
// TestCoordinatorAddRequest verifies adding a request creates a
// transaction metadata and adding multiple requests with same
// transaction ID updates the last update timestamp.
func TestCoordinatorAddRequest(t *testing.T) {
db, clock, manual := createTestDB(t)
defer db.Close()
txnID := engine.Key("txn")
putReq := createPutRequest(engine.Key("a"), []byte("value"), txnID)
// Put request will create a new transaction.
<-db.Put(putReq)
txnMeta, ok := db.coordinator.txns[string(txnID)]
if !ok {
t.Fatal("expected a transaction to be created on coordinator")
}
ts := txnMeta.lastUpdateTS
if !ts.Less(clock.Now()) {
t.Errorf("expected earlier last update timestamp; got: %+v", ts)
}
// Advance time and send another put request.
// Locking the coordinator to prevent a data race.
db.coordinator.Lock()
*manual = hlc.ManualClock(1)
db.coordinator.Unlock()
<-db.Put(putReq)
if len(db.coordinator.txns) != 1 {
t.Errorf("expected length of transactions map to be 1; got %d", len(db.coordinator.txns))
}
txnMeta = db.coordinator.txns[string(txnID)]
if !ts.Less(txnMeta.lastUpdateTS) || txnMeta.lastUpdateTS.WallTime != int64(*manual) {
t.Errorf("expected last update time to advance; got %+v", txnMeta.lastUpdateTS)
}
}
开发者ID:bdotdub,项目名称:cockroach,代码行数:35,代码来源:coordinator_test.go
示例4: createTestRangeWithClock
// createTestRange creates a range using a blocking engine. Returns
// the range clock's manual unix nanos time and the range.
func createTestRangeWithClock(t *testing.T) (*Range, *hlc.ManualClock, *hlc.Clock, *blockingEngine) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
engine := newBlockingEngine()
rng := NewRange(&proto.RangeMetadata{}, clock, engine, nil, nil)
rng.Start()
return rng, &manual, clock, engine
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:10,代码来源:range_test.go
示例5: TestLocalKVLookupReplica
func TestLocalKVLookupReplica(t *testing.T) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
eng := engine.NewInMem(proto.Attributes{}, 1<<20)
kv := NewLocalKV()
db := NewDB(kv, clock)
store := storage.NewStore(clock, eng, db, nil)
if err := store.Bootstrap(proto.StoreIdent{StoreID: 1}); err != nil {
t.Fatal(err)
}
kv.AddStore(store)
meta := store.BootstrapRangeMetadata()
meta.StartKey = engine.KeySystemPrefix
meta.EndKey = engine.PrefixEndKey(engine.KeySystemPrefix)
if _, err := store.CreateRange(meta); err != nil {
t.Fatal(err)
}
if err := store.Init(); err != nil {
t.Fatal(err)
}
// Create two new stores with ranges we care about.
var s [2]*storage.Store
ranges := []struct {
storeID int32
start, end engine.Key
}{
{2, engine.Key("a"), engine.Key("c")},
{3, engine.Key("x"), engine.Key("z")},
}
for i, rng := range ranges {
s[i] = storage.NewStore(clock, eng, db, nil)
s[i].Ident.StoreID = rng.storeID
replica := proto.Replica{StoreID: rng.storeID}
_, err := s[i].CreateRange(store.NewRangeMetadata(rng.start, rng.end, []proto.Replica{replica}))
if err != nil {
t.Fatal(err)
}
kv.AddStore(s[i])
}
if r, err := kv.lookupReplica(engine.Key("a"), engine.Key("c")); r.StoreID != s[0].Ident.StoreID || err != nil {
t.Errorf("expected store %d; got %d: %v", s[0].Ident.StoreID, r.StoreID, err)
}
if r, err := kv.lookupReplica(engine.Key("b"), nil); r.StoreID != s[0].Ident.StoreID || err != nil {
t.Errorf("expected store %d; got %d: %v", s[0].Ident.StoreID, r.StoreID, err)
}
if r, err := kv.lookupReplica(engine.Key("b"), engine.Key("d")); r != nil || err == nil {
t.Errorf("expected store 0 and error got %d", r.StoreID)
}
if r, err := kv.lookupReplica(engine.Key("x"), engine.Key("z")); r.StoreID != s[1].Ident.StoreID {
t.Errorf("expected store %d; got %d: %v", s[1].Ident.StoreID, r.StoreID, err)
}
if r, err := kv.lookupReplica(engine.Key("y"), nil); r.StoreID != s[1].Ident.StoreID || err != nil {
t.Errorf("expected store %d; got %d: %v", s[1].Ident.StoreID, r.StoreID, err)
}
}
开发者ID:bdotdub,项目名称:cockroach,代码行数:56,代码来源:local_kv_test.go
示例6: createTestStore
// createTestStore creates a test store using an in-memory
// engine. Returns the store clock's manual unix nanos time and the
// store. A single range from key "a" to key "z" is setup in the store
// with a default replica descriptor (i.e. StoreID = 0, RangeID = 1,
// etc.). The caller is responsible for closing the store on exit.
func createTestStore(t *testing.T) (*Store, *hlc.ManualClock) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
eng := engine.NewInMem(proto.Attributes{}, 1<<20)
store := NewStore(clock, eng, nil)
replica := proto.Replica{RangeID: 1}
_, err := store.CreateRange(engine.Key("a"), engine.Key("z"), []proto.Replica{replica})
if err != nil {
t.Fatal(err)
}
return store, &manual
}
开发者ID:bigrats,项目名称:cockroach,代码行数:17,代码来源:store_test.go
示例7: createTestDB
// createTestDB creates a test kv.DB using a LocalKV object built with
// a store using an in-memory engine. Returns the created kv.DB and
// associated clock's manual time.
func createTestDB(t *testing.T) (*DB, *hlc.Clock, *hlc.ManualClock) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
eng := engine.NewInMem(proto.Attributes{}, 1<<20)
store := storage.NewStore(clock, eng, nil)
store.Ident.StoreID = 1
replica := proto.Replica{StoreID: 1, RangeID: 1}
_, err := store.CreateRange(engine.KeyMin, engine.KeyMax, []proto.Replica{replica})
if err != nil {
t.Fatal(err)
}
kv := NewLocalKV()
kv.AddStore(store)
db := NewDB(kv, clock)
return db, clock, &manual
}
开发者ID:bigrats,项目名称:cockroach,代码行数:19,代码来源:coordinator_test.go
示例8: TestEndTransactionWithErrors
// TestEndTransactionWithErrors verifies various error conditions
// are checked such as transaction already being committed or
// aborted, or timestamp or epoch regression.
func TestEndTransactionWithErrors(t *testing.T) {
rng, mc, clock, _ := createTestRangeWithClock(t)
defer rng.Stop()
regressTS := clock.Now()
*mc = hlc.ManualClock(1)
txn := NewTransaction(engine.Key(""), 1, proto.SERIALIZABLE, clock)
testCases := []struct {
key engine.Key
existStatus proto.TransactionStatus
existEpoch int32
existTS proto.Timestamp
expErrRegexp string
}{
{engine.Key("a"), proto.COMMITTED, txn.Epoch, txn.Timestamp, "txn {.*}: already committed"},
{engine.Key("b"), proto.ABORTED, txn.Epoch, txn.Timestamp, "txn {.*}: already aborted"},
{engine.Key("c"), proto.PENDING, txn.Epoch + 1, txn.Timestamp, "txn {.*}: epoch regression: 0"},
{engine.Key("d"), proto.PENDING, txn.Epoch, regressTS, "txn {.*}: timestamp regression: {WallTime:1 Logical:0 .*}"},
}
for _, test := range testCases {
// Establish existing txn state by writing directly to range engine.
var existTxn proto.Transaction
gogoproto.Merge(&existTxn, txn)
existTxn.ID = test.key
existTxn.Status = test.existStatus
existTxn.Epoch = test.existEpoch
existTxn.Timestamp = test.existTS
txnKey := engine.MakeKey(engine.KeyLocalTransactionPrefix, test.key)
if err := engine.PutProto(rng.engine, txnKey, &existTxn); err != nil {
t.Fatal(err)
}
// End the transaction, verify expected error.
txn.ID = test.key
args, reply := endTxnArgs(txn, true, 0)
args.Timestamp = txn.Timestamp
err := rng.ReadWriteCmd("EndTransaction", args, reply)
if err == nil {
t.Errorf("expected error matching %q", test.expErrRegexp)
} else {
if matched, regexpErr := regexp.MatchString(test.expErrRegexp, err.Error()); !matched || regexpErr != nil {
t.Errorf("expected error to match %q (%v): %v", test.expErrRegexp, regexpErr, err.Error())
}
}
}
}
开发者ID:embark,项目名称:cockroach,代码行数:50,代码来源:range_test.go
示例9: TestStoreExecuteCmdWithClockDrift
// TestStoreExecuteCmdWithClockDrift verifies that if the request
// specifies a timestamp further into the future than the node's
// maximum allowed clock drift, the cmd fails with an error.
func TestStoreExecuteCmdWithClockDrift(t *testing.T) {
store, mc := createTestStore(t)
defer store.Close()
args, reply := getArgs("a", 1)
// Set clock to time 1.
*mc = hlc.ManualClock(1)
// Set clock max drift to 250ms.
maxDrift := 250 * time.Millisecond
store.clock.SetMaxDrift(maxDrift)
// Set args timestamp to exceed max drift.
args.Timestamp = store.clock.Now()
args.Timestamp.WallTime += maxDrift.Nanoseconds() + 1
err := store.ExecuteCmd("Get", args, reply)
if err == nil {
t.Error("expected max drift clock error")
}
}
开发者ID:bigrats,项目名称:cockroach,代码行数:21,代码来源:store_test.go
示例10: TestStoreExecuteCmdWithZeroTime
// TestStoreExecuteCmdWithZeroTime verifies that no timestamp causes
// the command to assume the node's wall time.
func TestStoreExecuteCmdWithZeroTime(t *testing.T) {
store, mc := createTestStore(t)
defer store.Close()
args, reply := getArgs("a", 1)
// Set clock to time 1.
*mc = hlc.ManualClock(1)
err := store.ExecuteCmd("Get", args, reply)
if err != nil {
t.Fatal(err)
}
// The Logical time will increase over the course of the command
// execution so we can only rely on comparing the WallTime.
if reply.Timestamp.WallTime != store.clock.Timestamp().WallTime {
t.Errorf("expected reply to have store clock time %+v; got %+v",
store.clock.Timestamp(), reply.Timestamp)
}
}
开发者ID:bigrats,项目名称:cockroach,代码行数:20,代码来源:store_test.go
示例11: createTestDB
// createTestDB creates a test kv.DB using a LocalKV object built with
// a store using an in-memory engine. Returns the created kv.DB and
// associated clock's manual time.
func createTestDB(t *testing.T) (*DB, *hlc.Clock, *hlc.ManualClock) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
eng := engine.NewInMem(proto.Attributes{}, 1<<20)
kv := NewLocalKV()
db := NewDB(kv, clock)
store := storage.NewStore(clock, eng, db, nil)
if err := store.Bootstrap(proto.StoreIdent{StoreID: 1}); err != nil {
t.Fatal(err)
}
kv.AddStore(store)
_, err := store.CreateRange(store.BootstrapRangeMetadata())
if err != nil {
t.Fatal(err)
}
if err := store.Init(); err != nil {
t.Fatal(err)
}
return db, clock, &manual
}
开发者ID:bdotdub,项目名称:cockroach,代码行数:23,代码来源:coordinator_test.go
示例12: TestRangeUseTSCache
// TestRangeUseTSCache verifies that write timestamps are upgraded
// based on the read timestamp cache.
func TestRangeUseTSCache(t *testing.T) {
rng, mc, clock, _ := createTestRangeWithClock(t)
defer rng.Stop()
// Set clock to time 1s and do the read.
t0 := 1 * time.Second
*mc = hlc.ManualClock(t0.Nanoseconds())
args, reply := getArgs("a", 0)
args.Timestamp = clock.Now()
err := rng.ReadOnlyCmd("Get", args, reply)
if err != nil {
t.Error(err)
}
pArgs, pReply := putArgs("a", "value", 0)
err = rng.ReadWriteCmd("Put", pArgs, pReply)
if err != nil {
t.Fatal(err)
}
if pReply.Timestamp.WallTime != clock.Timestamp().WallTime {
t.Errorf("expected write timestamp to upgrade to 1s; got %+v", pReply.Timestamp)
}
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:23,代码来源:range_test.go
示例13: TestStoreInitAndBootstrap
// TestStoreInitAndBootstrap verifies store initialization and
// bootstrap.
func TestStoreInitAndBootstrap(t *testing.T) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
eng := engine.NewInMem(proto.Attributes{}, 1<<20)
store := NewStore(clock, eng, nil)
defer store.Close()
// Can't init as haven't bootstrapped.
if err := store.Init(); err == nil {
t.Error("expected failure init'ing un-bootstrapped store")
}
// Bootstrap with a fake ident.
if err := store.Bootstrap(testIdent); err != nil {
t.Errorf("error bootstrapping store: %v", err)
}
// Try to get 1st range--non-existent.
if _, err := store.GetRange(1); err == nil {
t.Error("expected error fetching non-existent range")
}
// Create range and fetch.
if _, err := store.CreateRange(engine.KeyMin, engine.KeyMax, []proto.Replica{}); err != nil {
t.Errorf("failure to create first range: %v", err)
}
if _, err := store.GetRange(1); err != nil {
t.Errorf("failure fetching 1st range: %v", err)
}
// Now, attempt to initialize a store with a now-bootstrapped engine.
store = NewStore(clock, eng, nil)
if err := store.Init(); err != nil {
t.Errorf("failure initializing bootstrapped store: %v", err)
}
// 1st range should be available.
if _, err := store.GetRange(1); err != nil {
t.Errorf("failure fetching 1st range: %v", err)
}
}
开发者ID:bigrats,项目名称:cockroach,代码行数:42,代码来源:store_test.go
示例14: TestBootstrapOfNonEmptyStore
// TestBootstrapOfNonEmptyStore verifies bootstrap failure if engine
// is not empty.
func TestBootstrapOfNonEmptyStore(t *testing.T) {
eng := engine.NewInMem(proto.Attributes{}, 1<<20)
// Put some random garbage into the engine.
if err := eng.Put(engine.Key("foo"), []byte("bar")); err != nil {
t.Errorf("failure putting key foo into engine: %v", err)
}
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
store := NewStore(clock, eng, nil)
defer store.Close()
// Can't init as haven't bootstrapped.
if err := store.Init(); err == nil {
t.Error("expected failure init'ing un-bootstrapped store")
}
// Bootstrap should fail on non-empty engine.
if err := store.Bootstrap(testIdent); err == nil {
t.Error("expected bootstrap error on non-empty store")
}
}
开发者ID:bigrats,项目名称:cockroach,代码行数:24,代码来源:store_test.go
示例15: TestRangeUpdateTSCache
// TestRangeUpdateTSCache verifies that reads update the read
// timestamp cache.
func TestRangeUpdateTSCache(t *testing.T) {
rng, mc, clock, _ := createTestRangeWithClock(t)
defer rng.Stop()
// Set clock to time 1s and do the read.
t0 := 1 * time.Second
*mc = hlc.ManualClock(t0.Nanoseconds())
args, reply := getArgs("a", 0)
args.Timestamp = clock.Now()
err := rng.ReadOnlyCmd("Get", args, reply)
if err != nil {
t.Error(err)
}
// Verify the read timestamp cache has 1sec for "a".
ts := rng.tsCache.GetMax(engine.Key("a"), nil)
if ts.WallTime != t0.Nanoseconds() {
t.Errorf("expected wall time to have 1s, but got %+v", ts)
}
// Verify another key ("b") has 0sec in timestamp cache.
ts = rng.tsCache.GetMax(engine.Key("b"), nil)
if ts.WallTime != 0 {
t.Errorf("expected wall time to have 0s, but got %+v", ts)
}
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:25,代码来源:range_test.go
示例16: TestReadTimestampCache
func TestReadTimestampCache(t *testing.T) {
manual := hlc.ManualClock(0)
clock := hlc.NewClock(manual.UnixNano)
clock.SetMaxDrift(maxClockSkew)
rtc := NewReadTimestampCache(clock)
// First simulate a read of just "a" at time 0.
rtc.Add(engine.Key("a"), nil, clock.Now())
// Verify GetMax returns the highWater mark which is maxClockSkew.
if rtc.GetMax(engine.Key("a"), nil).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"a\"")
}
if rtc.GetMax(engine.Key("notincache"), nil).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"notincache\"")
}
// Advance the clock and verify same high water mark.
manual = hlc.ManualClock(maxClockSkew.Nanoseconds() + 1)
if rtc.GetMax(engine.Key("a"), nil).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"a\"")
}
if rtc.GetMax(engine.Key("notincache"), nil).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"notincache\"")
}
// Sim a read of "b"-"c" at time maxClockSkew + 1.
ts := clock.Now()
rtc.Add(engine.Key("b"), engine.Key("c"), ts)
// Verify all permutations of direct and range access.
if !rtc.GetMax(engine.Key("b"), nil).Equal(ts) {
t.Errorf("expected current time for key \"b\"; got %+v", rtc.GetMax(engine.Key("b"), nil))
}
if !rtc.GetMax(engine.Key("bb"), nil).Equal(ts) {
t.Error("expected current time for key \"bb\"")
}
if rtc.GetMax(engine.Key("c"), nil).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"c\"")
}
if !rtc.GetMax(engine.Key("b"), engine.Key("c")).Equal(ts) {
t.Error("expected current time for key \"b\"-\"c\"")
}
if !rtc.GetMax(engine.Key("bb"), engine.Key("bz")).Equal(ts) {
t.Error("expected current time for key \"bb\"-\"bz\"")
}
if rtc.GetMax(engine.Key("a"), engine.Key("b")).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"a\"-\"b\"")
}
if !rtc.GetMax(engine.Key("a"), engine.Key("bb")).Equal(ts) {
t.Error("expected current time for key \"a\"-\"bb\"")
}
if !rtc.GetMax(engine.Key("a"), engine.Key("d")).Equal(ts) {
t.Error("expected current time for key \"a\"-\"d\"")
}
if !rtc.GetMax(engine.Key("bz"), engine.Key("c")).Equal(ts) {
t.Error("expected current time for key \"bz\"-\"c\"")
}
if !rtc.GetMax(engine.Key("bz"), engine.Key("d")).Equal(ts) {
t.Error("expected current time for key \"bz\"-\"d\"")
}
if rtc.GetMax(engine.Key("c"), engine.Key("d")).WallTime != maxClockSkew.Nanoseconds() {
t.Error("expected maxClockSkew for key \"c\"-\"d\"")
}
}
开发者ID:bigrats,项目名称:cockroach,代码行数:64,代码来源:read_timestamp_cache_test.go
注:本文中的github.com/cockroachdb/cockroach/util/hlc.ManualClock函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论