From b874144cb3700ca55feb77f8a91392e0c8ef7038 Mon Sep 17 00:00:00 2001 From: John Shahid Date: Wed, 5 Feb 2014 15:02:04 -0500 Subject: [PATCH] make the max leveldb open files configurable --- config.toml.sample | 6 +++ src/configuration/config.toml | 6 +++ src/configuration/configuration.go | 68 +++++++++++++++---------- src/configuration/configuration_test.go | 4 ++ src/coordinator/client_server_test.go | 2 +- src/datastore/datastore_test.go | 2 +- src/datastore/leveldb_datastore.go | 17 ++++--- src/server/server.go | 2 +- 8 files changed, 70 insertions(+), 37 deletions(-) diff --git a/config.toml.sample b/config.toml.sample index 0cf99b47e1..e55fe8b523 100644 --- a/config.toml.sample +++ b/config.toml.sample @@ -52,3 +52,9 @@ dir = "/tmp/influxdb/development/db" # However, this port shouldn't be accessible from the internet. protobuf_port = 8099 + +[leveldb] + +# Maximum mmap open files, this will affect the virtual memory used by +# the process +max-open-files = 100 diff --git a/src/configuration/config.toml b/src/configuration/config.toml index b17854c1c5..42c91616ca 100644 --- a/src/configuration/config.toml +++ b/src/configuration/config.toml @@ -49,3 +49,9 @@ seed-servers = ["hosta:8090", "hostb:8090"] # However, this port shouldn't be accessible from the internet. protobuf_port = 8099 + +[leveldb] + +# Maximum mmap open files, this will affect the virtual memory used by +# the process +# max-open-files = 100 diff --git a/src/configuration/configuration.go b/src/configuration/configuration.go index c47b0a2853..73126656a5 100644 --- a/src/configuration/configuration.go +++ b/src/configuration/configuration.go @@ -39,6 +39,10 @@ type LoggingConfig struct { Level string } +type LevelDbConfiguration struct { + MaxOpenFiles int `toml:"max-open-files"` +} + type TomlConfiguration struct { Admin AdminConfig Api ApiConfig @@ -46,25 +50,27 @@ type TomlConfiguration struct { Storage StorageConfig Cluster ClusterConfig Logging LoggingConfig + LevelDb LevelDbConfiguration Hostname string BindAddress string `toml:"bind-address"` } type Configuration struct { - AdminHttpPort int - AdminAssetsDir string - ApiHttpSslPort int - ApiHttpCertPath string - ApiHttpPort int - RaftServerPort int - SeedServers []string - DataDir string - RaftDir string - ProtobufPort int - Hostname string - LogFile string - LogLevel string - BindAddress string + AdminHttpPort int + AdminAssetsDir string + ApiHttpSslPort int + ApiHttpCertPath string + ApiHttpPort int + RaftServerPort int + SeedServers []string + DataDir string + RaftDir string + ProtobufPort int + Hostname string + LogFile string + LogLevel string + BindAddress string + LevelDbMaxOpenFiles int } func LoadConfiguration(fileName string) *Configuration { @@ -88,20 +94,26 @@ func parseTomlConfiguration(filename string) (*Configuration, error) { } config := &Configuration{ - AdminHttpPort: tomlConfiguration.Admin.Port, - AdminAssetsDir: tomlConfiguration.Admin.Assets, - ApiHttpPort: tomlConfiguration.Api.Port, - ApiHttpCertPath: tomlConfiguration.Api.SslCertPath, - ApiHttpSslPort: tomlConfiguration.Api.SslPort, - RaftServerPort: tomlConfiguration.Raft.Port, - RaftDir: tomlConfiguration.Raft.Dir, - ProtobufPort: tomlConfiguration.Cluster.ProtobufPort, - SeedServers: tomlConfiguration.Cluster.SeedServers, - DataDir: tomlConfiguration.Storage.Dir, - LogFile: tomlConfiguration.Logging.File, - LogLevel: tomlConfiguration.Logging.Level, - Hostname: tomlConfiguration.Hostname, - BindAddress: tomlConfiguration.BindAddress, + AdminHttpPort: tomlConfiguration.Admin.Port, + AdminAssetsDir: tomlConfiguration.Admin.Assets, + ApiHttpPort: tomlConfiguration.Api.Port, + ApiHttpCertPath: tomlConfiguration.Api.SslCertPath, + ApiHttpSslPort: tomlConfiguration.Api.SslPort, + RaftServerPort: tomlConfiguration.Raft.Port, + RaftDir: tomlConfiguration.Raft.Dir, + ProtobufPort: tomlConfiguration.Cluster.ProtobufPort, + SeedServers: tomlConfiguration.Cluster.SeedServers, + DataDir: tomlConfiguration.Storage.Dir, + LogFile: tomlConfiguration.Logging.File, + LogLevel: tomlConfiguration.Logging.Level, + Hostname: tomlConfiguration.Hostname, + BindAddress: tomlConfiguration.BindAddress, + LevelDbMaxOpenFiles: tomlConfiguration.LevelDb.MaxOpenFiles, + } + + // if it wasn't set, set it to 100 + if config.LevelDbMaxOpenFiles == 0 { + config.LevelDbMaxOpenFiles = 100 } return config, nil diff --git a/src/configuration/configuration_test.go b/src/configuration/configuration_test.go index 233e698f78..9748737e53 100644 --- a/src/configuration/configuration_test.go +++ b/src/configuration/configuration_test.go @@ -24,6 +24,10 @@ func (self *LoadConfigurationSuite) TestConfig(c *C) { c.Assert(config.AdminAssetsDir, Equals, "./admin") c.Assert(config.AdminHttpPort, Equals, 8083) + // the default should be 100, this shouldn't be set in the test toml + // file + c.Assert(config.LevelDbMaxOpenFiles, Equals, 100) + c.Assert(config.ApiHttpPort, Equals, 0) c.Assert(config.ApiHttpSslPort, Equals, 8087) c.Assert(config.ApiHttpCertPath, Equals, "../cert.pem") diff --git a/src/coordinator/client_server_test.go b/src/coordinator/client_server_test.go index e33db73368..337c840780 100644 --- a/src/coordinator/client_server_test.go +++ b/src/coordinator/client_server_test.go @@ -19,7 +19,7 @@ const DB_DIR = "/tmp/influxdb/datastore_test" func newDatastore(c *C) datastore.Datastore { os.MkdirAll(DB_DIR, 0744) - db, err := datastore.NewLevelDbDatastore(DB_DIR) + db, err := datastore.NewLevelDbDatastore(DB_DIR, 100) c.Assert(err, Equals, nil) return db } diff --git a/src/datastore/datastore_test.go b/src/datastore/datastore_test.go index f8d2df1460..b9cc8b5380 100644 --- a/src/datastore/datastore_test.go +++ b/src/datastore/datastore_test.go @@ -26,7 +26,7 @@ const DB_DIR = "/tmp/chronosdb/datastore_test" func newDatastore(c *C) Datastore { os.MkdirAll(DB_DIR, 0744) - db, err := NewLevelDbDatastore(DB_DIR) + db, err := NewLevelDbDatastore(DB_DIR, 100) c.Assert(err, Equals, nil) return db } diff --git a/src/datastore/leveldb_datastore.go b/src/datastore/leveldb_datastore.go index b789c672d1..2eed8a7c7f 100644 --- a/src/datastore/leveldb_datastore.go +++ b/src/datastore/leveldb_datastore.go @@ -32,6 +32,7 @@ type LevelDbDatastore struct { incrementLock sync.Mutex requestId uint32 requestLogDir string + maxOpenFiles int } type Field struct { @@ -61,12 +62,13 @@ func getRequestLogDirForDate(baseDir string, t time.Time) string { return filepath.Join(baseDir, logDir) } -func NewRequestLogDb(dir string) (*requestLogDb, error) { +func NewRequestLogDb(dir string, maxOpenFiles int) (*requestLogDb, error) { err := os.MkdirAll(dir, 0744) if err != nil { return nil, err } opts := levigo.NewOptions() + opts.SetMaxOpenFiles(maxOpenFiles) opts.SetCache(levigo.NewLRUCache(ONE_MEGABYTE)) opts.SetCreateIfMissing(true) opts.SetBlockSize(TWO_FIFTY_SIX_KILOBYTES) @@ -143,7 +145,7 @@ var ( TRUE = true ) -func NewLevelDbDatastore(dbDir string) (Datastore, error) { +func NewLevelDbDatastore(dbDir string, maxOpenFiles int) (Datastore, error) { mainDbDir := filepath.Join(dbDir, DATABASE_DIR) requestLogDir := filepath.Join(dbDir, REQUEST_LOG_BASE_DIR) @@ -151,16 +153,17 @@ func NewLevelDbDatastore(dbDir string) (Datastore, error) { if err != nil { return nil, err } - previousLog, err := NewRequestLogDb(getRequestLogDirForDate(requestLogDir, time.Now().Add(-time.Hour*24))) + previousLog, err := NewRequestLogDb(getRequestLogDirForDate(requestLogDir, time.Now().Add(-time.Hour*24)), maxOpenFiles) if err != nil { return nil, err } - currentLog, err := NewRequestLogDb(getRequestLogDirForDate(requestLogDir, time.Now())) + currentLog, err := NewRequestLogDb(getRequestLogDirForDate(requestLogDir, time.Now()), maxOpenFiles) if err != nil { return nil, err } opts := levigo.NewOptions() + opts.SetMaxOpenFiles(maxOpenFiles) opts.SetCache(levigo.NewLRUCache(ONE_GIGABYTE)) opts.SetCreateIfMissing(true) opts.SetBlockSize(TWO_FIFTY_SIX_KILOBYTES) @@ -195,7 +198,9 @@ func NewLevelDbDatastore(dbDir string) (Datastore, error) { writeOptions: wo, requestLogDir: requestLogDir, currentRequestLog: currentLog, - previousRequestLog: previousLog} + previousRequestLog: previousLog, + maxOpenFiles: maxOpenFiles, + } go leveldbStore.periodicallyRotateRequestLog() @@ -218,7 +223,7 @@ func (self *LevelDbDatastore) rotateRequestLog() { oldLog := self.previousRequestLog self.previousRequestLog = self.currentRequestLog var err error - self.currentRequestLog, err = NewRequestLogDb(getRequestLogDirForDate(self.requestLogDir, time.Now())) + self.currentRequestLog, err = NewRequestLogDb(getRequestLogDirForDate(self.requestLogDir, time.Now()), self.maxOpenFiles) if err != nil { log.Error("Error creating new requst log: ", err) panic(err) diff --git a/src/server/server.go b/src/server/server.go index 8e77d5904f..6fbe4de69b 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -25,7 +25,7 @@ type Server struct { func NewServer(config *configuration.Configuration) (*Server, error) { log.Info("Opening database at %s", config.DataDir) - db, err := datastore.NewLevelDbDatastore(config.DataDir) + db, err := datastore.NewLevelDbDatastore(config.DataDir, config.LevelDbMaxOpenFiles) if err != nil { return nil, err }