本文整理汇总了Golang中github.com/cockroachdb/cockroach/storage/engine.MakeKey函数的典型用法代码示例。如果您正苦于以下问题:Golang MakeKey函数的具体用法?Golang MakeKey怎么用?Golang MakeKey使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MakeKey函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: newRangeDataIterator
func newRangeDataIterator(r *Range, e engine.Engine) *rangeDataIterator {
r.RLock()
startKey := r.Desc().StartKey
if startKey.Equal(engine.KeyMin) {
startKey = engine.KeyLocalMax
}
endKey := r.Desc().EndKey
r.RUnlock()
ri := &rangeDataIterator{
ranges: []keyRange{
{
start: engine.MVCCEncodeKey(engine.MakeKey(engine.KeyLocalRangeIDPrefix, encoding.EncodeUvarint(nil, uint64(r.Desc().RaftID)))),
end: engine.MVCCEncodeKey(engine.MakeKey(engine.KeyLocalRangeIDPrefix, encoding.EncodeUvarint(nil, uint64(r.Desc().RaftID+1)))),
},
{
start: engine.MVCCEncodeKey(engine.MakeKey(engine.KeyLocalRangeKeyPrefix, encoding.EncodeBytes(nil, startKey))),
end: engine.MVCCEncodeKey(engine.MakeKey(engine.KeyLocalRangeKeyPrefix, encoding.EncodeBytes(nil, endKey))),
},
{
start: engine.MVCCEncodeKey(startKey),
end: engine.MVCCEncodeKey(endKey),
},
},
iter: e.NewIterator(),
}
ri.iter.Seek(ri.ranges[ri.curIndex].start)
ri.advance()
return ri
}
开发者ID:josephwinston,项目名称:cockroach,代码行数:29,代码来源:range_data_iter.go
示例2: BootstrapConfigs
// BootstrapConfigs sets default configurations for accounting,
// permissions, and zones. All configs are specified for the empty key
// prefix, meaning they apply to the entire database. Permissions are
// granted to all users and the zone requires three replicas with no
// other specifications.
func BootstrapConfigs(db DB, timestamp proto.Timestamp) error {
// Accounting config.
acctConfig := &proto.AcctConfig{}
key := engine.MakeKey(engine.KeyConfigAccountingPrefix, engine.KeyMin)
if err := PutProto(db, key, acctConfig, timestamp); err != nil {
return err
}
// Permission config.
permConfig := &proto.PermConfig{
Read: []string{UserRoot}, // root user
Write: []string{UserRoot}, // root user
}
key = engine.MakeKey(engine.KeyConfigPermissionPrefix, engine.KeyMin)
if err := PutProto(db, key, permConfig, timestamp); err != nil {
return err
}
// Zone config.
// TODO(spencer): change this when zone specifications change to elect for three
// replicas with no specific features set.
zoneConfig := &proto.ZoneConfig{
Replicas: []proto.Attributes{
proto.Attributes{},
proto.Attributes{},
proto.Attributes{},
},
RangeMinBytes: 1048576,
RangeMaxBytes: 67108864,
}
key = engine.MakeKey(engine.KeyConfigZonePrefix, engine.KeyMin)
if err := PutProto(db, key, zoneConfig, timestamp); err != nil {
return err
}
return nil
}
开发者ID:bigrats,项目名称:cockroach,代码行数:39,代码来源:db.go
示例3: BootstrapRangeDescriptor
// BootstrapRangeDescriptor sets meta1 and meta2 values for KeyMax,
// using the provided replica.
func BootstrapRangeDescriptor(db DB, desc *proto.RangeDescriptor, timestamp proto.Timestamp) error {
// Write meta1.
if err := PutProto(db, engine.MakeKey(engine.KeyMeta1Prefix, engine.KeyMax), desc, timestamp); err != nil {
return err
}
// Write meta2.
if err := PutProto(db, engine.MakeKey(engine.KeyMeta2Prefix, engine.KeyMax), desc, timestamp); err != nil {
return err
}
return nil
}
开发者ID:bigrats,项目名称:cockroach,代码行数:13,代码来源:db.go
示例4: TestRangeGossipConfigWithMultipleKeyPrefixes
// TestRangeGossipConfigWithMultipleKeyPrefixes verifies that multiple
// key prefixes for a config are gossipped.
func TestRangeGossipConfigWithMultipleKeyPrefixes(t *testing.T) {
e := createTestEngine(t)
// Add a permission for a new key prefix.
db1Perm := proto.PermConfig{
Read: []string{"spencer", "foo", "bar", "baz"},
Write: []string{"spencer"},
}
key := engine.MakeKey(engine.KeyConfigPermissionPrefix, engine.Key("/db1"))
if err := engine.PutProto(e, key, &db1Perm); err != nil {
t.Fatal(err)
}
r, g := createTestRange(e, t)
defer r.Stop()
info, err := g.GetInfo(gossip.KeyConfigPermission)
if err != nil {
t.Fatal(err)
}
configMap := info.(PrefixConfigMap)
expConfigs := []*PrefixConfig{
&PrefixConfig{engine.KeyMin, nil, &testDefaultPermConfig},
&PrefixConfig{engine.Key("/db1"), nil, &db1Perm},
&PrefixConfig{engine.Key("/db2"), engine.KeyMin, &testDefaultPermConfig},
}
if !reflect.DeepEqual([]*PrefixConfig(configMap), expConfigs) {
t.Errorf("expected gossiped configs to be equal %s vs %s", configMap, expConfigs)
}
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:30,代码来源:range_test.go
示例5: 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
示例6: TestRangeGossipConfigUpdates
// TestRangeGossipConfigUpdates verifies that writes to the
// permissions cause the updated configs to be re-gossipped.
func TestRangeGossipConfigUpdates(t *testing.T) {
r, g := createTestRange(createTestEngine(t), t)
defer r.Stop()
// Add a permission for a new key prefix.
db1Perm := proto.PermConfig{
Read: []string{"spencer"},
Write: []string{"spencer"},
}
key := engine.MakeKey(engine.KeyConfigPermissionPrefix, engine.Key("/db1"))
reply := &proto.PutResponse{}
data, err := gogoproto.Marshal(&db1Perm)
if err != nil {
t.Fatal(err)
}
r.Put(&proto.PutRequest{RequestHeader: proto.RequestHeader{Key: key}, Value: proto.Value{Bytes: data}}, reply)
if reply.Error != nil {
t.Fatal(reply.GoError())
}
info, err := g.GetInfo(gossip.KeyConfigPermission)
if err != nil {
t.Fatal(err)
}
configMap := info.(PrefixConfigMap)
expConfigs := []*PrefixConfig{
&PrefixConfig{engine.KeyMin, nil, &testDefaultPermConfig},
&PrefixConfig{engine.Key("/db1"), nil, &db1Perm},
&PrefixConfig{engine.Key("/db2"), engine.KeyMin, &testDefaultPermConfig},
}
if !reflect.DeepEqual([]*PrefixConfig(configMap), expConfigs) {
t.Errorf("expected gossiped configs to be equal %s vs %s", configMap, expConfigs)
}
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:36,代码来源:range_test.go
示例7: InternalHeartbeatTxn
// InternalHeartbeatTxn updates the transaction status and heartbeat
// timestamp after receiving transaction heartbeat messages from
// coordinator. Returns the udpated transaction.
func (r *Range) InternalHeartbeatTxn(args *proto.InternalHeartbeatTxnRequest, reply *proto.InternalHeartbeatTxnResponse) {
// Create the actual key to the system-local transaction table.
key := engine.MakeKey(engine.KeyLocalTransactionPrefix, args.Key)
var txn proto.Transaction
ok, err := engine.GetProto(r.engine, key, &txn)
if err != nil {
reply.SetGoError(err)
return
}
// If no existing transaction record was found, initialize
// to the transaction in the request header.
if !ok {
gogoproto.Merge(&txn, args.Txn)
}
if txn.Status == proto.PENDING {
if txn.LastHeartbeat == nil {
txn.LastHeartbeat = &proto.Timestamp{}
}
if txn.LastHeartbeat.Less(args.Header().Timestamp) {
*txn.LastHeartbeat = args.Header().Timestamp
}
if err := engine.PutProto(r.engine, key, &txn); err != nil {
reply.SetGoError(err)
return
}
}
reply.Txn = &txn
}
开发者ID:embark,项目名称:cockroach,代码行数:31,代码来源:range.go
示例8: newTestMetadataDB
func newTestMetadataDB() *testMetadataDB {
db := &testMetadataDB{}
db.data.Insert(testMetadataNode{
&proto.RangeDescriptor{
StartKey: engine.MakeKey(engine.KeyMeta2Prefix, engine.KeyMin),
EndKey: engine.MakeKey(engine.KeyMeta2Prefix, engine.KeyMax),
},
})
db.data.Insert(testMetadataNode{
&proto.RangeDescriptor{
StartKey: engine.KeyMetaMax,
EndKey: engine.KeyMax,
},
})
return db
}
开发者ID:bdotdub,项目名称:cockroach,代码行数:16,代码来源:range_cache_test.go
示例9: Get
// Get retrieves the zone configuration for the specified key. If the
// key is empty, all zone configurations are returned. Otherwise, the
// leading "/" path delimiter is stripped and the zone configuration
// matching the remainder is retrieved. Note that this will retrieve
// the default zone config if "key" is equal to "/", and will list all
// configs if "key" is equal to "". The body result contains
// JSON-formatted output for a listing of keys and YAML-formatted
// output for retrieval of a zone config.
func (zh *zoneHandler) Get(path string, r *http.Request) (body []byte, contentType string, err error) {
// Scan all zones if the key is empty.
if len(path) == 0 {
sr := <-zh.kvDB.Scan(&storage.ScanRequest{
RequestHeader: storage.RequestHeader{
Key: engine.KeyConfigZonePrefix,
EndKey: engine.PrefixEndKey(engine.KeyConfigZonePrefix),
User: storage.UserRoot,
},
MaxResults: maxGetResults,
})
if sr.Error != nil {
err = sr.Error
return
}
if len(sr.Rows) == maxGetResults {
glog.Warningf("retrieved maximum number of results (%d); some may be missing", maxGetResults)
}
var prefixes []string
for _, kv := range sr.Rows {
trimmed := bytes.TrimPrefix(kv.Key, engine.KeyConfigZonePrefix)
prefixes = append(prefixes, url.QueryEscape(string(trimmed)))
}
// JSON-encode the prefixes array.
contentType = "application/json"
if body, err = json.Marshal(prefixes); err != nil {
err = util.Errorf("unable to format zone configurations: %v", err)
}
} else {
zoneKey := engine.MakeKey(engine.KeyConfigZonePrefix, engine.Key(path[1:]))
var ok bool
config := &storage.ZoneConfig{}
if ok, _, err = kv.GetI(zh.kvDB, zoneKey, config); err != nil {
return
}
// On get, if there's no zone config for the requested prefix,
// return a not found error.
if !ok {
err = util.Errorf("no config found for key prefix %q", path)
return
}
var out []byte
if out, err = yaml.Marshal(config); err != nil {
err = util.Errorf("unable to marshal zone config %+v to yaml: %v", config, err)
return
}
if !utf8.ValidString(string(out)) {
err = util.Errorf("config contents not valid utf8: %q", out)
return
}
contentType = "text/yaml"
body = out
}
return
}
开发者ID:GavinHwa,项目名称:cockroach,代码行数:64,代码来源:zone.go
示例10: UpdateRangeDescriptor
// UpdateRangeDescriptor updates the range locations metadata for the
// range specified by the meta parameter. This always involves a write
// to "meta2", and may require a write to "meta1", in the event that
// meta.EndKey is a "meta2" key (prefixed by KeyMeta2Prefix).
func UpdateRangeDescriptor(db DB, meta proto.RangeMetadata,
desc *proto.RangeDescriptor, timestamp proto.Timestamp) error {
// TODO(spencer): a lot more work here to actually implement this.
// Write meta2.
key := engine.MakeKey(engine.KeyMeta2Prefix, meta.EndKey)
if err := PutProto(db, key, desc, timestamp); err != nil {
return err
}
return nil
}
开发者ID:bigrats,项目名称:cockroach,代码行数:15,代码来源:db.go
示例11: allocateStoreIDs
// allocateStoreIDs increments the store id generator key for the
// specified node to allocate "inc" new, unique store ids. The
// first ID in a contiguous range is returned on success.
func allocateStoreIDs(nodeID proto.NodeID, inc int64, db *client.KV) (proto.StoreID, error) {
iReply := &proto.IncrementResponse{}
if err := db.Call(proto.Increment, &proto.IncrementRequest{
RequestHeader: proto.RequestHeader{
Key: engine.MakeKey(engine.KeyStoreIDGeneratorPrefix, []byte(strconv.Itoa(int(nodeID)))),
User: storage.UserRoot,
},
Increment: inc,
}, iReply); err != nil {
return 0, util.Errorf("unable to allocate %d store IDs for node %d: %v", inc, nodeID, err)
}
return proto.StoreID(iReply.NewValue - inc + 1), nil
}
开发者ID:josephwinston,项目名称:cockroach,代码行数:16,代码来源:node.go
示例12: Put
// Put writes a perm config for the specified key prefix (which is treated as
// a key). The perm config is parsed from the input "body". The perm config is
// stored gob-encoded. The specified body must validly parse into a
// perm config struct.
func (ph *permHandler) Put(path string, body []byte, r *http.Request) error {
if len(path) == 0 {
return util.Errorf("no path specified for permission Put")
}
config := &proto.PermConfig{}
if err := util.UnmarshalRequest(r, body, config, util.AllEncodings); err != nil {
return util.Errorf("permission config has invalid format: %s: %s", config, err)
}
permKey := engine.MakeKey(engine.KeyConfigPermissionPrefix, proto.Key(path[1:]))
if err := ph.db.PutProto(permKey, config); err != nil {
return err
}
return nil
}
开发者ID:josephwinston,项目名称:cockroach,代码行数:18,代码来源:permission.go
示例13: allocateStoreIDs
// allocateStoreIDs increments the store id generator key for the
// specified node to allocate "inc" new, unique store ids. The
// first ID in a contiguous range is returned on success.
func allocateStoreIDs(nodeID int32, inc int64, db storage.DB) (int32, error) {
ir := <-db.Increment(&proto.IncrementRequest{
// The Key is a concatenation of StoreIDGeneratorPrefix and this node's ID.
RequestHeader: proto.RequestHeader{
Key: engine.MakeKey(engine.KeyStoreIDGeneratorPrefix, []byte(strconv.Itoa(int(nodeID)))),
User: storage.UserRoot,
},
Increment: inc,
})
if ir.Error != nil {
return 0, util.Errorf("unable to allocate %d store IDs for node %d: %v", inc, nodeID, ir.Error)
}
return int32(ir.NewValue - inc + 1), nil
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:17,代码来源:node.go
示例14: Delete
// Delete removes the perm config specified by key.
func (ph *permHandler) Delete(path string, r *http.Request) error {
if len(path) == 0 {
return util.Errorf("no path specified for permission Delete")
}
if path == "/" {
return util.Errorf("the default permission configuration cannot be deleted")
}
permKey := engine.MakeKey(engine.KeyConfigPermissionPrefix, proto.Key(path[1:]))
return ph.db.Call(proto.Delete, &proto.DeleteRequest{
RequestHeader: proto.RequestHeader{
Key: permKey,
User: storage.UserRoot,
},
}, &proto.DeleteResponse{})
}
开发者ID:josephwinston,项目名称:cockroach,代码行数:16,代码来源:permission.go
示例15: addRequest
func (tc *coordinator) addRequest(header *storage.RequestHeader) {
// Ignore non-transactional requests.
if len(header.TxID) == 0 {
return
}
if _, ok := tc.TransactionMap[header.TxID]; !ok {
tc.TransactionMap[header.TxID] = tc.newTxnMetadata()
// TODO(jiajia): Reevaluate this logic of creating a goroutine
// for each active transaction. Spencer suggests a heap
// containing next heartbeat timeouts which is processed by a
// single goroutine.
go tc.heartbeat(engine.MakeKey(engine.KeyTransactionPrefix, engine.Key(header.TxID)), tc.TransactionMap[header.TxID].closer)
}
txnMeta := tc.TransactionMap[header.TxID]
txnMeta.lastUpdateTS = tc.clock.Now()
}
开发者ID:hubt,项目名称:cockroach,代码行数:16,代码来源:coordinator.go
示例16: 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
示例17: Put
// Put writes a zone config for the specified key prefix "key". The
// zone config is parsed from the input "body". The zone config is
// stored gob-encoded. The specified body must be valid utf8 and must
// validly parse into a zone config struct.
func (zh *zoneHandler) Put(path string, body []byte, r *http.Request) error {
if len(path) == 0 {
return util.Errorf("no path specified for zone Put")
}
configStr := string(body)
if !utf8.ValidString(configStr) {
return util.Errorf("config contents not valid utf8: %q", body)
}
config, err := storage.ParseZoneConfig(body)
if err != nil {
return util.Errorf("zone config has invalid format: %s: %v", configStr, err)
}
zoneKey := engine.MakeKey(engine.KeyConfigZonePrefix, engine.Key(path[1:]))
if err := kv.PutI(zh.kvDB, zoneKey, config, hlc.HLTimestamp{}); err != nil {
return err
}
return nil
}
开发者ID:GavinHwa,项目名称:cockroach,代码行数:22,代码来源:zone.go
示例18: Delete
// Delete removes the zone config specified by key.
func (zh *zoneHandler) Delete(path string, r *http.Request) error {
if len(path) == 0 {
return util.Errorf("no path specified for zone Delete")
}
if path == "/" {
return util.Errorf("the default zone configuration cannot be deleted")
}
zoneKey := engine.MakeKey(engine.KeyConfigZonePrefix, engine.Key(path[1:]))
dr := <-zh.kvDB.Delete(&storage.DeleteRequest{
RequestHeader: storage.RequestHeader{
Key: zoneKey,
User: storage.UserRoot,
},
})
if dr.Error != nil {
return dr.Error
}
return nil
}
开发者ID:GavinHwa,项目名称:cockroach,代码行数:20,代码来源:zone.go
示例19: InternalHeartbeatTxn
// InternalHeartbeatTxn updates the transaction status and heartbeat
// timestamp after receiving transaction heartbeat messages from
// coordinator. The range will return the current status for this
// transaction to the coordinator.
func (r *Range) InternalHeartbeatTxn(args *proto.InternalHeartbeatTxnRequest, reply *proto.InternalHeartbeatTxnResponse) {
// Create the actual key to the system-local transaction table.
key := engine.MakeKey(engine.KeyLocalTransactionPrefix, args.Key)
var txn proto.Transaction
if _, err := engine.GetProto(r.engine, key, &txn); err != nil {
reply.SetGoError(err)
return
}
if txn.Status == proto.PENDING {
if !args.Header().Timestamp.Less(txn.LastHeartbeat) {
txn.LastHeartbeat = args.Header().Timestamp
}
if err := engine.PutProto(r.engine, key, &txn); err != nil {
reply.SetGoError(err)
return
}
}
reply.Status = txn.Status
}
开发者ID:kuguobing,项目名称:cockroach,代码行数:23,代码来源:range.go
示例20: TestNullPrefixedKeys
// TestNullPrefixedKeys makes sure that the internal system keys are not accessible through the HTTP API.
func TestNullPrefixedKeys(t *testing.T) {
// TODO(zbrock + matthew) fix this once sqlite key encoding is finished so we can namespace user keys
t.Skip("Internal Meta1 Keys should not be accessible from the HTTP REST API. But they are right now.")
metaKey := engine.MakeKey(engine.KeyMeta1Prefix, engine.KeyMax)
s := startNewServer()
// Precondition: we want to make sure the meta1 key exists.
initialVal, err := s.rawGet(metaKey)
if err != nil {
t.Fatalf("Precondition Failed! Unable to fetch %+v from local db", metaKey)
}
if initialVal == nil {
t.Fatalf("Precondition Failed! Expected meta1 key to exist in the underlying store, but no value found")
}
// Try to manipulate the meta1 key.
encMeta1Key := url.QueryEscape(string(metaKey))
runHTTPTestFixture(t, []RequestResponse{
{
NewRequest("GET", encMeta1Key),
NewResponse(404),
},
{
NewRequest("POST", encMeta1Key, "cool"),
NewResponse(200),
},
{
NewRequest("GET", encMeta1Key),
NewResponse(200, "cool", "application/octet-stream"),
},
}, s)
// Postcondition: the meta1 key is untouched.
afterVal, err := s.rawGet(metaKey)
if err != nil {
t.Errorf("Unable to fetch %+v from local db", metaKey)
}
if !bytes.Equal(afterVal, initialVal) {
t.Errorf("Expected meta1 to be unchanged, but it differed: %+v", afterVal)
}
}
开发者ID:hubt,项目名称:cockroach,代码行数:43,代码来源:rest_test.go
注:本文中的github.com/cockroachdb/cockroach/storage/engine.MakeKey函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论