Check ShardGroup Duration when recreating database

Fixes #6153
pull/6177/head
Edd Robinson 2016-03-31 17:59:11 +01:00
parent 105bcd3bb3
commit f68637205c
3 changed files with 39 additions and 7 deletions

View File

@ -35,6 +35,7 @@
- [#6110](https://github.com/influxdata/influxdb/issues/6110): Fix for 0.9 upgrade path when using RPM
- [#6131](https://github.com/influxdata/influxdb/issues/6061): Fix write throughput regression with large number of measurments
- [#6152](https://github.com/influxdata/influxdb/issues/6152): Allow SHARD DURATION to be specified in isolation when creating a database
- [#6153](https://github.com/influxdata/influxdb/issues/6153): Check SHARD DURATION when recreating the same database
## v0.11.1 [2016-03-31]

View File

@ -229,7 +229,7 @@ func (c *Client) CreateDatabaseWithRetentionPolicy(name string, rpi *RetentionPo
// 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 {
if rp.ReplicaN != rpi.ReplicaN || rp.Duration != rpi.Duration {
if rp.ReplicaN != rpi.ReplicaN || rp.Duration != rpi.Duration || rp.ShardGroupDuration != rpi.ShardGroupDuration {
return nil, ErrRetentionPolicyConflict
}
return db, nil

View File

@ -82,11 +82,13 @@ func TestMetaClient_CreateDatabaseWithRetentionPolicy(t *testing.T) {
defer os.RemoveAll(d)
defer c.Close()
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &meta.RetentionPolicyInfo{
Name: "rp0",
Duration: 1 * time.Hour,
ReplicaN: 1,
}); err != nil {
rpi := meta.RetentionPolicyInfo{
Name: "rp0",
Duration: 1 * time.Hour,
ReplicaN: 1,
ShardGroupDuration: 2 * time.Hour,
}
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi); err != nil {
t.Fatal(err)
}
@ -105,9 +107,38 @@ func TestMetaClient_CreateDatabaseWithRetentionPolicy(t *testing.T) {
} else if rp.Name != "rp0" {
t.Fatalf("rp name wrong: %s", rp.Name)
} else if rp.Duration != time.Hour {
t.Fatalf("rp duration wrong: %s", rp.Duration.String())
t.Fatalf("rp duration wrong: %v", rp.Duration)
} else if rp.ReplicaN != 1 {
t.Fatalf("rp replication wrong: %d", rp.ReplicaN)
} else if rp.ShardGroupDuration != 2*time.Hour {
t.Fatalf("rp shard duration wrong: %v", rp.ShardGroupDuration)
}
// Recreating the exact same database with retention policy is not
// an error.
if _, err := c.CreateDatabaseWithRetentionPolicy("db0", &rpi); 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 {
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 {
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 {
t.Fatalf("got %v, but expected %v", err, meta.ErrRetentionPolicyConflict)
}
}