)]}'
{"go/objectserver/main.go":[{"author":{"_account_id":8542,"name":"Prashanth Pai","email":"ppai@redhat.com","username":"pai"},"change_message_id":"39fbef3a48dafe7c458a34fa493cae4bcb68fa62","unresolved":false,"context_lines":[{"line_number":638,"context_line":"\t\treturn \"\", 0, nil, nil, err"},{"line_number":639,"context_line":"\t}"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"\tserverconf, err :\u003d hummingbird.LoadIniFile(conf)"},{"line_number":642,"context_line":"\tif err !\u003d nil {"},{"line_number":643,"context_line":"\t\treturn \"\", 0, nil, nil, errors.New(fmt.Sprintf(\"Unable to load %s\", conf))"},{"line_number":644,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":4,"id":"3a57f1b5_bf3da4de","line":641,"range":{"start_line":641,"start_character":0,"end_line":641,"end_character":49},"updated":"2016-02-12 11:14:42.000000000","message":"Different back-ends may want to initialize some global state (for example network connections) at the beginning of object server startup. I\u0027m thinking along the lines of setup() method in diskfilemanager (python).","commit_id":"e02e69becc3da04452133f32af76215ea050989f"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":214,"context_line":"func (server *ObjectServer) ObjPutHandler(writer http.ResponseWriter, request *http.Request) {"},{"line_number":215,"context_line":"\tvars :\u003d hummingbird.GetVars(request)"},{"line_number":216,"context_line":"\toutHeaders :\u003d writer.Header()"},{"line_number":217,"context_line":"\tif !hummingbird.ValidTimestamp(request.Header.Get(\"X-Timestamp\")) {"},{"line_number":218,"context_line":"\t\thttp.Error(writer, \"Invalid X-Timestamp header\", http.StatusBadRequest)"},{"line_number":219,"context_line":"\t\treturn"},{"line_number":220,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_1dcbe554","side":"PARENT","line":217,"updated":"2016-04-18 08:15:22.000000000","message":"Should we also delete ValidTimestamp function from utils.go?","commit_id":"fcd89b1ca273da9d2baed3ff0dfed518d22d8e1f"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":214,"context_line":"func (server *ObjectServer) ObjPutHandler(writer http.ResponseWriter, request *http.Request) {"},{"line_number":215,"context_line":"\tvars :\u003d hummingbird.GetVars(request)"},{"line_number":216,"context_line":"\toutHeaders :\u003d writer.Header()"},{"line_number":217,"context_line":"\tif !hummingbird.ValidTimestamp(request.Header.Get(\"X-Timestamp\")) {"},{"line_number":218,"context_line":"\t\thttp.Error(writer, \"Invalid X-Timestamp header\", http.StatusBadRequest)"},{"line_number":219,"context_line":"\t\treturn"},{"line_number":220,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_72648d48","side":"PARENT","line":217,"in_reply_to":"1a122d0e_1dcbe554","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"fcd89b1ca273da9d2baed3ff0dfed518d22d8e1f"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":56,"context_line":"func (server *ObjectServer) ObjGetHandler(writer http.ResponseWriter, request *http.Request) {"},{"line_number":57,"context_line":"\tvars :\u003d hummingbird.GetVars(request)"},{"line_number":58,"context_line":"\theaders :\u003d writer.Header()"},{"line_number":59,"context_line":"\tobj, err :\u003d server.objEngine.New(vars, request.Method \u003d\u003d \"GET\")"},{"line_number":60,"context_line":"\tif err !\u003d nil {"},{"line_number":61,"context_line":"\t\thummingbird.GetLogger(request).LogError(\"Unable to open object: %v\", err)"},{"line_number":62,"context_line":"\t\thummingbird.StandardResponse(writer, http.StatusInternalServerError)"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_ecb64189","line":59,"updated":"2016-04-18 08:15:22.000000000","message":"If there is error while calling objEngine.New due to bad metadata, should we quarantine the file before returning?","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":56,"context_line":"func (server *ObjectServer) ObjGetHandler(writer http.ResponseWriter, request *http.Request) {"},{"line_number":57,"context_line":"\tvars :\u003d hummingbird.GetVars(request)"},{"line_number":58,"context_line":"\theaders :\u003d writer.Header()"},{"line_number":59,"context_line":"\tobj, err :\u003d server.objEngine.New(vars, request.Method \u003d\u003d \"GET\")"},{"line_number":60,"context_line":"\tif err !\u003d nil {"},{"line_number":61,"context_line":"\t\thummingbird.GetLogger(request).LogError(\"Unable to open object: %v\", err)"},{"line_number":62,"context_line":"\t\thummingbird.StandardResponse(writer, http.StatusInternalServerError)"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_9261693c","line":59,"in_reply_to":"1a122d0e_ecb64189","updated":"2016-04-19 03:08:47.000000000","message":"Yes, probably.\n\nActually I\u0027m going to pull Audit out of the interface and just make all of that something that happens inside of New, and make it quarantine.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":241,"context_line":"\t}"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"\ttempFile, err :\u003d obj.SetData(request.ContentLength)"},{"line_number":244,"context_line":"\tif err \u003d\u003d DriveFullError {"},{"line_number":245,"context_line":"\t\thummingbird.GetLogger(request).LogDebug(\"Not enough space available\")"},{"line_number":246,"context_line":"\t\thummingbird.CustomErrorResponse(writer, 507, vars)"},{"line_number":247,"context_line":"\t\treturn"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_ab5d46eb","line":244,"updated":"2016-04-18 08:15:22.000000000","message":"It seems like obj.SetData doesn\u0027t return DriveFullError.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":241,"context_line":"\t}"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"\ttempFile, err :\u003d obj.SetData(request.ContentLength)"},{"line_number":244,"context_line":"\tif err \u003d\u003d DriveFullError {"},{"line_number":245,"context_line":"\t\thummingbird.GetLogger(request).LogDebug(\"Not enough space available\")"},{"line_number":246,"context_line":"\t\thummingbird.CustomErrorResponse(writer, 507, vars)"},{"line_number":247,"context_line":"\t\treturn"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_324b35b2","line":244,"in_reply_to":"1a122d0e_ab5d46eb","updated":"2016-04-19 03:08:47.000000000","message":"Good catch.  Fixed.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":302,"context_line":"\t}"},{"line_number":303,"context_line":"\tresponseStatus :\u003d http.StatusNotFound"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"\tobj, err :\u003d server.objEngine.New(vars, false)"},{"line_number":306,"context_line":"\tif err !\u003d nil {"},{"line_number":307,"context_line":"\t\thummingbird.GetLogger(request).LogError(\"Error getting obj: %s\", err.Error())"},{"line_number":308,"context_line":"\t\thummingbird.StandardResponse(writer, http.StatusInternalServerError)"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_a688dde8","line":305,"updated":"2016-04-18 08:15:22.000000000","message":"If there is error while calling objEngine.New due to bad metadata, should we quarantine the file before returning?","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"}],"go/objectserver/objengine.go":[{"author":{"_account_id":8542,"name":"Prashanth Pai","email":"ppai@redhat.com","username":"pai"},"change_message_id":"bc56d0a0fd57bd4eafe76a8b66407ce4d5361efa","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\t// Copy copies an object\u0027s entire contents to the writer(s)."},{"line_number":43,"context_line":"\tCopy(...io.Writer) (int64, error)"},{"line_number":44,"context_line":"\t// SetData sets the data for the object.  It returns a writer, a save(metadata) function, a cleanup() function, and an error if any."},{"line_number":45,"context_line":"\tSetData(size int64, reserve int64) (w io.Writer, save func(metadata map[string]string) error, cleanup func(), err error)"},{"line_number":46,"context_line":"\t// Delete deletes the object."},{"line_number":47,"context_line":"\tDelete(metadata map[string]string, reserve int64) error"},{"line_number":48,"context_line":"\t// Close releases any resources held by the object."}],"source_content_type":"text/x-go","patch_set":5,"id":"dae33548_9e4b83b0","line":45,"range":{"start_line":45,"start_character":0,"end_line":45,"end_character":121},"updated":"2016-02-15 13:50:35.000000000","message":"This looks a little messy.\n\nWhy not return a io.WriterCloser (https://golang.org/pkg/io/#WriteCloser) and then call \n\n    defer tempFile.Close()\n\n\nSave() or Commit() or Finalize() can be a separate method that does a fsync, rename and cleanup on failure.","commit_id":"b57683a20318298cee47124bde84bce695537ee8"},{"author":{"_account_id":8542,"name":"Prashanth Pai","email":"ppai@redhat.com","username":"pai"},"change_message_id":"bc56d0a0fd57bd4eafe76a8b66407ce4d5361efa","unresolved":false,"context_lines":[{"line_number":54,"context_line":"// ObjectEngine is the type you have to give hummingbird to create a new object engine."},{"line_number":55,"context_line":"type ObjectEngine interface {"},{"line_number":56,"context_line":"\t// New creates a new instance of the Object, for interacting with a single object."},{"line_number":57,"context_line":"\tNew(vars map[string]string, needData bool) (Object, error)"},{"line_number":58,"context_line":"\t// RegisterHandlers registers custom routes needed by this object engine.  Examples are replication handlers.  Be careful of collisions."},{"line_number":59,"context_line":"\tRegisterHandlers(*hummingbird.Router)"},{"line_number":60,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":5,"id":"dae33548_d8bb5e0d","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":59},"updated":"2016-02-15 13:50:35.000000000","message":"There is certainly a need for backends to access the request directly. You could pass the *http.Request instance instead of just \"needData\".","commit_id":"b57683a20318298cee47124bde84bce695537ee8"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":25,"context_line":")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"// DriveFullError can be returned by Object.SetData and Object.Delete if the disk is too full for the operation."},{"line_number":28,"context_line":"var DriveFullError \u003d errors.New(\"Drive Full\")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"type Object interface {"},{"line_number":31,"context_line":"\t// Exists determines whether or not there is an object to serve. Deleted objects do not exist, even if there is a tombstone."}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_0be8bae1","line":28,"updated":"2016-04-18 08:15:22.000000000","message":"It doesn\u0027t seem like we are using this variable.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":25,"context_line":")"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"// DriveFullError can be returned by Object.SetData and Object.Delete if the disk is too full for the operation."},{"line_number":28,"context_line":"var DriveFullError \u003d errors.New(\"Drive Full\")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"type Object interface {"},{"line_number":31,"context_line":"\t// Exists determines whether or not there is an object to serve. Deleted objects do not exist, even if there is a tombstone."}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_92efa986","line":28,"in_reply_to":"1a122d0e_0be8bae1","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":73,"context_line":"var engineFactories \u003d []engineFactoryEntry{}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"// RegisterObjectEngine lets you tell hummingbird about a new object engine."},{"line_number":76,"context_line":"func RegisterObjectEngine(name string, newEngine ObjectEngineConstructor) {"},{"line_number":77,"context_line":"\tengineFactories \u003d append(engineFactories, engineFactoryEntry{name, newEngine})"},{"line_number":78,"context_line":"}"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_01b1bb8f","line":76,"updated":"2016-04-18 08:15:22.000000000","message":"May be add a duplicate check while registering object engine","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":73,"context_line":"var engineFactories \u003d []engineFactoryEntry{}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"// RegisterObjectEngine lets you tell hummingbird about a new object engine."},{"line_number":76,"context_line":"func RegisterObjectEngine(name string, newEngine ObjectEngineConstructor) {"},{"line_number":77,"context_line":"\tengineFactories \u003d append(engineFactories, engineFactoryEntry{name, newEngine})"},{"line_number":78,"context_line":"}"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_52acf133","line":76,"in_reply_to":"1a122d0e_01b1bb8f","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"}],"go/objectserver/swiftobjeng.go":[{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"// SwiftObject implements an Object that is compatible with Swift\u0027s object server."},{"line_number":37,"context_line":"type SwiftObject struct {"},{"line_number":38,"context_line":"\t*SwiftObjectFactory"},{"line_number":39,"context_line":"\tfile         *os.File"},{"line_number":40,"context_line":"\tafw          AtomicFileWriter"},{"line_number":41,"context_line":"\thashDir      string"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_fc13825a","line":38,"updated":"2016-04-18 08:15:22.000000000","message":"Embedding SwiftObjectFactory within SwiftObject looks kinda odd.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"// SwiftObject implements an Object that is compatible with Swift\u0027s object server."},{"line_number":37,"context_line":"type SwiftObject struct {"},{"line_number":38,"context_line":"\t*SwiftObjectFactory"},{"line_number":39,"context_line":"\tfile         *os.File"},{"line_number":40,"context_line":"\tafw          AtomicFileWriter"},{"line_number":41,"context_line":"\thashDir      string"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_4d6454e3","line":38,"in_reply_to":"1a122d0e_fc13825a","updated":"2016-04-19 03:08:47.000000000","message":"But it\u0027s so easy.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"// Audit does some cheap sanity checking, making sure the object has metadata and that the content-length matches its on-disk size."},{"line_number":55,"context_line":"func (o *SwiftObject) Audit() error {"},{"line_number":56,"context_line":"\tmetadata :\u003d o.Metadata()"},{"line_number":57,"context_line":"\tstrconv.ParseInt(metadata[\"Content-Length\"], 10, 64)"},{"line_number":58,"context_line":"\tif metadata :\u003d o.Metadata(); metadata \u003d\u003d nil {"},{"line_number":59,"context_line":"\t\treturn errors.New(\"No metadata found\")"},{"line_number":60,"context_line":"\t} else if contentLength, err :\u003d strconv.ParseInt(metadata[\"Content-Length\"], 10, 64); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_ec82c1ff","line":57,"range":{"start_line":56,"start_character":1,"end_line":57,"end_character":53},"updated":"2016-04-18 08:15:22.000000000","message":"redundant lines?","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"// Audit does some cheap sanity checking, making sure the object has metadata and that the content-length matches its on-disk size."},{"line_number":55,"context_line":"func (o *SwiftObject) Audit() error {"},{"line_number":56,"context_line":"\tmetadata :\u003d o.Metadata()"},{"line_number":57,"context_line":"\tstrconv.ParseInt(metadata[\"Content-Length\"], 10, 64)"},{"line_number":58,"context_line":"\tif metadata :\u003d o.Metadata(); metadata \u003d\u003d nil {"},{"line_number":59,"context_line":"\t\treturn errors.New(\"No metadata found\")"},{"line_number":60,"context_line":"\t} else if contentLength, err :\u003d strconv.ParseInt(metadata[\"Content-Length\"], 10, 64); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_32f9754e","line":57,"range":{"start_line":56,"start_character":1,"end_line":57,"end_character":53},"in_reply_to":"1a122d0e_ec82c1ff","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":199,"context_line":"\treclaimAge       int64"},{"line_number":200,"context_line":"}"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"// NewSwiftObj returns an instance of SwiftObject with the given parameters. Metadata is read in and if needData is true, the file is opened."},{"line_number":203,"context_line":"func (f *SwiftObjectFactory) New(vars map[string]string, needData bool) (Object, error) {"},{"line_number":204,"context_line":"\tvar err error"},{"line_number":205,"context_line":"\tsor :\u003d \u0026SwiftObject{SwiftObjectFactory: f}"}],"source_content_type":"text/x-go","patch_set":13,"id":"5a18252c_f591cb9a","line":202,"range":{"start_line":202,"start_character":3,"end_line":202,"end_character":14},"updated":"2016-04-18 08:15:22.000000000","message":"typo?","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":199,"context_line":"\treclaimAge       int64"},{"line_number":200,"context_line":"}"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"// NewSwiftObj returns an instance of SwiftObject with the given parameters. Metadata is read in and if needData is true, the file is opened."},{"line_number":203,"context_line":"func (f *SwiftObjectFactory) New(vars map[string]string, needData bool) (Object, error) {"},{"line_number":204,"context_line":"\tvar err error"},{"line_number":205,"context_line":"\tsor :\u003d \u0026SwiftObject{SwiftObjectFactory: f}"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_929689ee","line":202,"range":{"start_line":202,"start_character":3,"end_line":202,"end_character":14},"in_reply_to":"5a18252c_f591cb9a","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":211,"context_line":"\t\t\tif sor.file, err \u003d os.Open(sor.dataFile); err !\u003d nil {"},{"line_number":212,"context_line":"\t\t\t\treturn nil, err"},{"line_number":213,"context_line":"\t\t\t}"},{"line_number":214,"context_line":"\t\t\tif sor.metadata, err \u003d OpenObjectMetadata(sor.file.Fd(), sor.metaFile); err !\u003d nil {"},{"line_number":215,"context_line":"\t\t\t\tsor.file.Close()"},{"line_number":216,"context_line":"\t\t\t\treturn nil, fmt.Errorf(\"Error getting metadata: %v\", err)"},{"line_number":217,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_ec264167","line":214,"range":{"start_line":214,"start_character":26,"end_line":214,"end_character":44},"updated":"2016-04-18 08:15:22.000000000","message":"Couple of refactor suggestion:\nI was wondering whether we can use ObjectMetadata function instead of OpenObjectMetadata here and may be get rid of OpenObjectMetadata function from background.go.\n\nAlso may be merge RawReadMetadata \u0026 ReadMetadata in background.go and use ReadMetadata instead of RawReadMetadata in replicator.go. ReadMetadata does the similar auditing as being done in getFile in replicator.go","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":211,"context_line":"\t\t\tif sor.file, err \u003d os.Open(sor.dataFile); err !\u003d nil {"},{"line_number":212,"context_line":"\t\t\t\treturn nil, err"},{"line_number":213,"context_line":"\t\t\t}"},{"line_number":214,"context_line":"\t\t\tif sor.metadata, err \u003d OpenObjectMetadata(sor.file.Fd(), sor.metaFile); err !\u003d nil {"},{"line_number":215,"context_line":"\t\t\t\tsor.file.Close()"},{"line_number":216,"context_line":"\t\t\t\treturn nil, fmt.Errorf(\"Error getting metadata: %v\", err)"},{"line_number":217,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_6d2af07f","line":214,"range":{"start_line":214,"start_character":26,"end_line":214,"end_character":44},"in_reply_to":"1a122d0e_ec264167","updated":"2016-04-19 03:08:47.000000000","message":"Well... both of those were done for slight performance reasons.\n\nOpenObjectMetadata is slightly faster than ObjectMetadata if the file is already open anyway.\n\nRawReadMetadata exists so the replicator doesn\u0027t have to re-serialize the metadata.\n\nIt\u0027s a little ugly, and we can probably come up with a cleaner API for what we\u0027re doing, or see if the performance impact of junking those functions is worth worrying about.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":332,"context_line":"\t\t\tif _, err :\u003d hummingbird.CopyN(rc, sfr.Size, tempFile); err !\u003d nil {"},{"line_number":333,"context_line":"\t\t\t\treturn err"},{"line_number":334,"context_line":"\t\t\t}"},{"line_number":335,"context_line":"\t\t\ttempFile.Save(fileName)"},{"line_number":336,"context_line":"\t\t\tif dataFile !\u003d \"\" || metaFile !\u003d \"\" {"},{"line_number":337,"context_line":"\t\t\t\tHashCleanupListDir(hashDir, f.reclaimAge)"},{"line_number":338,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":13,"id":"5a18252c_9fcb5653","line":335,"range":{"start_line":335,"start_character":3,"end_line":335,"end_character":11},"updated":"2016-04-18 08:15:22.000000000","message":"May be check errors thrown by tempFile.Save.","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":332,"context_line":"\t\t\tif _, err :\u003d hummingbird.CopyN(rc, sfr.Size, tempFile); err !\u003d nil {"},{"line_number":333,"context_line":"\t\t\t\treturn err"},{"line_number":334,"context_line":"\t\t\t}"},{"line_number":335,"context_line":"\t\t\ttempFile.Save(fileName)"},{"line_number":336,"context_line":"\t\t\tif dataFile !\u003d \"\" || metaFile !\u003d \"\" {"},{"line_number":337,"context_line":"\t\t\t\tHashCleanupListDir(hashDir, f.reclaimAge)"},{"line_number":338,"context_line":"\t\t\t}"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_ed3d60bc","line":335,"range":{"start_line":335,"start_character":3,"end_line":335,"end_character":11},"in_reply_to":"5a18252c_9fcb5653","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":14711,"name":"Nadeem Syed","email":"snadeem.hameed@gmail.com","username":"nadeem.syed"},"change_message_id":"777e2dae0545233db948862cb911e477307b1a78","unresolved":false,"context_lines":[{"line_number":357,"context_line":"\taddRoute(\"REPCONN\", \"/:device/:partition\", f.objRepConnHandler)"},{"line_number":358,"context_line":"}"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"// SwiftEngineFActoryConstructor creates a SwiftObjectFactory given the object server configs."},{"line_number":361,"context_line":"func SwiftEngineConstructor(config hummingbird.IniFile, flags *flag.FlagSet) (ObjectEngine, error) { // I\u0027m so sorry"},{"line_number":362,"context_line":"\tdriveRoot :\u003d config.GetDefault(\"app:object-server\", \"devices\", \"/srv/node\")"},{"line_number":363,"context_line":"\treserve :\u003d config.GetInt(\"app:object-server\", \"fallocate_reserve\", 0)"}],"source_content_type":"text/x-go","patch_set":13,"id":"5a18252c_b5dc73e5","line":360,"range":{"start_line":360,"start_character":3,"end_line":360,"end_character":32},"updated":"2016-04-18 08:15:22.000000000","message":"typo?","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"},{"author":{"_account_id":2828,"name":"Michael Barton","email":"mike@weirdlooking.com","username":"redbo"},"change_message_id":"cfc766b93ea88f5c7424fe2e422e2e8ef920c7ff","unresolved":false,"context_lines":[{"line_number":357,"context_line":"\taddRoute(\"REPCONN\", \"/:device/:partition\", f.objRepConnHandler)"},{"line_number":358,"context_line":"}"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"// SwiftEngineFActoryConstructor creates a SwiftObjectFactory given the object server configs."},{"line_number":361,"context_line":"func SwiftEngineConstructor(config hummingbird.IniFile, flags *flag.FlagSet) (ObjectEngine, error) { // I\u0027m so sorry"},{"line_number":362,"context_line":"\tdriveRoot :\u003d config.GetDefault(\"app:object-server\", \"devices\", \"/srv/node\")"},{"line_number":363,"context_line":"\treserve :\u003d config.GetInt(\"app:object-server\", \"fallocate_reserve\", 0)"}],"source_content_type":"text/x-go","patch_set":13,"id":"1a122d0e_ed3600e6","line":360,"range":{"start_line":360,"start_character":3,"end_line":360,"end_character":32},"in_reply_to":"5a18252c_b5dc73e5","updated":"2016-04-19 03:08:47.000000000","message":"Done","commit_id":"bdb5d092d8c2fc388b53d42e9d43f196ad57e190"}]}
