Only update Metastore if new fields were created

It is quite possible that multiple applyCreateFieldsIfNotExist messages
will sit unapplied in the Raft commit log, each carrying exactly the same
information about new fields. So during application of this message only
change the Metastore if the fields actually changed.
pull/1614/head
Philip O'Toole 2015-02-15 16:53:25 -08:00
parent c90d27083c
commit 9db17a7e09
1 changed files with 10 additions and 7 deletions

View File

@ -1502,6 +1502,7 @@ func (s *Server) applyCreateFieldsIfNotExist(m *messaging.Message) error {
}
// Create fields in Metastore.
nCurrFields := len(mm.Fields)
for k, v := range c.Fields {
if err := mm.createFieldIfNotExists(k, v); err != nil {
if err == ErrFieldOverflow {
@ -1515,14 +1516,16 @@ func (s *Server) applyCreateFieldsIfNotExist(m *messaging.Message) error {
}
}
// Update metastore.
if err := s.meta.mustUpdate(func(tx *metatx) error {
if err := tx.saveMeasurement(db.name, mm); err != nil {
return fmt.Errorf("save measurement: %s", err)
// Update Metastore only if the Measurement's fields were actually changed.
if len(mm.Fields) > nCurrFields {
if err := s.meta.mustUpdate(func(tx *metatx) error {
if err := tx.saveMeasurement(db.name, mm); err != nil {
return fmt.Errorf("save measurement: %s", err)
}
return tx.saveDatabase(db)
}); err != nil {
return err
}
return tx.saveDatabase(db)
}); err != nil {
return err
}
return nil