Use defaults from `meta` package for `CREATE DATABASE`

Instead of having the parser set the defaults, the command will set the
defaults so that the constants for that are actually used. This way we
can also identify which things the user provided and which ones we are
filling with default values.

This allows the meta client to be able to make smarter decisions when
determining if the user requested a conflict or if the requested
capabilities match with what is currently available. If you just say
`CREATE DATABASE WITH NAME myrp`, the user doesn't really care what the
duration of the retention policy is and just wants to use the default.
Now, we can use that information to determine if an existing retention
policy would conflict with what the user requested rather than returning
an error if a default value ever gets changed since the meta client
command can communicate intent more easily.
pull/7245/head
Jonathan A. Sternberg 2016-08-09 12:00:04 -05:00
parent 3a349fd8ae
commit 23f2d50ecb
19 changed files with 558 additions and 334 deletions

View File

@ -129,6 +129,7 @@ With this release the systemd configuration files for InfluxDB will use the syst
- [#7218](https://github.com/influxdata/influxdb/issues/7218): Fix alter retention policy when all options are used.
- [#7225](https://github.com/influxdata/influxdb/issues/7225): runtime: goroutine stack exceeds 1000000000-byte limit
- [#7240](https://github.com/influxdata/influxdb/issues/7240): Allow blank lines in the line protocol input.
- [#7119](https://github.com/influxdata/influxdb/pull/7119): Fix CREATE DATABASE when dealing with default values.
## v0.13.0 [2016-05-12]

View File

@ -34,7 +34,7 @@ func TestServer_BackupAndRestore(t *testing.T) {
s := OpenServer(config)
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy(db, newRetentionPolicyInfo(rp, 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(db, newRetentionPolicySpec(rp, 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy(db, rp); err != nil {

View File

@ -78,7 +78,7 @@ func OpenServerWithVersion(c *run.Config, version string) *Server {
// OpenDefaultServer opens a test server with a default database & retention policy.
func OpenDefaultServer(c *run.Config) *Server {
s := OpenServer(c)
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
panic(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -111,7 +111,7 @@ func (s *Server) URL() string {
}
// CreateDatabaseAndRetentionPolicy will create the database and retention policy.
func (s *Server) CreateDatabaseAndRetentionPolicy(db string, rp *meta.RetentionPolicyInfo) error {
func (s *Server) CreateDatabaseAndRetentionPolicy(db string, rp *meta.RetentionPolicySpec) error {
if _, err := s.MetaClient.CreateDatabase(db); err != nil {
return err
} else if _, err := s.MetaClient.CreateRetentionPolicy(db, rp); err != nil {
@ -250,8 +250,8 @@ func NewConfig() *run.Config {
return c
}
func newRetentionPolicyInfo(name string, rf int, duration time.Duration) *meta.RetentionPolicyInfo {
return &meta.RetentionPolicyInfo{Name: name, ReplicaN: rf, Duration: duration}
func newRetentionPolicySpec(name string, rf int, duration time.Duration) *meta.RetentionPolicySpec {
return &meta.RetentionPolicySpec{Name: name, ReplicaN: &rf, Duration: &duration}
}
func maxFloat64() string {
@ -456,7 +456,7 @@ func writeTestData(s *Server, t *Test) error {
w.rp = t.retentionPolicy()
}
if err := s.CreateDatabaseAndRetentionPolicy(w.db, newRetentionPolicyInfo(w.rp, 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(w.db, newRetentionPolicySpec(w.rp, 1, 0)); err != nil {
return err
}
if err := s.MetaClient.SetDefaultRetentionPolicy(w.db, w.rp); err != nil {

View File

@ -54,7 +54,7 @@ func TestServer_Query_DropAndRecreateDatabase(t *testing.T) {
test := tests.load(t, "drop_and_recreate_database")
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicyInfo(test.retentionPolicy(), 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicySpec(test.retentionPolicy(), 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy(test.database(), test.retentionPolicy()); err != nil {
@ -86,13 +86,13 @@ func TestServer_Query_DropDatabaseIsolated(t *testing.T) {
test := tests.load(t, "drop_database_isolated")
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicyInfo(test.retentionPolicy(), 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicySpec(test.retentionPolicy(), 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy(test.database(), test.retentionPolicy()); err != nil {
t.Fatal(err)
}
if err := s.CreateDatabaseAndRetentionPolicy("db1", newRetentionPolicyInfo("rp1", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db1", newRetentionPolicySpec("rp1", 1, 0)); err != nil {
t.Fatal(err)
}
@ -121,7 +121,7 @@ func TestServer_Query_DeleteSeries(t *testing.T) {
test := tests.load(t, "delete_series")
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicyInfo(test.retentionPolicy(), 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicySpec(test.retentionPolicy(), 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy(test.database(), test.retentionPolicy()); err != nil {
@ -153,7 +153,7 @@ func TestServer_Query_DropAndRecreateSeries(t *testing.T) {
test := tests.load(t, "drop_and_recreate_series")
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicyInfo(test.retentionPolicy(), 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicySpec(test.retentionPolicy(), 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy(test.database(), test.retentionPolicy()); err != nil {
@ -205,7 +205,7 @@ func TestServer_Query_DropSeriesFromRegex(t *testing.T) {
test := tests.load(t, "drop_series_from_regex")
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicyInfo(test.retentionPolicy(), 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy(test.database(), newRetentionPolicySpec(test.retentionPolicy(), 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy(test.database(), test.retentionPolicy()); err != nil {
@ -379,7 +379,7 @@ func TestServer_Write_LineProtocol_Float(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 1*time.Hour)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 1*time.Hour)); err != nil {
t.Fatal(err)
}
@ -404,7 +404,7 @@ func TestServer_Write_LineProtocol_Bool(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 1*time.Hour)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 1*time.Hour)); err != nil {
t.Fatal(err)
}
@ -429,7 +429,7 @@ func TestServer_Write_LineProtocol_String(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 1*time.Hour)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 1*time.Hour)); err != nil {
t.Fatal(err)
}
@ -454,7 +454,7 @@ func TestServer_Write_LineProtocol_Integer(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 1*time.Hour)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 1*time.Hour)); err != nil {
t.Fatal(err)
}
@ -480,7 +480,7 @@ func TestServer_Write_LineProtocol_Partial(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 1*time.Hour)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 1*time.Hour)); err != nil {
t.Fatal(err)
}
@ -2471,7 +2471,7 @@ func TestServer_Query_MergeMany(t *testing.T) {
defer s.Close()
// set infinite retention policy as we are inserting data in the past and don't want retention policy enforcement to make this test racy
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
@ -2531,7 +2531,7 @@ func TestServer_Query_SLimitAndSOffset(t *testing.T) {
defer s.Close()
// set infinite retention policy as we are inserting data in the past and don't want retention policy enforcement to make this test racy
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
@ -2587,7 +2587,7 @@ func TestServer_Query_Regex(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -3566,7 +3566,7 @@ func TestServer_Query_AggregateSelectors(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -3898,7 +3898,7 @@ func TestServer_Query_TopInt(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4065,7 +4065,7 @@ func TestServer_Query_Aggregates_IdenticalTime(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4133,7 +4133,7 @@ func TestServer_Query_GroupByTimeCutoffs(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4215,7 +4215,7 @@ func TestServer_Write_Precision(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4332,7 +4332,7 @@ func TestServer_Query_Wildcards(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4450,7 +4450,7 @@ func TestServer_Query_WildcardExpansion(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4530,7 +4530,7 @@ func TestServer_Query_AcrossShardsAndFields(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4604,7 +4604,7 @@ func TestServer_Query_Where_Fields(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4826,7 +4826,7 @@ func TestServer_Query_Where_With_Tags(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -4914,7 +4914,7 @@ func TestServer_Query_With_EmptyTags(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5005,7 +5005,7 @@ func TestServer_Query_LimitAndOffset(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5122,7 +5122,7 @@ func TestServer_Query_Fill(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5221,7 +5221,7 @@ func TestServer_Query_Chunk(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5273,13 +5273,13 @@ func TestServer_Query_DropAndRecreateMeasurement(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
t.Fatal(err)
}
if err := s.CreateDatabaseAndRetentionPolicy("db1", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db1", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db1", "rp0"); err != nil {
@ -5439,7 +5439,7 @@ func TestServer_Query_ShowQueries_Future(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5511,7 +5511,7 @@ func TestServer_Query_ShowSeries(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5613,7 +5613,7 @@ func TestServer_Query_ShowMeasurements(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5703,7 +5703,7 @@ func TestServer_Query_ShowTagKeys(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5853,7 +5853,7 @@ func TestServer_Query_ShowFieldKeys(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -5919,7 +5919,7 @@ func TestServer_ContinuousQuery(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6054,7 +6054,7 @@ func TestServer_ContinuousQuery_Deadlock(t *testing.T) {
s.Server = nil
}()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6127,7 +6127,7 @@ func TestServer_Query_EvilIdentifiers(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6171,7 +6171,7 @@ func TestServer_Query_OrderByTime(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6233,7 +6233,7 @@ func TestServer_Query_FieldWithMultiplePeriods(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6287,7 +6287,7 @@ func TestServer_Query_FieldWithMultiplePeriodsMeasurementPrefixMatch(t *testing.
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6341,7 +6341,7 @@ func TestServer_Query_IntoTarget(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {
@ -6401,7 +6401,7 @@ func TestServer_Query_DuplicateMeasurements(t *testing.T) {
defer s.Close()
// Create a second database.
if err := s.CreateDatabaseAndRetentionPolicy("db1", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db1", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db1", "rp0"); err != nil {
@ -6528,7 +6528,7 @@ func TestServer_WhereTimeInclusive(t *testing.T) {
s := OpenServer(NewConfig())
defer s.Close()
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicyInfo("rp0", 1, 0)); err != nil {
if err := s.CreateDatabaseAndRetentionPolicy("db0", newRetentionPolicySpec("rp0", 1, 0)); err != nil {
t.Fatal(err)
}
if err := s.MetaClient.SetDefaultRetentionPolicy("db0", "rp0"); err != nil {

View File

@ -11,8 +11,8 @@ import (
type MetaClient interface {
CreateContinuousQuery(database, name, query string) error
CreateDatabase(name string) (*meta.DatabaseInfo, error)
CreateDatabaseWithRetentionPolicy(name string, rpi *meta.RetentionPolicyInfo) (*meta.DatabaseInfo, error)
CreateRetentionPolicy(database string, rpi *meta.RetentionPolicyInfo) (*meta.RetentionPolicyInfo, error)
CreateDatabaseWithRetentionPolicy(name string, spec *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error)
CreateRetentionPolicy(database string, spec *meta.RetentionPolicySpec) (*meta.RetentionPolicyInfo, error)
CreateSubscription(database, rp, name, mode string, destinations []string) error
CreateUser(name, password string, admin bool) (*meta.UserInfo, error)
Database(name string) *meta.DatabaseInfo

View File

@ -11,8 +11,8 @@ import (
type MetaClient struct {
CreateContinuousQueryFn func(database, name, query string) error
CreateDatabaseFn func(name string) (*meta.DatabaseInfo, error)
CreateDatabaseWithRetentionPolicyFn func(name string, rpi *meta.RetentionPolicyInfo) (*meta.DatabaseInfo, error)
CreateRetentionPolicyFn func(database string, rpi *meta.RetentionPolicyInfo) (*meta.RetentionPolicyInfo, error)
CreateDatabaseWithRetentionPolicyFn func(name string, spec *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error)
CreateRetentionPolicyFn func(database string, spec *meta.RetentionPolicySpec) (*meta.RetentionPolicyInfo, error)
CreateSubscriptionFn func(database, rp, name, mode string, destinations []string) error
CreateUserFn func(name, password string, admin bool) (*meta.UserInfo, error)
DatabaseFn func(name string) *meta.DatabaseInfo
@ -48,13 +48,14 @@ func (c *MetaClient) CreateDatabase(name string) (*meta.DatabaseInfo, error) {
return c.CreateDatabaseFn(name)
}
func (c *MetaClient) CreateDatabaseWithRetentionPolicy(name string, rpi *meta.RetentionPolicyInfo) (*meta.DatabaseInfo, error) {
return c.CreateDatabaseWithRetentionPolicyFn(name, rpi)
func (c *MetaClient) CreateDatabaseWithRetentionPolicy(name string, spec *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error) {
return c.CreateDatabaseWithRetentionPolicyFn(name, spec)
}
func (c *MetaClient) CreateRetentionPolicy(database string, rpi *meta.RetentionPolicyInfo) (*meta.RetentionPolicyInfo, error) {
return c.CreateRetentionPolicyFn(database, rpi)
func (c *MetaClient) CreateRetentionPolicy(database string, spec *meta.RetentionPolicySpec) (*meta.RetentionPolicyInfo, error) {
return c.CreateRetentionPolicyFn(database, spec)
}
func (c *MetaClient) DropShard(id uint64) error {
return c.DropShardFn(id)
}

View File

@ -252,28 +252,33 @@ func (e *StatementExecutor) executeCreateDatabaseStatement(stmt *influxql.Create
return err
}
rpi := meta.NewRetentionPolicyInfo(stmt.RetentionPolicyName)
rpi.Duration = stmt.RetentionPolicyDuration
rpi.ReplicaN = stmt.RetentionPolicyReplication
rpi.ShardGroupDuration = stmt.RetentionPolicyShardGroupDuration
_, err := e.MetaClient.CreateDatabaseWithRetentionPolicy(stmt.Name, rpi)
spec := meta.RetentionPolicySpec{
Name: stmt.RetentionPolicyName,
Duration: stmt.RetentionPolicyDuration,
ReplicaN: stmt.RetentionPolicyReplication,
ShardGroupDuration: stmt.RetentionPolicyShardGroupDuration,
}
_, err := e.MetaClient.CreateDatabaseWithRetentionPolicy(stmt.Name, &spec)
return err
}
func (e *StatementExecutor) executeCreateRetentionPolicyStatement(stmt *influxql.CreateRetentionPolicyStatement) error {
rpi := meta.NewRetentionPolicyInfo(stmt.Name)
rpi.Duration = stmt.Duration
rpi.ReplicaN = stmt.Replication
rpi.ShardGroupDuration = stmt.ShardGroupDuration
spec := meta.RetentionPolicySpec{
Name: stmt.Name,
Duration: &stmt.Duration,
ReplicaN: &stmt.Replication,
ShardGroupDuration: stmt.ShardGroupDuration,
}
// Create new retention policy.
if _, err := e.MetaClient.CreateRetentionPolicy(stmt.Database, rpi); err != nil {
rp, err := e.MetaClient.CreateRetentionPolicy(stmt.Database, &spec)
if err != nil {
return err
}
// If requested, set new policy as the default.
if stmt.Default {
if err := e.MetaClient.SetDefaultRetentionPolicy(stmt.Database, stmt.Name); err != nil {
if err := e.MetaClient.SetDefaultRetentionPolicy(stmt.Database, rp.Name); err != nil {
return err
}
}

View File

@ -463,10 +463,10 @@ type CreateDatabaseStatement struct {
RetentionPolicyCreate bool
// RetentionPolicyDuration indicates retention duration for the new database
RetentionPolicyDuration time.Duration
RetentionPolicyDuration *time.Duration
// RetentionPolicyReplication indicates retention replication for the new database
RetentionPolicyReplication int
RetentionPolicyReplication *int
// RetentionPolicyName indicates retention name for the new database
RetentionPolicyName string
@ -481,16 +481,23 @@ func (s *CreateDatabaseStatement) String() string {
_, _ = buf.WriteString("CREATE DATABASE ")
_, _ = buf.WriteString(QuoteIdent(s.Name))
if s.RetentionPolicyCreate {
_, _ = buf.WriteString(" WITH DURATION ")
_, _ = buf.WriteString(s.RetentionPolicyDuration.String())
_, _ = buf.WriteString(" REPLICATION ")
_, _ = buf.WriteString(strconv.Itoa(s.RetentionPolicyReplication))
_, _ = buf.WriteString(" WITH")
if s.RetentionPolicyDuration != nil {
_, _ = buf.WriteString(" DURATION ")
_, _ = buf.WriteString(s.RetentionPolicyDuration.String())
}
if s.RetentionPolicyReplication != nil {
_, _ = buf.WriteString(" REPLICATION ")
_, _ = buf.WriteString(strconv.Itoa(*s.RetentionPolicyReplication))
}
if s.RetentionPolicyShardGroupDuration > 0 {
_, _ = buf.WriteString(" SHARD DURATION ")
_, _ = buf.WriteString(s.RetentionPolicyShardGroupDuration.String())
}
_, _ = buf.WriteString(" NAME ")
_, _ = buf.WriteString(QuoteIdent(s.RetentionPolicyName))
if s.RetentionPolicyName != "" {
_, _ = buf.WriteString(" NAME ")
_, _ = buf.WriteString(QuoteIdent(s.RetentionPolicyName))
}
}
return buf.String()

View File

@ -1541,31 +1541,28 @@ func (p *Parser) parseCreateDatabaseStatement() (*CreateDatabaseStatement, error
stmt.RetentionPolicyCreate = true
// Look for "DURATION"
var rpDuration time.Duration // default is forever
if err := p.parseTokens([]Token{DURATION}); err != nil {
p.unscan()
} else {
rpDuration, err = p.parseDuration()
rpDuration, err := p.parseDuration()
if err != nil {
return nil, err
}
stmt.RetentionPolicyDuration = &rpDuration
}
stmt.RetentionPolicyDuration = rpDuration
// Look for "REPLICATION"
var rpReplication = 1 // default is 1
if err := p.parseTokens([]Token{REPLICATION}); err != nil {
p.unscan()
} else {
rpReplication, err = p.parseInt(1, math.MaxInt32)
rpReplication, err := p.parseInt(1, math.MaxInt32)
if err != nil {
return nil, err
}
stmt.RetentionPolicyReplication = &rpReplication
}
stmt.RetentionPolicyReplication = rpReplication
// Look for "SHARD"
var rpShardGroupDuration time.Duration
if err := p.parseTokens([]Token{SHARD}); err != nil {
p.unscan()
} else {
@ -1574,11 +1571,10 @@ func (p *Parser) parseCreateDatabaseStatement() (*CreateDatabaseStatement, error
if tok != DURATION {
return nil, newParseError(tokstr(tok, lit), []string{"DURATION"}, pos)
}
rpShardGroupDuration, err = p.parseDuration()
stmt.RetentionPolicyShardGroupDuration, err = p.parseDuration()
if err != nil {
return nil, err
}
stmt.RetentionPolicyShardGroupDuration = rpShardGroupDuration
}
// Look for "NAME"

View File

@ -1635,9 +1635,8 @@ func TestParser_ParseStatement(t *testing.T) {
s: `CREATE DATABASE testdb WITH DURATION 24h`,
stmt: &influxql.CreateDatabaseStatement{
Name: "testdb",
RetentionPolicyCreate: true,
RetentionPolicyDuration: 24 * time.Hour,
RetentionPolicyReplication: 1,
RetentionPolicyCreate: true,
RetentionPolicyDuration: duration(24 * time.Hour),
},
},
{
@ -1645,8 +1644,6 @@ func TestParser_ParseStatement(t *testing.T) {
stmt: &influxql.CreateDatabaseStatement{
Name: "testdb",
RetentionPolicyCreate: true,
RetentionPolicyDuration: 0,
RetentionPolicyReplication: 1,
RetentionPolicyShardGroupDuration: 30 * time.Minute,
},
},
@ -1655,18 +1652,15 @@ func TestParser_ParseStatement(t *testing.T) {
stmt: &influxql.CreateDatabaseStatement{
Name: "testdb",
RetentionPolicyCreate: true,
RetentionPolicyDuration: 0,
RetentionPolicyReplication: 2,
RetentionPolicyReplication: intptr(2),
},
},
{
s: `CREATE DATABASE testdb WITH NAME test_name`,
stmt: &influxql.CreateDatabaseStatement{
Name: "testdb",
RetentionPolicyCreate: true,
RetentionPolicyDuration: 0,
RetentionPolicyReplication: 1,
RetentionPolicyName: "test_name",
RetentionPolicyCreate: true,
RetentionPolicyName: "test_name",
},
},
{
@ -1674,8 +1668,8 @@ func TestParser_ParseStatement(t *testing.T) {
stmt: &influxql.CreateDatabaseStatement{
Name: "testdb",
RetentionPolicyCreate: true,
RetentionPolicyDuration: 24 * time.Hour,
RetentionPolicyReplication: 2,
RetentionPolicyDuration: duration(24 * time.Hour),
RetentionPolicyReplication: intptr(2),
RetentionPolicyName: "test_name",
},
},
@ -1684,8 +1678,8 @@ func TestParser_ParseStatement(t *testing.T) {
stmt: &influxql.CreateDatabaseStatement{
Name: "testdb",
RetentionPolicyCreate: true,
RetentionPolicyDuration: 24 * time.Hour,
RetentionPolicyReplication: 2,
RetentionPolicyDuration: duration(24 * time.Hour),
RetentionPolicyReplication: intptr(2),
RetentionPolicyName: "test_name",
RetentionPolicyShardGroupDuration: 10 * time.Minute,
},
@ -2818,3 +2812,11 @@ func mustParseDuration(s string) time.Duration {
}
return d
}
func duration(v time.Duration) *time.Duration {
return &v
}
func intptr(v int) *int {
return &v
}

View File

@ -23,6 +23,7 @@ import (
const (
MonitorRetentionPolicy = "monitor"
MonitorRetentionPolicyDuration = 7 * 24 * time.Hour
MonitorRetentionPolicyReplicaN = 1
)
// Monitor represents an instance of the monitor system.
@ -51,7 +52,7 @@ type Monitor struct {
storeInterval time.Duration
MetaClient interface {
CreateDatabaseWithRetentionPolicy(name string, rpi *meta.RetentionPolicyInfo) (*meta.DatabaseInfo, error)
CreateDatabaseWithRetentionPolicy(name string, spec *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error)
Database(name string) *meta.DatabaseInfo
}
@ -352,11 +353,15 @@ func (m *Monitor) createInternalStorage() {
}
if di := m.MetaClient.Database(m.storeDatabase); di == nil {
rpi := meta.NewRetentionPolicyInfo(MonitorRetentionPolicy)
rpi.Duration = MonitorRetentionPolicyDuration
rpi.ReplicaN = 1
duration := MonitorRetentionPolicyDuration
replicaN := MonitorRetentionPolicyReplicaN
spec := meta.RetentionPolicySpec{
Name: MonitorRetentionPolicy,
Duration: &duration,
ReplicaN: &replicaN,
}
if _, err := m.MetaClient.CreateDatabaseWithRetentionPolicy(m.storeDatabase, rpi); err != nil {
if _, err := m.MetaClient.CreateDatabaseWithRetentionPolicy(m.storeDatabase, &spec); err != nil {
m.Logger.Printf("failed to create database '%s', failed to create storage: %s",
m.storeDatabase, err.Error())
return

View File

@ -83,8 +83,8 @@ type Service struct {
}
MetaClient interface {
CreateDatabase(name string) (*meta.DatabaseInfo, error)
CreateDatabaseWithRetentionPolicy(name string, rpi *meta.RetentionPolicyInfo) (*meta.DatabaseInfo, error)
CreateRetentionPolicy(database string, rpi *meta.RetentionPolicyInfo) (*meta.RetentionPolicyInfo, error)
CreateDatabaseWithRetentionPolicy(name string, spec *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error)
CreateRetentionPolicy(database string, spec *meta.RetentionPolicySpec) (*meta.RetentionPolicyInfo, error)
Database(name string) *meta.DatabaseInfo
RetentionPolicy(database, name string) (*meta.RetentionPolicyInfo, error)
}
@ -139,14 +139,14 @@ func (s *Service) Open() error {
if db := s.MetaClient.Database(s.database); db != nil {
if rp, _ := s.MetaClient.RetentionPolicy(s.database, s.retentionPolicy); rp == nil {
rpi := meta.NewRetentionPolicyInfo(s.retentionPolicy)
if _, err := s.MetaClient.CreateRetentionPolicy(s.database, rpi); err != nil {
spec := meta.RetentionPolicySpec{Name: s.retentionPolicy}
if _, err := s.MetaClient.CreateRetentionPolicy(s.database, &spec); err != nil {
s.logger.Printf("Failed to ensure target retention policy %s exists: %s", s.database, err.Error())
}
}
} else {
rpi := meta.NewRetentionPolicyInfo(s.retentionPolicy)
if _, err := s.MetaClient.CreateDatabaseWithRetentionPolicy(s.database, rpi); err != nil {
spec := meta.RetentionPolicySpec{Name: s.retentionPolicy}
if _, err := s.MetaClient.CreateDatabaseWithRetentionPolicy(s.database, &spec); err != nil {
s.logger.Printf("Failed to ensure target database %s exists: %s", s.database, err.Error())
return err
}

View File

@ -176,11 +176,11 @@ func (d *DatabaseCreator) CreateDatabase(name string) (*meta.DatabaseInfo, error
return nil, nil
}
func (d *DatabaseCreator) CreateRetentionPolicy(database string, rpi *meta.RetentionPolicyInfo) (*meta.RetentionPolicyInfo, error) {
func (d *DatabaseCreator) CreateRetentionPolicy(database string, spec *meta.RetentionPolicySpec) (*meta.RetentionPolicyInfo, error) {
return nil, nil
}
func (d *DatabaseCreator) CreateDatabaseWithRetentionPolicy(name string, rpi *meta.RetentionPolicyInfo) (*meta.DatabaseInfo, error) {
func (d *DatabaseCreator) CreateDatabaseWithRetentionPolicy(name string, spec *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error) {
d.Created = true
return nil, nil
}

View File

@ -187,12 +187,11 @@ func (c *Client) CreateDatabase(name string) (*DatabaseInfo, error) {
// create default retention policy
if c.retentionAutoCreate {
if err := data.CreateRetentionPolicy(name, &RetentionPolicyInfo{
ReplicaN: 1,
}); err != nil {
rpi := DefaultRetentionPolicyInfo()
if err := data.CreateRetentionPolicy(name, rpi); err != nil {
return nil, err
}
if err := data.SetDefaultRetentionPolicy(name, ""); err != nil {
if err := data.SetDefaultRetentionPolicy(name, rpi.Name); err != nil {
return nil, err
}
}
@ -207,42 +206,48 @@ func (c *Client) CreateDatabase(name string) (*DatabaseInfo, error) {
}
// CreateDatabaseWithRetentionPolicy creates a database with the specified retention policy.
func (c *Client) CreateDatabaseWithRetentionPolicy(name string, rpi *RetentionPolicyInfo) (*DatabaseInfo, error) {
func (c *Client) CreateDatabaseWithRetentionPolicy(name string, spec *RetentionPolicySpec) (*DatabaseInfo, error) {
c.mu.Lock()
defer c.mu.Unlock()
data := c.cacheData.Clone()
if rpi.Duration < MinRetentionPolicyDuration && rpi.Duration != 0 {
if spec.Duration != nil && *spec.Duration < MinRetentionPolicyDuration && *spec.Duration != 0 {
return nil, ErrRetentionPolicyDurationTooLow
}
if db := data.Database(name); db != nil {
// Check if the retention policy already exists. If it does and matches
// the desired retention policy, exit with no error.
if rp := db.RetentionPolicy(rpi.Name); rp != nil {
// Normalise ShardDuration before comparing to any existing retention policies.
rpi.ShardGroupDuration = normalisedShardDuration(rpi.ShardGroupDuration, rpi.Duration)
if rp.ReplicaN != rpi.ReplicaN || rp.Duration != rpi.Duration || rp.ShardGroupDuration != rpi.ShardGroupDuration {
return nil, ErrRetentionPolicyConflict
}
return db, nil
}
}
if err := data.CreateDatabase(name); err != nil {
return nil, err
}
if err := data.CreateRetentionPolicy(name, rpi); err != nil {
return nil, err
}
if err := data.SetDefaultRetentionPolicy(name, rpi.Name); err != nil {
return nil, err
}
db := data.Database(name)
if db == nil {
if err := data.CreateDatabase(name); err != nil {
return nil, err
}
db = data.Database(name)
}
rpi := spec.NewRetentionPolicyInfo()
if rp := db.RetentionPolicy(rpi.Name); rp == nil {
if err := data.CreateRetentionPolicy(name, rpi); err != nil {
return nil, err
}
} else if !spec.Matches(rp) {
// Verify that the retention policy with this name matches
// the one already created.
return nil, ErrRetentionPolicyConflict
}
// If no default retention policy has been set, set it to the retention
// policy we just created. If the default is different from what we are
// trying to create, record it as a conflict and abandon with an error.
if db.DefaultRetentionPolicy == "" {
if err := data.SetDefaultRetentionPolicy(name, rpi.Name); err != nil {
return nil, err
}
} else if rpi.Name != db.DefaultRetentionPolicy {
return nil, ErrRetentionPolicyConflict
}
// Refresh the database info.
db = data.Database(name)
if err := c.commit(data); err != nil {
return nil, err
@ -270,22 +275,18 @@ func (c *Client) DropDatabase(name string) error {
}
// CreateRetentionPolicy creates a retention policy on the specified database.
func (c *Client) CreateRetentionPolicy(database string, rpi *RetentionPolicyInfo) (*RetentionPolicyInfo, error) {
func (c *Client) CreateRetentionPolicy(database string, spec *RetentionPolicySpec) (*RetentionPolicyInfo, error) {
c.mu.Lock()
defer c.mu.Unlock()
data := c.cacheData.Clone()
if rpi.Duration < MinRetentionPolicyDuration && rpi.Duration != 0 {
if spec.Duration != nil && *spec.Duration < MinRetentionPolicyDuration && *spec.Duration != 0 {
return nil, ErrRetentionPolicyDurationTooLow
}
if err := data.CreateRetentionPolicy(database, rpi); err != nil {
return nil, err
}
rp, err := data.RetentionPolicy(database, rpi.Name)
if err != nil {
rp := spec.NewRetentionPolicyInfo()
if err := data.CreateRetentionPolicy(database, rp); err != nil {
return nil, err
}

View File

@ -78,13 +78,15 @@ func TestMetaClient_CreateDatabaseWithRetentionPolicy(t *testing.T) {
defer os.RemoveAll(d)
defer c.Close()
rpi := meta.RetentionPolicyInfo{
duration := 1 * time.Hour
replicaN := 1
spec := meta.RetentionPolicySpec{
Name: "rp0",
Duration: 1 * time.Hour,
ReplicaN: 1,
Duration: &duration,
ReplicaN: &replicaN,
ShardGroupDuration: 2 * time.Hour,
}
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi); err != nil {
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &spec); err != nil {
t.Fatal(err)
}
@ -108,30 +110,43 @@ func TestMetaClient_CreateDatabaseWithRetentionPolicy(t *testing.T) {
// Recreating the exact same database with retention policy is not
// an error.
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi); err != nil {
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &spec); err != nil {
t.Fatal(err)
}
// If the rp's duration is different, an error should be returned.
rpi2 := rpi
rpi2.Duration = rpi.Duration + time.Minute
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi2); err != meta.ErrRetentionPolicyConflict {
spec2 := spec
duration2 := *spec.Duration + time.Minute
spec2.Duration = &duration2
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &spec2); err != meta.ErrRetentionPolicyConflict {
t.Fatalf("got %v, but expected %v", err, meta.ErrRetentionPolicyConflict)
}
// If the rp's replica is different, an error should be returned.
rpi2 = rpi
rpi2.ReplicaN = rpi.ReplicaN + 1
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi2); err != meta.ErrRetentionPolicyConflict {
spec2 = spec
replica2 := *spec.ReplicaN + 1
spec2.ReplicaN = &replica2
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &spec2); err != meta.ErrRetentionPolicyConflict {
t.Fatalf("got %v, but expected %v", err, meta.ErrRetentionPolicyConflict)
}
// If the rp's shard group duration is different, an error should be returned.
rpi2 = rpi
rpi2.ShardGroupDuration = rpi.ShardGroupDuration + time.Minute
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi2); err != meta.ErrRetentionPolicyConflict {
spec2 = spec
spec2.ShardGroupDuration = spec.ShardGroupDuration + time.Minute
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &spec2); err != meta.ErrRetentionPolicyConflict {
t.Fatalf("got %v, but expected %v", err, meta.ErrRetentionPolicyConflict)
}
// If create database is used by itself, no error should be returned and
// the default retention policy should not be changed.
if dbi, err := c.CreateDatabase("db0"); err != nil {
t.Fatalf("got %v, but expected %v", err, nil)
} else if dbi.DefaultRetentionPolicy != "rp0" {
t.Fatalf("got %v, but expected %v", dbi.DefaultRetentionPolicy, "rp0")
} else if got, exp := len(dbi.RetentionPolicies), 1; got != exp {
// Ensure no additional retention policies were created.
t.Fatalf("got %v, but expected %v", got, exp)
}
}
func TestMetaClient_Databases(t *testing.T) {
@ -228,7 +243,12 @@ func TestMetaClient_CreateRetentionPolicy(t *testing.T) {
ShardGroupDuration: time.Hour,
}
if _, err := c.CreateRetentionPolicy("db0", &rp0); err != nil {
if _, err := c.CreateRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: rp0.Name,
ReplicaN: &rp0.ReplicaN,
Duration: &rp0.Duration,
ShardGroupDuration: rp0.ShardGroupDuration,
}); err != nil {
t.Fatal(err)
}
@ -240,7 +260,12 @@ func TestMetaClient_CreateRetentionPolicy(t *testing.T) {
}
// Create the same policy. Should not error.
if _, err := c.CreateRetentionPolicy("db0", &rp0); err != nil {
if _, err := c.CreateRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: rp0.Name,
ReplicaN: &rp0.ReplicaN,
Duration: &rp0.Duration,
ShardGroupDuration: rp0.ShardGroupDuration,
}); err != nil {
t.Fatal(err)
} else if actual, err = c.RetentionPolicy("db0", "rp0"); err != nil {
t.Fatal(err)
@ -253,7 +278,12 @@ func TestMetaClient_CreateRetentionPolicy(t *testing.T) {
rp1 := rp0
rp1.Duration = 2 * rp0.Duration
_, got := c.CreateRetentionPolicy("db0", &rp1)
_, got := c.CreateRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: rp1.Name,
ReplicaN: &rp1.ReplicaN,
Duration: &rp1.Duration,
ShardGroupDuration: rp1.ShardGroupDuration,
})
if exp := meta.ErrRetentionPolicyExists; got != exp {
t.Fatalf("got error %v, expected error %v", got, exp)
}
@ -263,7 +293,12 @@ func TestMetaClient_CreateRetentionPolicy(t *testing.T) {
rp1 = rp0
rp1.ReplicaN = rp0.ReplicaN + 1
_, got = c.CreateRetentionPolicy("db0", &rp1)
_, got = c.CreateRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: rp1.Name,
ReplicaN: &rp1.ReplicaN,
Duration: &rp1.Duration,
ShardGroupDuration: rp1.ShardGroupDuration,
})
if exp := meta.ErrRetentionPolicyExists; got != exp {
t.Fatalf("got error %v, expected error %v", got, exp)
}
@ -273,7 +308,12 @@ func TestMetaClient_CreateRetentionPolicy(t *testing.T) {
rp1 = rp0
rp1.ShardGroupDuration = 2 * rp0.ShardGroupDuration
_, got = c.CreateRetentionPolicy("db0", &rp1)
_, got = c.CreateRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: rp1.Name,
ReplicaN: &rp1.ReplicaN,
Duration: &rp1.Duration,
ShardGroupDuration: rp1.ShardGroupDuration,
})
if exp := meta.ErrRetentionPolicyExists; got != exp {
t.Fatalf("got error %v, expected error %v", got, exp)
}
@ -286,10 +326,12 @@ func TestMetaClient_SetDefaultRetentionPolicy(t *testing.T) {
defer os.RemoveAll(d)
defer c.Close()
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &meta.RetentionPolicyInfo{
duration := 1 * time.Hour
replicaN := 1
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: "rp0",
Duration: 1 * time.Hour,
ReplicaN: 1,
Duration: &duration,
ReplicaN: &replicaN,
}); err != nil {
t.Fatal(err)
}
@ -336,10 +378,12 @@ func TestMetaClient_DropRetentionPolicy(t *testing.T) {
t.Fatalf("db name wrong: %s", db.Name)
}
if _, err := c.CreateRetentionPolicy("db0", &meta.RetentionPolicyInfo{
duration := 1 * time.Hour
replicaN := 1
if _, err := c.CreateRetentionPolicy("db0", &meta.RetentionPolicySpec{
Name: "rp0",
Duration: 1 * time.Hour,
ReplicaN: 1,
Duration: &duration,
ReplicaN: &replicaN,
}); err != nil {
t.Fatal(err)
}

View File

@ -22,7 +22,7 @@ const (
DefaultRetentionPolicyReplicaN = 1
// DefaultRetentionPolicyDuration is the default value of RetentionPolicyInfo.Duration.
DefaultRetentionPolicyDuration = 7 * (24 * time.Hour)
DefaultRetentionPolicyDuration = time.Duration(0)
// DefaultRetentionPolicyName is the default name for auto generated retention policies.
DefaultRetentionPolicyName = "autogen"
@ -137,12 +137,17 @@ func (data *Data) RetentionPolicy(database, name string) (*RetentionPolicyInfo,
// Returns an error if name is blank or if a database does not exist.
func (data *Data) CreateRetentionPolicy(database string, rpi *RetentionPolicyInfo) error {
// Validate retention policy.
if rpi.ReplicaN < 1 {
if rpi == nil {
return ErrRetentionPolicyRequired
} else if rpi.Name == "" {
return ErrRetentionPolicyNameRequired
} else if rpi.ReplicaN < 1 {
return ErrReplicationFactorTooLow
}
// Normalise ShardDuration before comparing to any existing
// retention policies
// retention policies. The client is supposed to do this, but
// do it again to verify input.
rpi.ShardGroupDuration = normalisedShardDuration(rpi.ShardGroupDuration, rpi.Duration)
// Find database.
@ -150,27 +155,15 @@ func (data *Data) CreateRetentionPolicy(database string, rpi *RetentionPolicyInf
if di == nil {
return influxdb.ErrDatabaseNotFound(database)
} else if rp := di.RetentionPolicy(rpi.Name); rp != nil {
// RP with that name already exists. Make sure they're the same.
// RP with that name already exists. Make sure they're the same.
if rp.ReplicaN != rpi.ReplicaN || rp.Duration != rpi.Duration || rp.ShardGroupDuration != rpi.ShardGroupDuration {
return ErrRetentionPolicyExists
}
return nil
}
// Determine the retention policy name if it is blank.
rpName := rpi.Name
if rpName == "" {
rpName = DefaultRetentionPolicyName
}
// Append copy of new policy.
rp := RetentionPolicyInfo{
Name: rpName,
Duration: rpi.Duration,
ReplicaN: rpi.ReplicaN,
ShardGroupDuration: rpi.ShardGroupDuration,
}
di.RetentionPolicies = append(di.RetentionPolicies, rp)
di.RetentionPolicies = append(di.RetentionPolicies, *rpi)
return nil
}
@ -844,6 +837,93 @@ func (di *DatabaseInfo) unmarshal(pb *internal.DatabaseInfo) {
}
}
// RetentionPolicySpec represents the specification for a new retention policy.
type RetentionPolicySpec struct {
Name string
ReplicaN *int
Duration *time.Duration
ShardGroupDuration time.Duration
}
// NewRetentionPolicyInfo creates a new retention policy info from the specification.
func (s *RetentionPolicySpec) NewRetentionPolicyInfo() *RetentionPolicyInfo {
return DefaultRetentionPolicyInfo().Apply(s)
}
// Matches checks if this retention policy specification matches
// an existing retention policy.
func (s *RetentionPolicySpec) Matches(rpi *RetentionPolicyInfo) bool {
if rpi == nil {
return false
} else if s.Name != "" && s.Name != rpi.Name {
return false
} else if s.Duration != nil && *s.Duration != rpi.Duration {
return false
} else if s.ReplicaN != nil && *s.ReplicaN != rpi.ReplicaN {
return false
}
// Normalise ShardDuration before comparing to any existing retention policies.
// Normalize with the retention policy info's duration instead of the spec
// since they should be the same and we're performing a comparison.
sgDuration := normalisedShardDuration(s.ShardGroupDuration, rpi.Duration)
if sgDuration != rpi.ShardGroupDuration {
return false
}
return true
}
// marshal serializes to a protobuf representation.
func (s *RetentionPolicySpec) marshal() *internal.RetentionPolicySpec {
pb := &internal.RetentionPolicySpec{}
if s.Name != "" {
pb.Name = proto.String(s.Name)
}
if s.Duration != nil {
pb.Duration = proto.Int64(int64(*s.Duration))
}
if s.ShardGroupDuration > 0 {
pb.ShardGroupDuration = proto.Int64(int64(s.ShardGroupDuration))
}
if s.ReplicaN != nil {
pb.ReplicaN = proto.Uint32(uint32(*s.ReplicaN))
}
return pb
}
// unmarshal deserializes from a protobuf representation.
func (s *RetentionPolicySpec) unmarshal(pb *internal.RetentionPolicySpec) {
if pb.Name != nil {
s.Name = pb.GetName()
}
if pb.Duration != nil {
duration := time.Duration(pb.GetDuration())
s.Duration = &duration
}
if pb.ShardGroupDuration != nil {
s.ShardGroupDuration = time.Duration(pb.GetShardGroupDuration())
}
if pb.ReplicaN != nil {
replicaN := int(pb.GetReplicaN())
s.ReplicaN = &replicaN
}
}
// MarshalBinary encodes RetentionPolicySpec to a binary format.
func (s *RetentionPolicySpec) MarshalBinary() ([]byte, error) {
return proto.Marshal(s.marshal())
}
// UnmarshalBinary decodes RetentionPolicySpec from a binary format.
func (s *RetentionPolicySpec) UnmarshalBinary(data []byte) error {
var pb internal.RetentionPolicySpec
if err := proto.Unmarshal(data, &pb); err != nil {
return err
}
s.unmarshal(&pb)
return nil
}
// RetentionPolicyInfo represents metadata about a retention policy.
type RetentionPolicyInfo struct {
Name string
@ -863,6 +943,32 @@ func NewRetentionPolicyInfo(name string) *RetentionPolicyInfo {
}
}
// DefaultRetentionPolicyInfo returns a new instance of RetentionPolicyInfo with defaults set.
func DefaultRetentionPolicyInfo() *RetentionPolicyInfo {
return NewRetentionPolicyInfo(DefaultRetentionPolicyName)
}
// Apply applies a specification to the retention policy info.
func (rpi *RetentionPolicyInfo) Apply(spec *RetentionPolicySpec) *RetentionPolicyInfo {
rp := &RetentionPolicyInfo{
Name: rpi.Name,
ReplicaN: rpi.ReplicaN,
Duration: rpi.Duration,
ShardGroupDuration: rpi.ShardGroupDuration,
}
if spec.Name != "" {
rp.Name = spec.Name
}
if spec.ReplicaN != nil {
rp.ReplicaN = *spec.ReplicaN
}
if spec.Duration != nil {
rp.Duration = *spec.Duration
}
rp.ShardGroupDuration = normalisedShardDuration(spec.ShardGroupDuration, rp.Duration)
return rp
}
// ShardGroupByTimestamp returns the shard group in the policy that contains the timestamp.
func (rpi *RetentionPolicyInfo) ShardGroupByTimestamp(timestamp time.Time) *ShardGroupInfo {
for i := range rpi.ShardGroups {

View File

@ -35,6 +35,10 @@ var (
// on a default retention policy.
ErrRetentionPolicyDefault = errors.New("retention policy is default")
// ErrRetentionPolicyRequired is returned when a retention policy is required
// by an operation, but a nil policy was passed.
ErrRetentionPolicyRequired = errors.New("retention policy required")
// ErrRetentionPolicyNameRequired is returned when creating a policy without a name.
ErrRetentionPolicyNameRequired = errors.New("retention policy name required")

View File

@ -12,6 +12,7 @@ It has these top-level messages:
Data
NodeInfo
DatabaseInfo
RetentionPolicySpec
RetentionPolicyInfo
ShardGroupInfo
ShardInfo
@ -182,7 +183,7 @@ func (x *Command_Type) UnmarshalJSON(data []byte) error {
*x = Command_Type(value)
return nil
}
func (Command_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMeta, []int{11, 0} }
func (Command_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMeta, []int{12, 0} }
type Data struct {
Term *uint64 `protobuf:"varint,1,req,name=Term" json:"Term,omitempty"`
@ -356,6 +357,47 @@ func (m *DatabaseInfo) GetContinuousQueries() []*ContinuousQueryInfo {
return nil
}
type RetentionPolicySpec struct {
Name *string `protobuf:"bytes,1,opt,name=Name" json:"Name,omitempty"`
Duration *int64 `protobuf:"varint,2,opt,name=Duration" json:"Duration,omitempty"`
ShardGroupDuration *int64 `protobuf:"varint,3,opt,name=ShardGroupDuration" json:"ShardGroupDuration,omitempty"`
ReplicaN *uint32 `protobuf:"varint,4,opt,name=ReplicaN" json:"ReplicaN,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *RetentionPolicySpec) Reset() { *m = RetentionPolicySpec{} }
func (m *RetentionPolicySpec) String() string { return proto.CompactTextString(m) }
func (*RetentionPolicySpec) ProtoMessage() {}
func (*RetentionPolicySpec) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{3} }
func (m *RetentionPolicySpec) GetName() string {
if m != nil && m.Name != nil {
return *m.Name
}
return ""
}
func (m *RetentionPolicySpec) GetDuration() int64 {
if m != nil && m.Duration != nil {
return *m.Duration
}
return 0
}
func (m *RetentionPolicySpec) GetShardGroupDuration() int64 {
if m != nil && m.ShardGroupDuration != nil {
return *m.ShardGroupDuration
}
return 0
}
func (m *RetentionPolicySpec) GetReplicaN() uint32 {
if m != nil && m.ReplicaN != nil {
return *m.ReplicaN
}
return 0
}
type RetentionPolicyInfo struct {
Name *string `protobuf:"bytes,1,req,name=Name" json:"Name,omitempty"`
Duration *int64 `protobuf:"varint,2,req,name=Duration" json:"Duration,omitempty"`
@ -369,7 +411,7 @@ type RetentionPolicyInfo struct {
func (m *RetentionPolicyInfo) Reset() { *m = RetentionPolicyInfo{} }
func (m *RetentionPolicyInfo) String() string { return proto.CompactTextString(m) }
func (*RetentionPolicyInfo) ProtoMessage() {}
func (*RetentionPolicyInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{3} }
func (*RetentionPolicyInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{4} }
func (m *RetentionPolicyInfo) GetName() string {
if m != nil && m.Name != nil {
@ -426,7 +468,7 @@ type ShardGroupInfo struct {
func (m *ShardGroupInfo) Reset() { *m = ShardGroupInfo{} }
func (m *ShardGroupInfo) String() string { return proto.CompactTextString(m) }
func (*ShardGroupInfo) ProtoMessage() {}
func (*ShardGroupInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{4} }
func (*ShardGroupInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{5} }
func (m *ShardGroupInfo) GetID() uint64 {
if m != nil && m.ID != nil {
@ -480,7 +522,7 @@ type ShardInfo struct {
func (m *ShardInfo) Reset() { *m = ShardInfo{} }
func (m *ShardInfo) String() string { return proto.CompactTextString(m) }
func (*ShardInfo) ProtoMessage() {}
func (*ShardInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{5} }
func (*ShardInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{6} }
func (m *ShardInfo) GetID() uint64 {
if m != nil && m.ID != nil {
@ -513,7 +555,7 @@ type SubscriptionInfo struct {
func (m *SubscriptionInfo) Reset() { *m = SubscriptionInfo{} }
func (m *SubscriptionInfo) String() string { return proto.CompactTextString(m) }
func (*SubscriptionInfo) ProtoMessage() {}
func (*SubscriptionInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{6} }
func (*SubscriptionInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{7} }
func (m *SubscriptionInfo) GetName() string {
if m != nil && m.Name != nil {
@ -544,7 +586,7 @@ type ShardOwner struct {
func (m *ShardOwner) Reset() { *m = ShardOwner{} }
func (m *ShardOwner) String() string { return proto.CompactTextString(m) }
func (*ShardOwner) ProtoMessage() {}
func (*ShardOwner) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{7} }
func (*ShardOwner) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{8} }
func (m *ShardOwner) GetNodeID() uint64 {
if m != nil && m.NodeID != nil {
@ -562,7 +604,7 @@ type ContinuousQueryInfo struct {
func (m *ContinuousQueryInfo) Reset() { *m = ContinuousQueryInfo{} }
func (m *ContinuousQueryInfo) String() string { return proto.CompactTextString(m) }
func (*ContinuousQueryInfo) ProtoMessage() {}
func (*ContinuousQueryInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{8} }
func (*ContinuousQueryInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{9} }
func (m *ContinuousQueryInfo) GetName() string {
if m != nil && m.Name != nil {
@ -589,7 +631,7 @@ type UserInfo struct {
func (m *UserInfo) Reset() { *m = UserInfo{} }
func (m *UserInfo) String() string { return proto.CompactTextString(m) }
func (*UserInfo) ProtoMessage() {}
func (*UserInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{9} }
func (*UserInfo) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{10} }
func (m *UserInfo) GetName() string {
if m != nil && m.Name != nil {
@ -628,7 +670,7 @@ type UserPrivilege struct {
func (m *UserPrivilege) Reset() { *m = UserPrivilege{} }
func (m *UserPrivilege) String() string { return proto.CompactTextString(m) }
func (*UserPrivilege) ProtoMessage() {}
func (*UserPrivilege) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{10} }
func (*UserPrivilege) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{11} }
func (m *UserPrivilege) GetDatabase() string {
if m != nil && m.Database != nil {
@ -653,7 +695,7 @@ type Command struct {
func (m *Command) Reset() { *m = Command{} }
func (m *Command) String() string { return proto.CompactTextString(m) }
func (*Command) ProtoMessage() {}
func (*Command) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{11} }
func (*Command) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{12} }
var extRange_Command = []proto.ExtensionRange{
{100, 536870911},
@ -681,7 +723,7 @@ type CreateNodeCommand struct {
func (m *CreateNodeCommand) Reset() { *m = CreateNodeCommand{} }
func (m *CreateNodeCommand) String() string { return proto.CompactTextString(m) }
func (*CreateNodeCommand) ProtoMessage() {}
func (*CreateNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{12} }
func (*CreateNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{13} }
func (m *CreateNodeCommand) GetHost() string {
if m != nil && m.Host != nil {
@ -714,7 +756,7 @@ type DeleteNodeCommand struct {
func (m *DeleteNodeCommand) Reset() { *m = DeleteNodeCommand{} }
func (m *DeleteNodeCommand) String() string { return proto.CompactTextString(m) }
func (*DeleteNodeCommand) ProtoMessage() {}
func (*DeleteNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{13} }
func (*DeleteNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{14} }
func (m *DeleteNodeCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -747,7 +789,7 @@ type CreateDatabaseCommand struct {
func (m *CreateDatabaseCommand) Reset() { *m = CreateDatabaseCommand{} }
func (m *CreateDatabaseCommand) String() string { return proto.CompactTextString(m) }
func (*CreateDatabaseCommand) ProtoMessage() {}
func (*CreateDatabaseCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{14} }
func (*CreateDatabaseCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{15} }
func (m *CreateDatabaseCommand) GetName() string {
if m != nil && m.Name != nil {
@ -779,7 +821,7 @@ type DropDatabaseCommand struct {
func (m *DropDatabaseCommand) Reset() { *m = DropDatabaseCommand{} }
func (m *DropDatabaseCommand) String() string { return proto.CompactTextString(m) }
func (*DropDatabaseCommand) ProtoMessage() {}
func (*DropDatabaseCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{15} }
func (*DropDatabaseCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{16} }
func (m *DropDatabaseCommand) GetName() string {
if m != nil && m.Name != nil {
@ -806,7 +848,7 @@ func (m *CreateRetentionPolicyCommand) Reset() { *m = CreateRetentionPol
func (m *CreateRetentionPolicyCommand) String() string { return proto.CompactTextString(m) }
func (*CreateRetentionPolicyCommand) ProtoMessage() {}
func (*CreateRetentionPolicyCommand) Descriptor() ([]byte, []int) {
return fileDescriptorMeta, []int{16}
return fileDescriptorMeta, []int{17}
}
func (m *CreateRetentionPolicyCommand) GetDatabase() string {
@ -840,7 +882,7 @@ type DropRetentionPolicyCommand struct {
func (m *DropRetentionPolicyCommand) Reset() { *m = DropRetentionPolicyCommand{} }
func (m *DropRetentionPolicyCommand) String() string { return proto.CompactTextString(m) }
func (*DropRetentionPolicyCommand) ProtoMessage() {}
func (*DropRetentionPolicyCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{17} }
func (*DropRetentionPolicyCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{18} }
func (m *DropRetentionPolicyCommand) GetDatabase() string {
if m != nil && m.Database != nil {
@ -874,7 +916,7 @@ func (m *SetDefaultRetentionPolicyCommand) Reset() { *m = SetDefaultRete
func (m *SetDefaultRetentionPolicyCommand) String() string { return proto.CompactTextString(m) }
func (*SetDefaultRetentionPolicyCommand) ProtoMessage() {}
func (*SetDefaultRetentionPolicyCommand) Descriptor() ([]byte, []int) {
return fileDescriptorMeta, []int{18}
return fileDescriptorMeta, []int{19}
}
func (m *SetDefaultRetentionPolicyCommand) GetDatabase() string {
@ -912,7 +954,7 @@ func (m *UpdateRetentionPolicyCommand) Reset() { *m = UpdateRetentionPol
func (m *UpdateRetentionPolicyCommand) String() string { return proto.CompactTextString(m) }
func (*UpdateRetentionPolicyCommand) ProtoMessage() {}
func (*UpdateRetentionPolicyCommand) Descriptor() ([]byte, []int) {
return fileDescriptorMeta, []int{19}
return fileDescriptorMeta, []int{20}
}
func (m *UpdateRetentionPolicyCommand) GetDatabase() string {
@ -968,7 +1010,7 @@ type CreateShardGroupCommand struct {
func (m *CreateShardGroupCommand) Reset() { *m = CreateShardGroupCommand{} }
func (m *CreateShardGroupCommand) String() string { return proto.CompactTextString(m) }
func (*CreateShardGroupCommand) ProtoMessage() {}
func (*CreateShardGroupCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{20} }
func (*CreateShardGroupCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{21} }
func (m *CreateShardGroupCommand) GetDatabase() string {
if m != nil && m.Database != nil {
@ -1009,7 +1051,7 @@ type DeleteShardGroupCommand struct {
func (m *DeleteShardGroupCommand) Reset() { *m = DeleteShardGroupCommand{} }
func (m *DeleteShardGroupCommand) String() string { return proto.CompactTextString(m) }
func (*DeleteShardGroupCommand) ProtoMessage() {}
func (*DeleteShardGroupCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{21} }
func (*DeleteShardGroupCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{22} }
func (m *DeleteShardGroupCommand) GetDatabase() string {
if m != nil && m.Database != nil {
@ -1051,7 +1093,7 @@ func (m *CreateContinuousQueryCommand) Reset() { *m = CreateContinuousQu
func (m *CreateContinuousQueryCommand) String() string { return proto.CompactTextString(m) }
func (*CreateContinuousQueryCommand) ProtoMessage() {}
func (*CreateContinuousQueryCommand) Descriptor() ([]byte, []int) {
return fileDescriptorMeta, []int{22}
return fileDescriptorMeta, []int{23}
}
func (m *CreateContinuousQueryCommand) GetDatabase() string {
@ -1092,7 +1134,7 @@ type DropContinuousQueryCommand struct {
func (m *DropContinuousQueryCommand) Reset() { *m = DropContinuousQueryCommand{} }
func (m *DropContinuousQueryCommand) String() string { return proto.CompactTextString(m) }
func (*DropContinuousQueryCommand) ProtoMessage() {}
func (*DropContinuousQueryCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{23} }
func (*DropContinuousQueryCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{24} }
func (m *DropContinuousQueryCommand) GetDatabase() string {
if m != nil && m.Database != nil {
@ -1126,7 +1168,7 @@ type CreateUserCommand struct {
func (m *CreateUserCommand) Reset() { *m = CreateUserCommand{} }
func (m *CreateUserCommand) String() string { return proto.CompactTextString(m) }
func (*CreateUserCommand) ProtoMessage() {}
func (*CreateUserCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{24} }
func (*CreateUserCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{25} }
func (m *CreateUserCommand) GetName() string {
if m != nil && m.Name != nil {
@ -1165,7 +1207,7 @@ type DropUserCommand struct {
func (m *DropUserCommand) Reset() { *m = DropUserCommand{} }
func (m *DropUserCommand) String() string { return proto.CompactTextString(m) }
func (*DropUserCommand) ProtoMessage() {}
func (*DropUserCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{25} }
func (*DropUserCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{26} }
func (m *DropUserCommand) GetName() string {
if m != nil && m.Name != nil {
@ -1191,7 +1233,7 @@ type UpdateUserCommand struct {
func (m *UpdateUserCommand) Reset() { *m = UpdateUserCommand{} }
func (m *UpdateUserCommand) String() string { return proto.CompactTextString(m) }
func (*UpdateUserCommand) ProtoMessage() {}
func (*UpdateUserCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{26} }
func (*UpdateUserCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{27} }
func (m *UpdateUserCommand) GetName() string {
if m != nil && m.Name != nil {
@ -1225,7 +1267,7 @@ type SetPrivilegeCommand struct {
func (m *SetPrivilegeCommand) Reset() { *m = SetPrivilegeCommand{} }
func (m *SetPrivilegeCommand) String() string { return proto.CompactTextString(m) }
func (*SetPrivilegeCommand) ProtoMessage() {}
func (*SetPrivilegeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{27} }
func (*SetPrivilegeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{28} }
func (m *SetPrivilegeCommand) GetUsername() string {
if m != nil && m.Username != nil {
@ -1264,7 +1306,7 @@ type SetDataCommand struct {
func (m *SetDataCommand) Reset() { *m = SetDataCommand{} }
func (m *SetDataCommand) String() string { return proto.CompactTextString(m) }
func (*SetDataCommand) ProtoMessage() {}
func (*SetDataCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{28} }
func (*SetDataCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{29} }
func (m *SetDataCommand) GetData() *Data {
if m != nil {
@ -1290,7 +1332,7 @@ type SetAdminPrivilegeCommand struct {
func (m *SetAdminPrivilegeCommand) Reset() { *m = SetAdminPrivilegeCommand{} }
func (m *SetAdminPrivilegeCommand) String() string { return proto.CompactTextString(m) }
func (*SetAdminPrivilegeCommand) ProtoMessage() {}
func (*SetAdminPrivilegeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{29} }
func (*SetAdminPrivilegeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{30} }
func (m *SetAdminPrivilegeCommand) GetUsername() string {
if m != nil && m.Username != nil {
@ -1323,7 +1365,7 @@ type UpdateNodeCommand struct {
func (m *UpdateNodeCommand) Reset() { *m = UpdateNodeCommand{} }
func (m *UpdateNodeCommand) String() string { return proto.CompactTextString(m) }
func (*UpdateNodeCommand) ProtoMessage() {}
func (*UpdateNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{30} }
func (*UpdateNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{31} }
func (m *UpdateNodeCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -1359,7 +1401,7 @@ type CreateSubscriptionCommand struct {
func (m *CreateSubscriptionCommand) Reset() { *m = CreateSubscriptionCommand{} }
func (m *CreateSubscriptionCommand) String() string { return proto.CompactTextString(m) }
func (*CreateSubscriptionCommand) ProtoMessage() {}
func (*CreateSubscriptionCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{31} }
func (*CreateSubscriptionCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{32} }
func (m *CreateSubscriptionCommand) GetName() string {
if m != nil && m.Name != nil {
@ -1414,7 +1456,7 @@ type DropSubscriptionCommand struct {
func (m *DropSubscriptionCommand) Reset() { *m = DropSubscriptionCommand{} }
func (m *DropSubscriptionCommand) String() string { return proto.CompactTextString(m) }
func (*DropSubscriptionCommand) ProtoMessage() {}
func (*DropSubscriptionCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{32} }
func (*DropSubscriptionCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{33} }
func (m *DropSubscriptionCommand) GetName() string {
if m != nil && m.Name != nil {
@ -1454,7 +1496,7 @@ type RemovePeerCommand struct {
func (m *RemovePeerCommand) Reset() { *m = RemovePeerCommand{} }
func (m *RemovePeerCommand) String() string { return proto.CompactTextString(m) }
func (*RemovePeerCommand) ProtoMessage() {}
func (*RemovePeerCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{33} }
func (*RemovePeerCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{34} }
func (m *RemovePeerCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -1488,7 +1530,7 @@ type CreateMetaNodeCommand struct {
func (m *CreateMetaNodeCommand) Reset() { *m = CreateMetaNodeCommand{} }
func (m *CreateMetaNodeCommand) String() string { return proto.CompactTextString(m) }
func (*CreateMetaNodeCommand) ProtoMessage() {}
func (*CreateMetaNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{34} }
func (*CreateMetaNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{35} }
func (m *CreateMetaNodeCommand) GetHTTPAddr() string {
if m != nil && m.HTTPAddr != nil {
@ -1528,7 +1570,7 @@ type CreateDataNodeCommand struct {
func (m *CreateDataNodeCommand) Reset() { *m = CreateDataNodeCommand{} }
func (m *CreateDataNodeCommand) String() string { return proto.CompactTextString(m) }
func (*CreateDataNodeCommand) ProtoMessage() {}
func (*CreateDataNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{35} }
func (*CreateDataNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{36} }
func (m *CreateDataNodeCommand) GetHTTPAddr() string {
if m != nil && m.HTTPAddr != nil {
@ -1562,7 +1604,7 @@ type UpdateDataNodeCommand struct {
func (m *UpdateDataNodeCommand) Reset() { *m = UpdateDataNodeCommand{} }
func (m *UpdateDataNodeCommand) String() string { return proto.CompactTextString(m) }
func (*UpdateDataNodeCommand) ProtoMessage() {}
func (*UpdateDataNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{36} }
func (*UpdateDataNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{37} }
func (m *UpdateDataNodeCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -1601,7 +1643,7 @@ type DeleteMetaNodeCommand struct {
func (m *DeleteMetaNodeCommand) Reset() { *m = DeleteMetaNodeCommand{} }
func (m *DeleteMetaNodeCommand) String() string { return proto.CompactTextString(m) }
func (*DeleteMetaNodeCommand) ProtoMessage() {}
func (*DeleteMetaNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{37} }
func (*DeleteMetaNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{38} }
func (m *DeleteMetaNodeCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -1626,7 +1668,7 @@ type DeleteDataNodeCommand struct {
func (m *DeleteDataNodeCommand) Reset() { *m = DeleteDataNodeCommand{} }
func (m *DeleteDataNodeCommand) String() string { return proto.CompactTextString(m) }
func (*DeleteDataNodeCommand) ProtoMessage() {}
func (*DeleteDataNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{38} }
func (*DeleteDataNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{39} }
func (m *DeleteDataNodeCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -1653,7 +1695,7 @@ type Response struct {
func (m *Response) Reset() { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage() {}
func (*Response) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{39} }
func (*Response) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{40} }
func (m *Response) GetOK() bool {
if m != nil && m.OK != nil {
@ -1688,7 +1730,7 @@ type SetMetaNodeCommand struct {
func (m *SetMetaNodeCommand) Reset() { *m = SetMetaNodeCommand{} }
func (m *SetMetaNodeCommand) String() string { return proto.CompactTextString(m) }
func (*SetMetaNodeCommand) ProtoMessage() {}
func (*SetMetaNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{40} }
func (*SetMetaNodeCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{41} }
func (m *SetMetaNodeCommand) GetHTTPAddr() string {
if m != nil && m.HTTPAddr != nil {
@ -1727,7 +1769,7 @@ type DropShardCommand struct {
func (m *DropShardCommand) Reset() { *m = DropShardCommand{} }
func (m *DropShardCommand) String() string { return proto.CompactTextString(m) }
func (*DropShardCommand) ProtoMessage() {}
func (*DropShardCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{41} }
func (*DropShardCommand) Descriptor() ([]byte, []int) { return fileDescriptorMeta, []int{42} }
func (m *DropShardCommand) GetID() uint64 {
if m != nil && m.ID != nil {
@ -1748,6 +1790,7 @@ func init() {
proto.RegisterType((*Data)(nil), "meta.Data")
proto.RegisterType((*NodeInfo)(nil), "meta.NodeInfo")
proto.RegisterType((*DatabaseInfo)(nil), "meta.DatabaseInfo")
proto.RegisterType((*RetentionPolicySpec)(nil), "meta.RetentionPolicySpec")
proto.RegisterType((*RetentionPolicyInfo)(nil), "meta.RetentionPolicyInfo")
proto.RegisterType((*ShardGroupInfo)(nil), "meta.ShardGroupInfo")
proto.RegisterType((*ShardInfo)(nil), "meta.ShardInfo")
@ -1822,104 +1865,106 @@ func init() {
func init() { proto.RegisterFile("internal/meta.proto", fileDescriptorMeta) }
var fileDescriptorMeta = []byte{
// 1582 bytes of a gzipped FileDescriptorProto
// 1603 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x6f, 0x1b, 0x45,
0x10, 0xd7, 0xf9, 0x2b, 0xf6, 0xba, 0x4e, 0xdc, 0x73, 0x3e, 0x9c, 0x36, 0x6d, 0xc3, 0x8a, 0x8f,
0x80, 0x44, 0x91, 0xac, 0x54, 0x08, 0xf1, 0xd9, 0xc6, 0x2d, 0xad, 0x50, 0xd3, 0x90, 0xb8, 0xf0,
0x86, 0xb8, 0xc6, 0x9b, 0xc6, 0x60, 0xdf, 0x99, 0xbb, 0x73, 0xd3, 0x52, 0x68, 0x0b, 0x12, 0x42,
0x20, 0x21, 0xc1, 0x0b, 0x2f, 0x3c, 0xf1, 0xc6, 0x7f, 0x80, 0x78, 0xe0, 0xaf, 0xe0, 0x1f, 0x62,
0x76, 0xf6, 0xf6, 0x6e, 0xef, 0x6e, 0xf7, 0xdc, 0x36, 0x4f, 0xf1, 0xcc, 0xec, 0xfc, 0x7e, 0x3b,
0xb3, 0x33, 0x3b, 0x7b, 0xa4, 0x33, 0x72, 0x43, 0xe6, 0xbb, 0xce, 0xf8, 0x8d, 0x09, 0x0b, 0x9d,
0x8b, 0x53, 0xdf, 0x0b, 0x3d, 0xbb, 0xc2, 0xff, 0xa7, 0x7f, 0x96, 0x48, 0xa5, 0xef, 0x84, 0x8e,
0x7d, 0x8a, 0x54, 0x06, 0xcc, 0x9f, 0x74, 0xad, 0xcd, 0xd2, 0x56, 0xc5, 0x6e, 0x91, 0xea, 0x0d,
0x77, 0xc8, 0xee, 0x77, 0x4b, 0xf8, 0xf3, 0x34, 0x69, 0xec, 0x8c, 0x67, 0x01, 0x38, 0xb9, 0xd1,
0xef, 0x96, 0x51, 0x74, 0x8e, 0x54, 0x77, 0xbd, 0x21, 0x0b, 0xba, 0x95, 0xcd, 0xf2, 0x56, 0xb3,
0xb7, 0x78, 0x11, 0x5d, 0x73, 0xd1, 0x0d, 0xf7, 0xc8, 0xb3, 0x5f, 0x22, 0x0d, 0xee, 0xf6, 0x8e,
0x13, 0x80, 0x49, 0x15, 0x4d, 0x6c, 0x61, 0x22, 0xc5, 0x68, 0x06, 0x5e, 0x6e, 0x07, 0xcc, 0x0f,
0xba, 0x35, 0xd5, 0x0b, 0x17, 0xa1, 0x1a, 0x70, 0x6f, 0x3a, 0xf7, 0xd1, 0x69, 0xbf, 0xbb, 0x80,
0xb8, 0x6b, 0x64, 0x09, 0x44, 0x07, 0xc7, 0x8e, 0x3f, 0xfc, 0xd0, 0xf7, 0x66, 0x53, 0x50, 0xd4,
0x51, 0x61, 0x13, 0x22, 0x15, 0x20, 0x6b, 0xa0, 0xec, 0x05, 0xc1, 0x42, 0x10, 0x25, 0x5a, 0xa2,
0x60, 0x72, 0x93, 0x49, 0x93, 0xa6, 0xce, 0x84, 0x5e, 0x22, 0xf5, 0xd8, 0x9c, 0x90, 0x12, 0x78,
0x17, 0x41, 0x82, 0x90, 0x5d, 0xf7, 0x82, 0x10, 0x63, 0xd4, 0xb0, 0x97, 0xc8, 0xc2, 0x60, 0x67,
0x0f, 0x05, 0xe5, 0x4d, 0x6b, 0xab, 0x41, 0xff, 0xb2, 0xc8, 0xa9, 0xd4, 0x66, 0xc1, 0x7e, 0xd7,
0x99, 0x30, 0x5c, 0xdd, 0xb0, 0xcf, 0x93, 0xd5, 0x3e, 0x3b, 0x72, 0x66, 0xe3, 0x70, 0x9f, 0x85,
0xcc, 0x0d, 0x47, 0x9e, 0xbb, 0xe7, 0x8d, 0x47, 0x87, 0x0f, 0x22, 0x7f, 0xdb, 0xe4, 0x74, 0x5a,
0x31, 0x02, 0x82, 0x65, 0x24, 0xb8, 0x2e, 0x08, 0x66, 0xd6, 0x21, 0x06, 0xac, 0xda, 0xf1, 0x40,
0xe8, 0xce, 0xbc, 0x59, 0xf0, 0xf1, 0x8c, 0xf9, 0xa3, 0x38, 0x45, 0xd1, 0xaa, 0xb4, 0x1a, 0x57,
0xd1, 0x7f, 0x2d, 0xd2, 0xd1, 0x79, 0x4b, 0x33, 0x6e, 0x93, 0x7a, 0x7f, 0xe6, 0x3b, 0xdc, 0x06,
0x39, 0x96, 0xed, 0x33, 0xc4, 0x4e, 0x32, 0x11, 0xeb, 0xca, 0xa8, 0x03, 0xeb, 0x7d, 0x36, 0x05,
0x57, 0xce, 0x2e, 0x10, 0x28, 0x6d, 0xb5, 0xec, 0x57, 0x49, 0x33, 0xb1, 0x96, 0xa7, 0x62, 0x59,
0xb0, 0x52, 0x12, 0xca, 0x81, 0x5f, 0x27, 0xad, 0x83, 0xd9, 0x9d, 0xe0, 0xd0, 0x1f, 0x4d, 0xb9,
0x4b, 0x79, 0x3e, 0x56, 0x23, 0x63, 0x45, 0x85, 0xfc, 0x7f, 0xb2, 0xc8, 0x62, 0xc6, 0x83, 0x9a,
0x28, 0x38, 0x46, 0x07, 0xa1, 0xe3, 0x87, 0x83, 0x11, 0xec, 0x45, 0x30, 0x87, 0x6c, 0x5d, 0x75,
0x87, 0x28, 0x10, 0x74, 0xc1, 0xa6, 0xcf, 0xc6, 0x10, 0x83, 0xe1, 0xe5, 0x10, 0xf9, 0x96, 0xed,
0x0b, 0xa4, 0x86, 0x4e, 0x25, 0xd5, 0x25, 0x85, 0x2a, 0x62, 0x74, 0x48, 0x73, 0xe0, 0xcf, 0xdc,
0x43, 0x47, 0xac, 0xaa, 0x41, 0xda, 0xcb, 0xf4, 0x16, 0x80, 0xc5, 0x16, 0x2a, 0x8b, 0x65, 0x52,
0xbf, 0x75, 0xe2, 0xf2, 0x12, 0x0a, 0x80, 0x44, 0x79, 0xab, 0x72, 0xa5, 0xd4, 0xb5, 0xec, 0x4d,
0x52, 0x43, 0xa9, 0xcc, 0x6d, 0x5b, 0x01, 0x41, 0x05, 0xed, 0x93, 0x76, 0x76, 0xc3, 0x99, 0xc4,
0xc0, 0xaf, 0x9b, 0x70, 0x40, 0xa3, 0x83, 0xb3, 0x0c, 0xc7, 0x8e, 0x05, 0x90, 0x63, 0x47, 0x84,
0x8e, 0xfb, 0x6d, 0xd0, 0x0d, 0x42, 0x12, 0x9f, 0xf6, 0x22, 0xa9, 0x45, 0x55, 0x85, 0xdc, 0x68,
0x8f, 0x74, 0x34, 0xe7, 0x22, 0x03, 0x03, 0x4d, 0x01, 0x55, 0x02, 0x87, 0x7e, 0x46, 0xea, 0x71,
0xa1, 0xe6, 0xf8, 0x5c, 0x77, 0x82, 0xe3, 0x88, 0x0f, 0x2c, 0xbb, 0x3c, 0x9c, 0x8c, 0xc4, 0xb9,
0xa8, 0xdb, 0xaf, 0x10, 0xb2, 0xe7, 0x8f, 0xee, 0x8d, 0xc6, 0xec, 0x6e, 0x7c, 0x34, 0x3b, 0x49,
0xdd, 0xc7, 0x3a, 0xba, 0x4d, 0x5a, 0x29, 0x01, 0x9e, 0xbf, 0xa8, 0x9e, 0x22, 0x20, 0x48, 0x5a,
0xac, 0x46, 0xb4, 0x2a, 0xfd, 0xaf, 0x46, 0x16, 0x76, 0xbc, 0xc9, 0xc4, 0x71, 0x87, 0x10, 0xdb,
0x4a, 0xf8, 0x60, 0x2a, 0x8c, 0x17, 0x65, 0xff, 0x89, 0x94, 0x17, 0x07, 0xa0, 0xa1, 0x7f, 0xd4,
0xa0, 0xed, 0xc1, 0x3f, 0xf6, 0x0a, 0xd4, 0x8d, 0xcf, 0x20, 0x91, 0x3c, 0x2c, 0x91, 0x49, 0xdb,
0xe2, 0x62, 0x71, 0x2a, 0x54, 0x71, 0xc9, 0x5e, 0x27, 0x2b, 0xc2, 0x5a, 0xf2, 0x91, 0xaa, 0x32,
0xf4, 0xa7, 0x4e, 0xdf, 0xf7, 0xa6, 0x59, 0x45, 0x05, 0xc8, 0x6c, 0x88, 0x35, 0x99, 0x42, 0x93,
0x16, 0x55, 0xe8, 0x08, 0x67, 0xf8, 0x52, 0x83, 0xbe, 0x66, 0xbf, 0x48, 0x36, 0x0f, 0x58, 0xa8,
0x6f, 0x1a, 0xd2, 0x6a, 0x81, 0xe3, 0xdc, 0x9e, 0x0e, 0xcd, 0x38, 0x75, 0xfb, 0x2c, 0x59, 0x13,
0x4c, 0x92, 0x92, 0x91, 0xca, 0x06, 0x57, 0x8a, 0x1d, 0xe7, 0x95, 0x24, 0xd9, 0x43, 0xe6, 0xb0,
0x48, 0x8b, 0xa6, 0xdc, 0x83, 0x41, 0x7f, 0x2a, 0x89, 0x33, 0x4f, 0xad, 0x14, 0xb7, 0xa0, 0x92,
0x96, 0xf8, 0x32, 0x55, 0xb8, 0xc8, 0x6d, 0xc5, 0x4e, 0x54, 0xf1, 0x12, 0x8f, 0x30, 0x84, 0x21,
0xce, 0xbb, 0x54, 0xb4, 0xe1, 0x06, 0x58, 0xe4, 0xf1, 0x81, 0xc8, 0x4b, 0xd9, 0x69, 0x7b, 0x83,
0x74, 0x41, 0x86, 0xe7, 0x2f, 0xb7, 0xc2, 0x4e, 0x10, 0xd4, 0xf4, 0x76, 0xe0, 0x56, 0x5a, 0x8f,
0x02, 0xa4, 0xd4, 0x9d, 0x54, 0xaf, 0x60, 0x88, 0x80, 0xac, 0x4e, 0xb9, 0xca, 0x5d, 0xee, 0xb3,
0x89, 0x77, 0x8f, 0xed, 0xb1, 0x84, 0xf4, 0x5a, 0x72, 0x62, 0xe4, 0x65, 0x23, 0x55, 0xdd, 0xf4,
0x61, 0x52, 0x55, 0xeb, 0x5c, 0x25, 0xf8, 0x65, 0x55, 0x67, 0xb8, 0x4a, 0xe4, 0x29, 0xeb, 0xf0,
0x6c, 0xa2, 0xca, 0xae, 0xda, 0xb0, 0x57, 0xa1, 0x61, 0xb3, 0x30, 0xbb, 0xe4, 0x1c, 0xf4, 0x8c,
0x36, 0x6e, 0x89, 0xe7, 0x5c, 0x4a, 0xcf, 0xbf, 0x56, 0xaf, 0x0f, 0xdb, 0x4f, 0xe0, 0xaf, 0x44,
0x8f, 0x35, 0xe5, 0x11, 0xdf, 0x7f, 0x71, 0xd1, 0xef, 0x83, 0x54, 0x4c, 0x0c, 0xbd, 0x37, 0xc9,
0xc2, 0x61, 0x64, 0xd6, 0x4a, 0xd5, 0x5d, 0x97, 0x41, 0x97, 0x6c, 0xf6, 0xd6, 0x22, 0x61, 0xd6,
0x29, 0xbd, 0xab, 0xa9, 0xb8, 0x54, 0x1b, 0x85, 0x76, 0x72, 0xcd, 0xf3, 0x0f, 0x45, 0xbd, 0xd7,
0x0b, 0x80, 0x8e, 0x54, 0xa0, 0x9c, 0x4f, 0xfa, 0xbb, 0x65, 0x28, 0xe2, 0x4c, 0x33, 0xeb, 0x91,
0xa5, 0xfc, 0x05, 0x6d, 0x15, 0xde, 0xc2, 0xbd, 0xb7, 0x8d, 0xa4, 0xee, 0xe2, 0xd2, 0xb3, 0xea,
0xee, 0x33, 0xf0, 0xd0, 0x57, 0x75, 0x1d, 0x24, 0xcd, 0xaa, 0xf7, 0x96, 0x11, 0xe1, 0x58, 0x25,
0xa7, 0x71, 0xc4, 0xe7, 0x92, 0xc2, 0x4e, 0xa4, 0xe9, 0xb3, 0xda, 0x18, 0x94, 0x8a, 0x63, 0x70,
0xc5, 0xc8, 0x70, 0x84, 0x0c, 0xa9, 0x1a, 0x03, 0x3d, 0x13, 0xfa, 0xa8, 0xa8, 0x23, 0x6a, 0x78,
0xca, 0x18, 0xe1, 0xc5, 0xd3, 0xfb, 0xc0, 0xc8, 0xe0, 0x0b, 0x64, 0xb0, 0x99, 0xc4, 0xc8, 0x80,
0xff, 0xb3, 0x35, 0xbf, 0xe5, 0xce, 0xa5, 0x71, 0xcd, 0x48, 0xe3, 0x4b, 0xa4, 0xf1, 0x72, 0x74,
0xe3, 0xcf, 0xc1, 0xa1, 0x7f, 0x5b, 0xc5, 0x9d, 0x7d, 0x1e, 0x11, 0x3e, 0xf3, 0xec, 0xb2, 0x13,
0x14, 0xe0, 0x84, 0x9a, 0x1a, 0xe8, 0x2a, 0x7c, 0x78, 0x49, 0x0d, 0x6d, 0x55, 0x90, 0xb4, 0x0a,
0xd2, 0x38, 0x56, 0xd3, 0x58, 0x44, 0x8c, 0xfe, 0x62, 0x19, 0x6f, 0x1c, 0x0d, 0x69, 0x98, 0x4d,
0x52, 0x83, 0x30, 0x5c, 0xf2, 0x7c, 0x4e, 0x0b, 0x42, 0x67, 0x32, 0x15, 0xc3, 0x5a, 0xef, 0x5d,
0x23, 0xa9, 0x09, 0x92, 0x3a, 0xa7, 0x9e, 0xad, 0x1c, 0x26, 0xfd, 0xd5, 0x32, 0x5e, 0x72, 0x4f,
0xc1, 0x07, 0xe6, 0xab, 0xd4, 0xf3, 0x03, 0xdf, 0x43, 0x05, 0x94, 0x5c, 0x95, 0x92, 0x01, 0x96,
0xfe, 0x66, 0x15, 0x5f, 0xad, 0x73, 0x93, 0x1b, 0x0f, 0x67, 0x65, 0x3c, 0x74, 0xe6, 0xb4, 0x79,
0xf9, 0xea, 0xd3, 0x43, 0xca, 0xea, 0x7b, 0x3e, 0x42, 0x05, 0xd5, 0x37, 0xcd, 0x56, 0x9f, 0x01,
0xff, 0x44, 0x33, 0x2b, 0x3c, 0xc3, 0xa4, 0x59, 0x70, 0x35, 0x7c, 0x95, 0xbf, 0x83, 0x14, 0x0c,
0xfa, 0x49, 0x6e, 0x1a, 0xc9, 0x74, 0xdf, 0x4b, 0x46, 0xcf, 0x3e, 0x7a, 0x5e, 0x49, 0xf6, 0xa6,
0xfa, 0x3d, 0xd6, 0x0c, 0x34, 0x45, 0x1b, 0x2a, 0xd8, 0x41, 0xa0, 0xee, 0x20, 0xe7, 0x94, 0xfe,
0x68, 0x69, 0x87, 0x24, 0x9e, 0x34, 0x6e, 0xe6, 0xa6, 0x1f, 0x75, 0x32, 0x8d, 0xa5, 0xfc, 0x50,
0xcd, 0x23, 0x59, 0x2d, 0xb8, 0x6d, 0x42, 0xf5, 0xb6, 0xd1, 0x20, 0xd2, 0xcf, 0xb3, 0x43, 0x99,
0xdd, 0x15, 0x5f, 0x1c, 0x10, 0xbf, 0xd9, 0x23, 0xc9, 0x57, 0x81, 0xde, 0xb6, 0x11, 0x66, 0x86,
0x30, 0xcb, 0x49, 0xa7, 0x4c, 0xfc, 0xd1, 0x87, 0xe6, 0x11, 0x4f, 0xb3, 0xdf, 0xf8, 0x8c, 0x88,
0xf1, 0xe1, 0x3d, 0x23, 0xe4, 0x3d, 0x84, 0x3c, 0x1f, 0x43, 0x6a, 0x01, 0xe8, 0x91, 0x66, 0x82,
0x34, 0x7f, 0x24, 0x28, 0x48, 0xe8, 0x49, 0x3e, 0xa1, 0xea, 0xb4, 0xf2, 0x8f, 0x55, 0x30, 0x93,
0x6a, 0xde, 0xe9, 0xe9, 0x94, 0xae, 0xe5, 0xef, 0xef, 0x72, 0xea, 0xe5, 0x58, 0xd1, 0xbe, 0x1c,
0xf9, 0xb3, 0xb7, 0xd1, 0x7b, 0xdf, 0xc8, 0xf9, 0x01, 0x72, 0xbe, 0x90, 0x6a, 0xb6, 0x79, 0x76,
0xbc, 0xb7, 0x99, 0x06, 0xe6, 0xe7, 0x66, 0x5e, 0xd0, 0x6f, 0xbf, 0x4e, 0xf5, 0x5b, 0x3d, 0x2e,
0xcf, 0x5b, 0x6e, 0x4c, 0x8f, 0xf3, 0x66, 0x89, 0xbc, 0x5d, 0x1e, 0x0e, 0xfd, 0xb9, 0x79, 0x7b,
0xa8, 0xe6, 0x2d, 0xe7, 0x92, 0xfe, 0x60, 0x19, 0x06, 0x7f, 0xbe, 0xd7, 0xeb, 0x83, 0xc1, 0x1e,
0x82, 0x58, 0xca, 0x17, 0xa4, 0x04, 0x35, 0x1e, 0xa9, 0xc5, 0x0d, 0x63, 0x1e, 0x2a, 0xbf, 0xc9,
0x0f, 0x95, 0x19, 0x34, 0xe8, 0xa5, 0xfa, 0x47, 0xc6, 0x53, 0xd0, 0x28, 0x00, 0xfe, 0x56, 0x3f,
0xcd, 0xaa, 0xc0, 0x8f, 0x0d, 0x4f, 0x98, 0xa7, 0xfd, 0x92, 0x56, 0x4c, 0xe0, 0x91, 0x4a, 0x40,
0x8b, 0x03, 0x0d, 0x48, 0xff, 0x50, 0x52, 0x09, 0x14, 0x20, 0x3c, 0x56, 0x11, 0xb4, 0x8e, 0xa8,
0x63, 0x78, 0x6f, 0xa5, 0x10, 0xde, 0x31, 0x22, 0x3c, 0xb1, 0xf2, 0x10, 0xd9, 0x4d, 0x6c, 0xf3,
0xb9, 0x2c, 0x98, 0x42, 0x51, 0x32, 0xee, 0xf5, 0xd6, 0x47, 0xe8, 0xb5, 0xce, 0xbb, 0xd9, 0x55,
0xdf, 0xf7, 0x7c, 0x7c, 0x92, 0x34, 0x92, 0xcf, 0xb6, 0x7c, 0xbe, 0xab, 0xd0, 0x27, 0x96, 0xee,
0xb9, 0xf7, 0xec, 0x27, 0xcf, 0xdc, 0xfe, 0xbf, 0x13, 0xdc, 0xbb, 0x71, 0x97, 0xcc, 0xc6, 0xe6,
0xd3, 0xfc, 0xc3, 0x32, 0x15, 0x16, 0x73, 0x61, 0x7d, 0x2f, 0x5c, 0xaf, 0x2a, 0x75, 0xac, 0x38,
0xf9, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x54, 0xf4, 0xce, 0xc6, 0xd4, 0x16, 0x00, 0x00,
0x10, 0xd7, 0xf9, 0x2b, 0xf6, 0xba, 0x4e, 0xdc, 0x75, 0x3e, 0x9c, 0x36, 0x6d, 0xc3, 0x8a, 0x0f,
0x83, 0x44, 0x91, 0x4e, 0xa9, 0x10, 0xe2, 0xb3, 0x8d, 0x5b, 0x5a, 0xa1, 0xa6, 0x21, 0x71, 0xe1,
0x0d, 0x71, 0xb5, 0x37, 0x8d, 0xc1, 0xbe, 0x33, 0x77, 0xe7, 0xa6, 0xa5, 0xd0, 0x16, 0x24, 0x84,
0x40, 0x42, 0x82, 0x17, 0x5e, 0x78, 0xe2, 0x8d, 0xff, 0x00, 0xf1, 0xc0, 0x5f, 0xc1, 0x3f, 0xc4,
0xec, 0xee, 0xed, 0xdd, 0xde, 0xdd, 0xee, 0xb9, 0x6d, 0x9e, 0xe2, 0x99, 0xd9, 0xf9, 0xfd, 0x76,
0x66, 0x76, 0x76, 0xf6, 0x50, 0x67, 0xec, 0x86, 0xd4, 0x77, 0x9d, 0xc9, 0x1b, 0x53, 0x1a, 0x3a,
0x17, 0x67, 0xbe, 0x17, 0x7a, 0xb8, 0xc2, 0xfe, 0x27, 0x7f, 0x96, 0x50, 0xa5, 0xef, 0x84, 0x0e,
0x3e, 0x85, 0x2a, 0x03, 0xea, 0x4f, 0xbb, 0xd6, 0x76, 0xa9, 0x57, 0xc1, 0x2d, 0x54, 0xbd, 0xe1,
0x8e, 0xe8, 0xfd, 0x6e, 0x89, 0xff, 0x3c, 0x8d, 0x1a, 0xbb, 0x93, 0x79, 0x00, 0x4e, 0x6e, 0xf4,
0xbb, 0x65, 0x2e, 0x3a, 0x87, 0xaa, 0x7b, 0xde, 0x88, 0x06, 0xdd, 0xca, 0x76, 0xb9, 0xd7, 0xb4,
0x97, 0x2f, 0x72, 0xd7, 0x4c, 0x74, 0xc3, 0x3d, 0xf2, 0xf0, 0x4b, 0xa8, 0xc1, 0xdc, 0xde, 0x71,
0x02, 0x30, 0xa9, 0x72, 0x13, 0x2c, 0x4c, 0xa4, 0x98, 0x9b, 0x81, 0x97, 0xdb, 0x01, 0xf5, 0x83,
0x6e, 0x4d, 0xf5, 0xc2, 0x44, 0x5c, 0x0d, 0xb8, 0x37, 0x9d, 0xfb, 0xdc, 0x69, 0xbf, 0xbb, 0xc4,
0x71, 0x37, 0xd0, 0x0a, 0x88, 0x0e, 0x8f, 0x1d, 0x7f, 0xf4, 0xa1, 0xef, 0xcd, 0x67, 0xa0, 0xa8,
0x73, 0x05, 0x46, 0x48, 0x2a, 0x40, 0xd6, 0xe0, 0xb2, 0x17, 0x04, 0x0b, 0x41, 0x14, 0x69, 0x89,
0x82, 0xc9, 0x4d, 0x2a, 0x4d, 0x9a, 0x3a, 0x13, 0x72, 0x09, 0xd5, 0x63, 0x73, 0x84, 0x4a, 0xe0,
0x5d, 0x04, 0x09, 0x42, 0x76, 0xdd, 0x0b, 0x42, 0x1e, 0xa3, 0x06, 0x5e, 0x41, 0x4b, 0x83, 0xdd,
0x7d, 0x2e, 0x28, 0x6f, 0x5b, 0xbd, 0x06, 0xf9, 0xcb, 0x42, 0xa7, 0x52, 0x9b, 0x05, 0xfb, 0x3d,
0x67, 0x4a, 0xf9, 0xea, 0x06, 0x3e, 0x8f, 0xd6, 0xfb, 0xf4, 0xc8, 0x99, 0x4f, 0xc2, 0x03, 0x1a,
0x52, 0x37, 0x1c, 0x7b, 0xee, 0xbe, 0x37, 0x19, 0x0f, 0x1f, 0x44, 0xfe, 0x76, 0xd0, 0xe9, 0xb4,
0x62, 0x0c, 0x04, 0xcb, 0x9c, 0xe0, 0xa6, 0x20, 0x98, 0x59, 0xc7, 0x31, 0x60, 0xd5, 0xae, 0x07,
0x42, 0x77, 0xee, 0xcd, 0x83, 0x8f, 0xe7, 0xd4, 0x1f, 0xc7, 0x29, 0x8a, 0x56, 0xa5, 0xd5, 0x7c,
0x15, 0x19, 0xa2, 0x4e, 0xc6, 0xd9, 0xe1, 0x8c, 0x0e, 0x15, 0xc2, 0xb0, 0x1f, 0xdc, 0x46, 0xf5,
0xfe, 0xdc, 0x77, 0x98, 0x0d, 0x50, 0xb4, 0x7a, 0x65, 0x7c, 0x06, 0xe1, 0x24, 0x11, 0xb1, 0xae,
0xcc, 0x75, 0x60, 0x7d, 0x40, 0x67, 0xe0, 0xca, 0xd9, 0x03, 0x7c, 0xab, 0xd7, 0x22, 0xff, 0x5a,
0x39, 0x14, 0x4d, 0x58, 0xd2, 0x28, 0xa5, 0x02, 0x94, 0x52, 0x0e, 0xa5, 0xd4, 0x6b, 0xe1, 0x57,
0x51, 0x33, 0xb1, 0x96, 0xa5, 0xb7, 0x2a, 0xb6, 0xae, 0x54, 0x0d, 0x03, 0x7e, 0x1d, 0xb5, 0x0e,
0xe7, 0x77, 0x82, 0xa1, 0x3f, 0x9e, 0x31, 0x97, 0xb2, 0x08, 0xd7, 0x23, 0x63, 0x45, 0xc5, 0x83,
0xf4, 0x93, 0x85, 0x96, 0x33, 0x1e, 0xd4, 0x6a, 0x80, 0x5a, 0x3d, 0x0c, 0x1d, 0x3f, 0x1c, 0x8c,
0x61, 0x2f, 0x82, 0x39, 0x94, 0xc4, 0x55, 0x77, 0xc4, 0x05, 0x82, 0x2e, 0xd8, 0xf4, 0xe9, 0x04,
0x62, 0x30, 0xba, 0x1c, 0x72, 0xbe, 0x65, 0x7c, 0x01, 0xd5, 0xb8, 0x53, 0x49, 0x75, 0x45, 0xa1,
0xca, 0x31, 0x3a, 0xa8, 0x39, 0xf0, 0xe7, 0xee, 0xd0, 0x11, 0xab, 0x6a, 0x2c, 0xba, 0xe4, 0x16,
0x80, 0xc5, 0x16, 0x2a, 0x8b, 0x55, 0x54, 0xbf, 0x75, 0xe2, 0xb2, 0x73, 0x1a, 0x00, 0x89, 0x72,
0xaf, 0x72, 0xa5, 0xd4, 0xb5, 0xf0, 0x36, 0xaa, 0x71, 0xa9, 0x2c, 0xa0, 0xb6, 0x02, 0xc2, 0x15,
0xa4, 0x8f, 0xda, 0xd9, 0x0d, 0x67, 0x12, 0x03, 0xbf, 0x6e, 0xc2, 0x29, 0x88, 0xaa, 0x73, 0x15,
0x6a, 0x9b, 0x06, 0x50, 0x48, 0x8e, 0x08, 0x1d, 0xf3, 0xdb, 0x20, 0x5b, 0x08, 0x25, 0x3e, 0xf1,
0x32, 0xaa, 0x45, 0x47, 0x97, 0x73, 0x23, 0x36, 0xea, 0x68, 0x8a, 0x2f, 0x03, 0x03, 0x9d, 0x87,
0xab, 0x04, 0x0e, 0xf9, 0x0c, 0xd5, 0xe3, 0x6e, 0x90, 0xe3, 0x73, 0xdd, 0x09, 0x8e, 0x23, 0x3e,
0xb0, 0xec, 0xf2, 0x68, 0x3a, 0x16, 0x75, 0x51, 0xc7, 0xaf, 0x20, 0xb4, 0xef, 0x8f, 0xef, 0x8d,
0x27, 0xf4, 0x6e, 0x5c, 0xff, 0x9d, 0xa4, 0xb9, 0xc4, 0x3a, 0xb2, 0x83, 0x5a, 0x29, 0x01, 0xaf,
0xbf, 0xe8, 0xd0, 0x46, 0x40, 0x90, 0xb4, 0x58, 0xcd, 0xd1, 0xaa, 0xe4, 0xbf, 0x1a, 0x5a, 0xda,
0xf5, 0xa6, 0x53, 0xc7, 0x1d, 0x41, 0x6c, 0x2b, 0xe1, 0x83, 0x99, 0x30, 0x5e, 0x96, 0x4d, 0x2e,
0x52, 0x5e, 0x1c, 0x80, 0x86, 0xfc, 0x51, 0x83, 0xde, 0x0a, 0xff, 0xe0, 0x35, 0x38, 0x9c, 0x3e,
0x85, 0x44, 0xb2, 0xb0, 0x44, 0x26, 0x6d, 0x8b, 0x89, 0x45, 0x55, 0xa8, 0xe2, 0x12, 0xde, 0x44,
0x6b, 0xc2, 0x5a, 0xf2, 0x91, 0xaa, 0x32, 0x34, 0xc1, 0x4e, 0xdf, 0xf7, 0x66, 0x59, 0x45, 0x05,
0xc8, 0x6c, 0x89, 0x35, 0x99, 0x83, 0x26, 0x2d, 0xaa, 0xd0, 0x76, 0xce, 0xb0, 0xa5, 0x06, 0x7d,
0x0d, 0xbf, 0x88, 0xb6, 0x0f, 0x69, 0xa8, 0xef, 0x4c, 0xd2, 0x6a, 0x89, 0xe1, 0xdc, 0x9e, 0x8d,
0xcc, 0x38, 0x75, 0x7c, 0x16, 0x6d, 0x08, 0x26, 0xc9, 0x91, 0x91, 0xca, 0x06, 0x53, 0x8a, 0x1d,
0xe7, 0x95, 0x28, 0xd9, 0x43, 0xa6, 0x58, 0xa4, 0x45, 0x53, 0xee, 0xc1, 0xa0, 0x3f, 0x95, 0xc4,
0x99, 0xa5, 0x56, 0x8a, 0x5b, 0x70, 0x92, 0x56, 0xd8, 0x32, 0x55, 0xb8, 0xcc, 0x6c, 0xc5, 0x4e,
0x54, 0xf1, 0x0a, 0x8b, 0x30, 0x84, 0x21, 0xce, 0xbb, 0x54, 0xb4, 0xe1, 0x9a, 0x59, 0x66, 0xf1,
0x81, 0xc8, 0x4b, 0xd9, 0x69, 0xbc, 0x85, 0xba, 0x20, 0xe3, 0xf5, 0x97, 0x5b, 0x81, 0x13, 0x04,
0x35, 0xbd, 0x1d, 0xb8, 0xfa, 0x36, 0xa3, 0x00, 0x29, 0xe7, 0x4e, 0xaa, 0xd7, 0x78, 0x88, 0x80,
0xac, 0x4e, 0xb9, 0xce, 0x5c, 0x1e, 0xd0, 0xa9, 0x77, 0x8f, 0xee, 0xd3, 0x84, 0xf4, 0x46, 0x52,
0x31, 0xf2, 0x46, 0x93, 0xaa, 0x6e, 0xba, 0x98, 0x54, 0xd5, 0x26, 0x53, 0x09, 0x7e, 0x59, 0xd5,
0x19, 0xa6, 0x12, 0x79, 0xca, 0x3a, 0x3c, 0x9b, 0xa8, 0xb2, 0xab, 0xb6, 0xf0, 0x3a, 0x34, 0x6c,
0x1a, 0x66, 0x97, 0x9c, 0x83, 0x9e, 0xd1, 0xe6, 0x5b, 0x62, 0x39, 0x97, 0xd2, 0xf3, 0xaf, 0xd5,
0xeb, 0xa3, 0xf6, 0x13, 0xf8, 0x2b, 0x91, 0x63, 0xcd, 0xf1, 0x88, 0x2f, 0xd9, 0xf8, 0xd0, 0x1f,
0x80, 0x54, 0x8c, 0x25, 0xf6, 0x9b, 0x68, 0x69, 0x18, 0x99, 0xb5, 0x52, 0xe7, 0xae, 0x4b, 0xa1,
0x4b, 0x36, 0xed, 0x8d, 0x48, 0x98, 0x75, 0x4a, 0xee, 0x6a, 0x4e, 0x5c, 0xaa, 0x8d, 0x42, 0x3b,
0xb9, 0xe6, 0xf9, 0x43, 0x71, 0xde, 0xeb, 0x05, 0x40, 0x47, 0x2a, 0x50, 0xce, 0x27, 0xf9, 0xdd,
0x32, 0x1c, 0xe2, 0x4c, 0x33, 0xb3, 0xd1, 0x4a, 0x7e, 0x0a, 0xb0, 0x0a, 0xaf, 0x7a, 0xfb, 0x6d,
0x23, 0xa9, 0xbb, 0x7c, 0xe9, 0x59, 0x75, 0xf7, 0x19, 0x78, 0xe8, 0xab, 0xba, 0x0e, 0x92, 0x66,
0x65, 0xbf, 0x65, 0x44, 0x38, 0x56, 0xc9, 0x69, 0x1c, 0xb1, 0xe1, 0xa7, 0xb0, 0x13, 0x69, 0xfa,
0xac, 0x36, 0x06, 0xa5, 0xe2, 0x18, 0x5c, 0x31, 0x32, 0x1c, 0x73, 0x86, 0x44, 0x8d, 0x81, 0x9e,
0x09, 0x79, 0x54, 0xd4, 0x11, 0x35, 0x3c, 0x65, 0x8c, 0xf8, 0xc5, 0x63, 0x7f, 0x60, 0x64, 0xf0,
0x05, 0x67, 0xb0, 0x9d, 0xc4, 0xc8, 0x80, 0xff, 0xb3, 0xb5, 0xb8, 0xe5, 0x2e, 0xa4, 0x71, 0xcd,
0x48, 0xe3, 0x4b, 0x4e, 0xe3, 0xe5, 0xe8, 0xc6, 0x5f, 0x80, 0x43, 0xfe, 0xb6, 0x8a, 0x3b, 0xfb,
0x22, 0x22, 0x6c, 0xe6, 0xd9, 0xa3, 0x27, 0x5c, 0x50, 0xce, 0x8d, 0x8d, 0x95, 0xdc, 0x68, 0x58,
0x65, 0xa3, 0x61, 0x41, 0x1a, 0x27, 0x6a, 0x1a, 0x8b, 0x88, 0x91, 0x5f, 0x2c, 0xe3, 0x8d, 0xa3,
0x21, 0x0d, 0xb3, 0x49, 0x6a, 0xda, 0x86, 0x4b, 0x9e, 0xcd, 0x69, 0x41, 0xe8, 0x4c, 0x67, 0x62,
0x58, 0xb3, 0xdf, 0x35, 0x92, 0x9a, 0x72, 0x52, 0xe7, 0xd4, 0xda, 0xca, 0x61, 0x92, 0x5f, 0x2d,
0xe3, 0x25, 0xf7, 0x14, 0x7c, 0x60, 0xbe, 0x4a, 0xbd, 0x71, 0xf8, 0xa3, 0xab, 0x80, 0x92, 0xab,
0x52, 0x32, 0xc0, 0x92, 0xdf, 0xac, 0xe2, 0xab, 0x75, 0x61, 0x72, 0xe3, 0xe1, 0xac, 0xcc, 0x8b,
0xce, 0x9c, 0x36, 0x2f, 0x7f, 0xfa, 0xf4, 0x90, 0xf2, 0xf4, 0x3d, 0x1f, 0xa1, 0x82, 0xd3, 0x37,
0xcb, 0x9e, 0x3e, 0x03, 0xfe, 0x89, 0x66, 0x56, 0x78, 0x86, 0x49, 0xb3, 0xe0, 0x6a, 0xf8, 0x2a,
0x7f, 0x07, 0x29, 0x18, 0xe4, 0x93, 0xdc, 0x34, 0x92, 0xe9, 0xbe, 0x97, 0x8c, 0x9e, 0x7d, 0xee,
0x79, 0x2d, 0xd9, 0x9b, 0xea, 0xf7, 0x58, 0x33, 0xd0, 0x14, 0x6d, 0xa8, 0x60, 0x07, 0x81, 0xba,
0x83, 0x9c, 0x53, 0xf2, 0xa3, 0xa5, 0x1d, 0x92, 0x58, 0xd2, 0x98, 0x99, 0x9b, 0x7e, 0xd4, 0xc9,
0x34, 0x96, 0xf2, 0x43, 0x35, 0x8b, 0x64, 0xb5, 0xe0, 0xb6, 0x09, 0xd5, 0xdb, 0x46, 0x83, 0x48,
0x3e, 0xcf, 0x0e, 0x65, 0xb8, 0x2b, 0x3e, 0x6b, 0x70, 0xfc, 0xa6, 0x8d, 0x92, 0x4f, 0x0f, 0xf6,
0x8e, 0x11, 0x66, 0xce, 0x61, 0x56, 0x93, 0x4e, 0x99, 0xf8, 0x23, 0x0f, 0xcd, 0x23, 0x9e, 0x66,
0xbf, 0x71, 0x8d, 0x88, 0xf1, 0xe1, 0x3d, 0x23, 0xe4, 0x3d, 0x0e, 0x79, 0x3e, 0x86, 0xd4, 0x02,
0x90, 0x23, 0xcd, 0x04, 0x69, 0xfe, 0x12, 0x51, 0x90, 0xd0, 0x93, 0x7c, 0x42, 0xd5, 0x69, 0xe5,
0x1f, 0xab, 0x60, 0x26, 0xd5, 0xbc, 0xd3, 0xd3, 0x29, 0xdd, 0xc8, 0xdf, 0xdf, 0xe5, 0xd4, 0xcb,
0xb1, 0xa2, 0x7d, 0x39, 0xb2, 0x67, 0x6f, 0xc3, 0x7e, 0xdf, 0xc8, 0xf9, 0x01, 0xe7, 0x7c, 0x21,
0xd5, 0x6c, 0xf3, 0xec, 0x58, 0x6f, 0x33, 0x0d, 0xcc, 0xcf, 0xcd, 0xbc, 0xa0, 0xdf, 0x7e, 0x9d,
0xea, 0xb7, 0x7a, 0x5c, 0x96, 0xb7, 0xdc, 0x98, 0x1e, 0xe7, 0xcd, 0x12, 0x79, 0xbb, 0x3c, 0x1a,
0xf9, 0x0b, 0xf3, 0xf6, 0x50, 0xcd, 0x5b, 0xce, 0x25, 0xf9, 0xc1, 0x32, 0x0c, 0xfe, 0x6c, 0xaf,
0xd7, 0x07, 0x83, 0x7d, 0x0e, 0x62, 0x29, 0x9f, 0xa9, 0x12, 0xd4, 0x78, 0xa4, 0x16, 0x37, 0x8c,
0x79, 0xa8, 0xfc, 0x26, 0x3f, 0x54, 0x66, 0xd0, 0xa0, 0x97, 0xea, 0x1f, 0x19, 0x4f, 0x41, 0xa3,
0x00, 0xf8, 0x5b, 0xfd, 0x34, 0xab, 0x02, 0x3f, 0x36, 0x3c, 0x61, 0x9e, 0xf6, 0x73, 0x5d, 0x31,
0x81, 0x47, 0x2a, 0x01, 0x2d, 0x0e, 0x34, 0x20, 0xfd, 0x43, 0x49, 0x25, 0x50, 0x80, 0xf0, 0x58,
0x45, 0xd0, 0x3a, 0x22, 0x8e, 0xe1, 0xbd, 0x95, 0x42, 0x78, 0xc7, 0x88, 0xf0, 0xc4, 0xca, 0x43,
0x64, 0x37, 0xb1, 0xc3, 0xe6, 0xb2, 0x60, 0x06, 0x87, 0x92, 0x32, 0xaf, 0xb7, 0x3e, 0xe2, 0x5e,
0xeb, 0xac, 0x9b, 0x5d, 0xf5, 0x7d, 0xcf, 0xe7, 0x4f, 0x92, 0x46, 0xf2, 0x6d, 0x98, 0xcd, 0x77,
0x15, 0xf2, 0xc4, 0xd2, 0x3d, 0xf7, 0x9e, 0xbd, 0xf2, 0xcc, 0xed, 0xff, 0x3b, 0xc1, 0xbd, 0x1b,
0x77, 0xc9, 0x6c, 0x6c, 0x3e, 0xcd, 0x3f, 0x2c, 0x53, 0x61, 0x31, 0x1f, 0xac, 0xef, 0x85, 0xeb,
0x75, 0xe5, 0x1c, 0x2b, 0x4e, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xc6, 0xc9, 0x45, 0x39,
0x17, 0x00, 0x00,
}

View File

@ -37,6 +37,13 @@ message DatabaseInfo {
repeated ContinuousQueryInfo ContinuousQueries = 4;
}
message RetentionPolicySpec {
optional string Name = 1;
optional int64 Duration = 2;
optional int64 ShardGroupDuration = 3;
optional uint32 ReplicaN = 4;
}
message RetentionPolicyInfo {
required string Name = 1;
required int64 Duration = 2;