func (zkts *Server) CreateShard(keyspace, shard string, value *topo.Shard) error { shardPath := path.Join(globalKeyspacesPath, keyspace, "shards", shard) pathList := []string{ shardPath, path.Join(shardPath, "action"), path.Join(shardPath, "actionlog"), } alreadyExists := false for i, zkPath := range pathList { c := "" if i == 0 { c = jscfg.ToJson(value) } _, err := zk.CreateRecursive(zkts.zconn, zkPath, c, 0, zookeeper.WorldACL(zookeeper.PERM_ALL)) if err != nil { if zookeeper.IsError(err, zookeeper.ZNODEEXISTS) { alreadyExists = true } else { return fmt.Errorf("error creating shard: %v %v", zkPath, err) } } } if alreadyExists { return topo.ErrNodeExists } event.Dispatch(&events.ShardChange{ ShardInfo: *topo.NewShardInfo(keyspace, shard, value, -1), Status: "created", }) return nil }
func siBytes(start, end string) *topo.ShardInfo { return topo.NewShardInfo("keyspace", start+"-"+end, &topo.Shard{ KeyRange: key.KeyRange{ Start: key.KeyspaceId(start), End: key.KeyspaceId(end), }, }, 0) }
func TestMigrateServedFromSyslogReverse(t *testing.T) { wantSev, wantMsg := syslog.LOG_INFO, "keyspace-1 [migrate served-from keyspace-2/source-shard <- keyspace-1/dest-shard] status" ev := &MigrateServedFrom{ Keyspace: *topo.NewKeyspaceInfo("keyspace-1", nil, -1), SourceShard: *topo.NewShardInfo("keyspace-2", "source-shard", nil, -1), DestinationShard: *topo.NewShardInfo("keyspace-1", "dest-shard", nil, -1), Reverse: true, StatusUpdater: base.StatusUpdater{Status: "status"}, } gotSev, gotMsg := ev.Syslog() if gotSev != wantSev { t.Errorf("wrong severity: got %v, want %v", gotSev, wantSev) } if gotMsg != wantMsg { t.Errorf("wrong message: got %v, want %v", gotMsg, wantMsg) } }
func si(start, end string) *topo.ShardInfo { s := hki(start) e := hki(end) return topo.NewShardInfo("keyspace", s.String()+"-"+e.String(), &topo.Shard{ KeyRange: key.KeyRange{ Start: s, End: e, }, }, 0) }
func TestShardChangeSyslog(t *testing.T) { wantSev, wantMsg := syslog.LOG_INFO, "keyspace-123/shard-123 [shard] status" sc := &ShardChange{ ShardInfo: *topo.NewShardInfo("keyspace-123", "shard-123", nil, -1), Status: "status", } gotSev, gotMsg := sc.Syslog() if gotSev != wantSev { t.Errorf("wrong severity: got %v, want %v", gotSev, wantSev) } if gotMsg != wantMsg { t.Errorf("wrong message: got %v, want %v", gotMsg, wantMsg) } }
func TestMigrateServedTypesSyslogReverse(t *testing.T) { wantSev, wantMsg := syslog.LOG_INFO, "keyspace-1 [migrate served-types {src1, src2} <- {dst1, dst2}] status" ev := &MigrateServedTypes{ Keyspace: *topo.NewKeyspaceInfo("keyspace-1", nil, -1), SourceShards: []*topo.ShardInfo{ topo.NewShardInfo("keyspace-1", "src1", nil, -1), topo.NewShardInfo("keyspace-1", "src2", nil, -1), }, DestinationShards: []*topo.ShardInfo{ topo.NewShardInfo("keyspace-1", "dst1", nil, -1), topo.NewShardInfo("keyspace-1", "dst2", nil, -1), }, Reverse: true, StatusUpdater: base.StatusUpdater{Status: "status"}, } gotSev, gotMsg := ev.Syslog() if gotSev != wantSev { t.Errorf("wrong severity: got %v, want %v", gotSev, wantSev) } if gotMsg != wantMsg { t.Errorf("wrong message: got %v, want %v", gotMsg, wantMsg) } }
func (zkts *Server) DeleteShard(keyspace, shard string) error { shardPath := path.Join(globalKeyspacesPath, keyspace, "shards", shard) err := zk.DeleteRecursive(zkts.zconn, shardPath, -1) if err != nil { if zookeeper.IsError(err, zookeeper.ZNONODE) { err = topo.ErrNoNode } return err } event.Dispatch(&events.ShardChange{ ShardInfo: *topo.NewShardInfo(keyspace, shard, nil, -1), Status: "deleted", }) return nil }
func (zkts *Server) GetShard(keyspace, shard string) (*topo.ShardInfo, error) { shardPath := path.Join(globalKeyspacesPath, keyspace, "shards", shard) data, stat, err := zkts.zconn.Get(shardPath) if err != nil { if zookeeper.IsError(err, zookeeper.ZNONODE) { err = topo.ErrNoNode } return nil, err } s := &topo.Shard{} if err = json.Unmarshal([]byte(data), s); err != nil { return nil, fmt.Errorf("bad shard data %v", err) } return topo.NewShardInfo(keyspace, shard, s, int64(stat.Version())), nil }