diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2016-09-07 21:07:11 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-09-07 21:07:11 -0700 |
| commit | 99e47fc5fcd5743324feda9498a699717761924d (patch) | |
| tree | b57f95a290b27c8b83abaf953ab5c47b8ef1ce82 /weed/server | |
| parent | 0559aa96738d727e055190301bbb0624c74ced7f (diff) | |
| parent | 78474409a596aabd8e579716ba1f4939e7d62579 (diff) | |
| download | seaweedfs-99e47fc5fcd5743324feda9498a699717761924d.tar.xz seaweedfs-99e47fc5fcd5743324feda9498a699717761924d.zip | |
Merge pull request #361 from hxiaodon/master
add mysql filer support
Diffstat (limited to 'weed/server')
| -rw-r--r-- | weed/server/filer_server.go | 43 | ||||
| -rw-r--r-- | weed/server/filer_server_handlers_read.go | 3 | ||||
| -rw-r--r-- | weed/server/filer_server_handlers_write.go | 12 |
3 files changed, 50 insertions, 8 deletions
diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 3c7c1fd9e..959bb92cb 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -1,8 +1,10 @@ package weed_server import ( + "encoding/json" "math/rand" "net/http" + "os" "strconv" "sync" "time" @@ -11,6 +13,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer/cassandra_store" "github.com/chrislusf/seaweedfs/weed/filer/embedded_filer" "github.com/chrislusf/seaweedfs/weed/filer/flat_namespace" + "github.com/chrislusf/seaweedfs/weed/filer/mysql_store" "github.com/chrislusf/seaweedfs/weed/filer/redis_store" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/security" @@ -18,6 +21,26 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) +type filerConf struct { + MysqlConf []mysql_store.MySqlConf `json:"mysql"` + mysql_store.ShardingConf +} + +func parseConfFile(confPath string) (*filerConf, error) { + var setting filerConf + configFile, err := os.Open(confPath) + defer configFile.Close() + if err != nil { + return nil, err + } + + jsonParser := json.NewDecoder(configFile) + if err = jsonParser.Decode(&setting); err != nil { + return nil, err + } + return &setting, nil +} + type FilerServer struct { port string master string @@ -28,12 +51,13 @@ type FilerServer struct { disableDirListing bool secret security.Secret filer filer.Filer - maxMB int + maxMB int masterNodes *storage.MasterNodes } func NewFilerServer(r *http.ServeMux, ip string, port int, master string, dir string, collection string, replication string, redirectOnRead bool, disableDirListing bool, + confFile string, maxMB int, secret string, cassandra_server string, cassandra_keyspace string, @@ -45,11 +69,24 @@ func NewFilerServer(r *http.ServeMux, ip string, port int, master string, dir st defaultReplication: replication, redirectOnRead: redirectOnRead, disableDirListing: disableDirListing, - maxMB: maxMB, + maxMB: maxMB, port: ip + ":" + strconv.Itoa(port), } - if cassandra_server != "" { + var setting *filerConf + if confFile != "" { + setting, err = parseConfFile(confFile) + if err != nil { + return nil, err + } + } else { + setting = new(filerConf) + } + + if setting.MysqlConf != nil && len(setting.MysqlConf) != 0 { + mysql_store := mysql_store.NewMysqlStore(setting.MysqlConf, setting.IsSharding, setting.ShardCount) + fs.filer = flat_namespace.NewFlatNamespaceFiler(master, mysql_store) + } else if cassandra_server != "" { cassandra_store, err := cassandra_store.NewCassandraStore(cassandra_keyspace, cassandra_server) if err != nil { glog.Fatalf("Can not connect to cassandra server %s with keyspace %s: %v", cassandra_server, cassandra_keyspace, err) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 6b9505377..bf95e37b9 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -7,6 +7,7 @@ import ( "strconv" "strings" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/operation" ui "github.com/chrislusf/seaweedfs/weed/server/filer_ui" @@ -87,7 +88,7 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, } fileId, err := fs.filer.FindFile(r.URL.Path) - if err == leveldb.ErrNotFound { + if err == filer.ErrNotFound { glog.V(3).Infoln("Not found in db", r.URL.Path) w.WriteHeader(http.StatusNotFound) return diff --git a/weed/server/filer_server_handlers_write.go b/weed/server/filer_server_handlers_write.go index 872d8c4b9..464cb81ef 100644 --- a/weed/server/filer_server_handlers_write.go +++ b/weed/server/filer_server_handlers_write.go @@ -15,11 +15,11 @@ import ( "net/url" "strings" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/operation" "github.com/chrislusf/seaweedfs/weed/storage" "github.com/chrislusf/seaweedfs/weed/util" - "github.com/syndtr/goleveldb/leveldb" "path" "strconv" ) @@ -73,17 +73,17 @@ func makeFormData(filename, mimeType string, content io.Reader) (formData io.Rea } func (fs *FilerServer) queryFileInfoByPath(w http.ResponseWriter, r *http.Request, path string) (fileId, urlLocation string, err error) { - if fileId, err = fs.filer.FindFile(path); err != nil && err != leveldb.ErrNotFound { + if fileId, err = fs.filer.FindFile(path); err != nil && err != filer.ErrNotFound { glog.V(0).Infoln("failing to find path in filer store", path, err.Error()) writeJsonError(w, r, http.StatusInternalServerError, err) - return } else if fileId != "" && err == nil { urlLocation, err = operation.LookupFileId(fs.getMasterNode(), fileId) if err != nil { glog.V(1).Infoln("operation LookupFileId %s failed, err is %s", fileId, err.Error()) w.WriteHeader(http.StatusNotFound) - return } + } else if fileId == "" && err == filer.ErrNotFound { + w.WriteHeader(http.StatusNotFound) } return } @@ -315,6 +315,8 @@ func (fs *FilerServer) PostHandler(w http.ResponseWriter, r *http.Request) { if r.Method != "PUT" { if oldFid, err := fs.filer.FindFile(path); err == nil { operation.DeleteFile(fs.getMasterNode(), oldFid, fs.jwt(oldFid)) + } else if err != nil && err != filer.ErrNotFound { + glog.V(0).Infof("error %v occur when finding %s in filer store", err, path) } } @@ -498,6 +500,8 @@ func (fs *FilerServer) doAutoChunk(w http.ResponseWriter, r *http.Request, conte if r.Method != "PUT" { if oldFid, err := fs.filer.FindFile(path); err == nil { operation.DeleteFile(fs.getMasterNode(), oldFid, fs.jwt(oldFid)) + } else if err != nil && err != filer.ErrNotFound { + glog.V(0).Infof("error %v occur when finding %s in filer store", err, path) } } |
