// Ensure shards with deprecated "OwnerIDs" can be decoded. func TestShardInfo_UnmarshalBinary_OwnerIDs(t *testing.T) { // Encode deprecated form to bytes. buf, err := proto.Marshal(&internal.ShardInfo{ ID: proto.Uint64(1), OwnerIDs: []uint64{10, 20, 30}, }) if err != nil { t.Fatal(err) } // Decode deprecated form. var si meta.ShardInfo if err := si.UnmarshalBinary(buf); err != nil { t.Fatal(err) } // Verify data is migrated correctly. if !reflect.DeepEqual(si, meta.ShardInfo{ ID: 1, Owners: []meta.ShardOwner{ {NodeID: 10}, {NodeID: 20}, {NodeID: 30}, }, }) { t.Fatalf("unexpected shard info: %s", spew.Sdump(si)) } }
// CreateMapper returns a Mapper for the given shard ID. func (r *ShardMapper) CreateMapper(sh meta.ShardInfo, stmt string, chunkSize int) (tsdb.Mapper, error) { var err error var m tsdb.Mapper if sh.OwnedBy(r.MetaStore.NodeID()) { m, err = r.TSDBStore.CreateMapper(sh.ID, stmt, chunkSize) if err != nil { return nil, err } } else { m = NewRemoteMaper(sh.OwnerIDs[0], sh.ID, stmt, chunkSize) } return m, nil }
// CreateMapper returns a Mapper for the given shard ID. func (s *ShardMapper) CreateMapper(sh meta.ShardInfo, stmt influxql.Statement, chunkSize int) (tsdb.Mapper, error) { m, err := s.TSDBStore.CreateMapper(sh.ID, stmt, chunkSize) if err != nil { return nil, err } if !sh.OwnedBy(s.MetaStore.NodeID()) || s.ForceRemoteMapping { // Pick a node in a pseudo-random manner. conn, err := s.dial(sh.OwnerIDs[rand.Intn(len(sh.OwnerIDs))]) if err != nil { return nil, err } conn.SetDeadline(time.Now().Add(s.timeout)) m.SetRemote(NewRemoteMapper(conn.(*pool.PoolConn), sh.ID, stmt, chunkSize)) } return m, nil }
// CreateMapper returns a Mapper for the given shard ID. func (s *ShardMapper) CreateMapper(sh meta.ShardInfo, stmt influxql.Statement, chunkSize int) (tsdb.Mapper, error) { // Create a remote mapper if the local node doesn't own the shard. if !sh.OwnedBy(s.MetaStore.NodeID()) || s.ForceRemoteMapping { // Pick a node in a pseudo-random manner. conn, err := s.dial(sh.Owners[rand.Intn(len(sh.Owners))].NodeID) if err != nil { return nil, err } conn.SetDeadline(time.Now().Add(s.timeout)) return NewRemoteMapper(conn, sh.ID, stmt, chunkSize), nil } // If it is local then return the mapper from the store. m, err := s.TSDBStore.CreateMapper(sh.ID, stmt, chunkSize) if err != nil { return nil, err } return m, nil }
// CreateMapper returns a Mapper for the given shard ID. func (s *ShardMapper) CreateMapper(sh meta.ShardInfo, stmt string, chunkSize int) (tsdb.Mapper, error) { var err error var m tsdb.Mapper if sh.OwnedBy(s.MetaStore.NodeID()) && !s.ForceRemoteMapping { m, err = s.TSDBStore.CreateMapper(sh.ID, stmt, chunkSize) if err != nil { return nil, err } } else { // Pick a node in a pseudo-random manner. conn, err := s.dial(sh.OwnerIDs[rand.Intn(len(sh.OwnerIDs))]) if err != nil { return nil, err } conn.SetDeadline(time.Now().Add(s.timeout)) rm := NewRemoteMapper(conn.(*pool.PoolConn), sh.ID, stmt, chunkSize) m = rm } return m, nil }