Merge pull request #5818 from influxdata/er-upgrade-error
Highlight upgrade info for old shardspull/5961/head
commit
7dbc0f49d3
|
@ -443,6 +443,11 @@ func (s *Server) Open() error {
|
|||
|
||||
// Open TSDB store.
|
||||
if err := s.TSDBStore.Open(); err != nil {
|
||||
// Provide helpful error if user needs to upgrade shards to
|
||||
// tsm1.
|
||||
if serr, ok := err.(tsdb.ShardError); ok && serr.Err == tsdb.ErrUnknownEngineFormat {
|
||||
return influxdb.ErrUpgradeEngine
|
||||
}
|
||||
return fmt.Errorf("open tsdb store: %s", err)
|
||||
}
|
||||
|
||||
|
|
15
errors.go
15
errors.go
|
@ -12,6 +12,11 @@ var (
|
|||
|
||||
// ErrFieldTypeConflict is returned when a new field already exists with a different type.
|
||||
ErrFieldTypeConflict = errors.New("field type conflict")
|
||||
|
||||
// ErrUpgradeEngine will be returned when it's determined that
|
||||
// the server has encountered shards that are not in the `tsm1`
|
||||
// format.
|
||||
ErrUpgradeEngine = errors.New("\n\n" + upgradeMessage + "\n\n")
|
||||
)
|
||||
|
||||
// ErrDatabaseNotFound indicates that a database operation failed on the
|
||||
|
@ -43,3 +48,13 @@ func IsClientError(err error) bool {
|
|||
|
||||
return false
|
||||
}
|
||||
|
||||
const upgradeMessage = `*******************************************************************
|
||||
UNSUPPORTED SHARD FORMAT DETECTED
|
||||
|
||||
As of version 0.11, only tsm shards are supported. Please use the
|
||||
influx_tsm tool to convert non-tsm shards.
|
||||
|
||||
More information can be found at the documentation site:
|
||||
https://docs.influxdata.com/influxdb/v0.10/administration/upgrading
|
||||
*******************************************************************`
|
||||
|
|
|
@ -16,6 +16,11 @@ import (
|
|||
var (
|
||||
// ErrFormatNotFound is returned when no format can be determined from a path.
|
||||
ErrFormatNotFound = errors.New("format not found")
|
||||
|
||||
// ErrUnknownEngineFormat is returned when the engine format is
|
||||
// unknown. ErrUnknownEngineFormat is currently returned if a format
|
||||
// other than tsm1 is encountered.
|
||||
ErrUnknownEngineFormat = errors.New("unknown engine format")
|
||||
)
|
||||
|
||||
// Engine represents a swappable storage engine for the shard.
|
||||
|
@ -89,7 +94,7 @@ func NewEngine(path string, walPath string, options EngineOptions) (Engine, erro
|
|||
if fi, err := os.Stat(path); err != nil {
|
||||
return nil, err
|
||||
} else if !fi.Mode().IsDir() {
|
||||
return nil, errors.New("unknown engine type")
|
||||
return nil, ErrUnknownEngineFormat
|
||||
} else {
|
||||
format = "tsm1"
|
||||
}
|
||||
|
|
|
@ -44,6 +44,25 @@ var (
|
|||
ErrFieldUnmappedID = errors.New("field ID not mapped")
|
||||
)
|
||||
|
||||
// A ShardError implements the error interface, and contains extra
|
||||
// context about the shard that generated the error.
|
||||
type ShardError struct {
|
||||
id uint64
|
||||
Err error
|
||||
}
|
||||
|
||||
// NewShardError returns a new ShardError.
|
||||
func NewShardError(id uint64, err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
return ShardError{id: id, Err: err}
|
||||
}
|
||||
|
||||
func (e ShardError) Error() string {
|
||||
return fmt.Sprintf("[shard %d] %s", e.id, e.Err)
|
||||
}
|
||||
|
||||
// Shard represents a self-contained time series database. An inverted index of
|
||||
// the measurement and tag data is kept along with the raw time series data.
|
||||
// Data can be split across many shards. The query engine in TSDB is responsible
|
||||
|
@ -126,7 +145,7 @@ func (s *Shard) Open() error {
|
|||
// Initialize underlying engine.
|
||||
e, err := NewEngine(s.path, s.walPath, s.options)
|
||||
if err != nil {
|
||||
return fmt.Errorf("new engine: %s", err)
|
||||
return err
|
||||
}
|
||||
s.engine = e
|
||||
|
||||
|
@ -135,18 +154,18 @@ func (s *Shard) Open() error {
|
|||
|
||||
// Open engine.
|
||||
if err := s.engine.Open(); err != nil {
|
||||
return fmt.Errorf("open engine: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// Load metadata index.
|
||||
if err := s.engine.LoadMetadataIndex(s, s.index, s.measurementFields); err != nil {
|
||||
return fmt.Errorf("load metadata index: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}(); err != nil {
|
||||
s.close()
|
||||
return err
|
||||
return NewShardError(s.id, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
@ -144,7 +144,7 @@ func (s *Store) loadShards() error {
|
|||
shard := NewShard(shardID, s.databaseIndexes[db], path, walPath, s.EngineOptions)
|
||||
err = shard.Open()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open shard %d: %s", shardID, err)
|
||||
return err
|
||||
}
|
||||
|
||||
s.shards[shardID] = shard
|
||||
|
|
Loading…
Reference in New Issue