mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
correct crc
correct volume id lookup
This commit is contained in:
parent
ca8c8a56b7
commit
ac5f227aae
|
@ -47,7 +47,7 @@ func dirLookupHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
volumeId, _ := storage.NewVolumeId(vid)
|
volumeId, _ := storage.NewVolumeId(vid)
|
||||||
machines := topo.Lookup(volumeId)
|
machines := topo.Lookup(volumeId)
|
||||||
if machines == nil {
|
if machines != nil {
|
||||||
ret := []map[string]string{}
|
ret := []map[string]string{}
|
||||||
for _, dn := range *machines {
|
for _, dn := range *machines {
|
||||||
ret = append(ret, map[string]string{"url": dn.Ip + strconv.Itoa(dn.Port), "publicUrl": dn.PublicUrl})
|
ret = append(ret, map[string]string{"url": dn.Ip + strconv.Itoa(dn.Port), "publicUrl": dn.PublicUrl})
|
||||||
|
|
|
@ -42,7 +42,7 @@ func assign(count int) (*AssignResult, error) {
|
||||||
values := make(url.Values)
|
values := make(url.Values)
|
||||||
values.Add("count", strconv.Itoa(count))
|
values.Add("count", strconv.Itoa(count))
|
||||||
values.Add("replication", *uploadReplication)
|
values.Add("replication", *uploadReplication)
|
||||||
jsonBlob, err := util.Post("http://"+*server+"/dir/assign2", values)
|
jsonBlob, err := util.Post("http://"+*server+"/dir/assign", values)
|
||||||
if *IsDebug {
|
if *IsDebug {
|
||||||
fmt.Println("debug", *IsDebug, "assign result :", string(jsonBlob))
|
fmt.Println("debug", *IsDebug, "assign result :", string(jsonBlob))
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,7 @@ func GetHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
http.Redirect(w, r, "http://"+lookupResult.Locations[0].PublicUrl+r.URL.Path, http.StatusMovedPermanently)
|
http.Redirect(w, r, "http://"+lookupResult.Locations[0].PublicUrl+r.URL.Path, http.StatusMovedPermanently)
|
||||||
} else {
|
} else {
|
||||||
|
log.Println("lookup error:", err)
|
||||||
w.WriteHeader(http.StatusNotFound)
|
w.WriteHeader(http.StatusNotFound)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -89,6 +90,7 @@ func GetHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Println("read bytes", count, "error", e)
|
log.Println("read bytes", count, "error", e)
|
||||||
}
|
}
|
||||||
if e != nil || count <= 0 {
|
if e != nil || count <= 0 {
|
||||||
|
log.Println("read error:", e)
|
||||||
w.WriteHeader(http.StatusNotFound)
|
w.WriteHeader(http.StatusNotFound)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
21
weed-fs/src/pkg/storage/crc.go
Normal file
21
weed-fs/src/pkg/storage/crc.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"hash/crc32"
|
||||||
|
)
|
||||||
|
|
||||||
|
var table = crc32.MakeTable(crc32.Castagnoli)
|
||||||
|
|
||||||
|
type CRC uint32
|
||||||
|
|
||||||
|
func NewCRC(b []byte) CRC {
|
||||||
|
return CRC(0).Update(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CRC) Update(b []byte) CRC {
|
||||||
|
return CRC(crc32.Update(uint32(c), table, b))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CRC) Value() uint32 {
|
||||||
|
return uint32(c>>15|c<<17) + 0xa282ead8
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
@ -18,7 +19,7 @@ type Needle struct {
|
||||||
Id uint64 "needle id"
|
Id uint64 "needle id"
|
||||||
Size uint32 "Data size"
|
Size uint32 "Data size"
|
||||||
Data []byte "The actual file data"
|
Data []byte "The actual file data"
|
||||||
Checksum int32 "CRC32 to check integrity"
|
Checksum CRC "CRC32 to check integrity"
|
||||||
Padding []byte "Aligned to 8 bytes"
|
Padding []byte "Aligned to 8 bytes"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ func NewNeedle(r *http.Request) (n *Needle, fname string, e error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
n.Data = data
|
n.Data = data
|
||||||
|
n.Checksum = NewCRC(data)
|
||||||
|
|
||||||
commaSep := strings.LastIndex(r.URL.Path, ",")
|
commaSep := strings.LastIndex(r.URL.Path, ",")
|
||||||
dotSep := strings.LastIndex(r.URL.Path, ".")
|
dotSep := strings.LastIndex(r.URL.Path, ".")
|
||||||
|
@ -86,7 +88,8 @@ func (n *Needle) Append(w io.Writer) uint32 {
|
||||||
w.Write(header)
|
w.Write(header)
|
||||||
w.Write(n.Data)
|
w.Write(n.Data)
|
||||||
rest := 8 - ((n.Size + 16 + 4) % 8)
|
rest := 8 - ((n.Size + 16 + 4) % 8)
|
||||||
util.Uint32toBytes(header[0:4], uint32(n.Checksum))
|
util.Uint32toBytes(header[0:4], n.Checksum.Value())
|
||||||
|
println("writing checksum", n.Checksum.Value(), "=>", util.BytesToUint32(header[0:4]), "for", n.Id)
|
||||||
w.Write(header[0 : rest+4])
|
w.Write(header[0 : rest+4])
|
||||||
return n.Size
|
return n.Size
|
||||||
}
|
}
|
||||||
|
@ -97,7 +100,10 @@ func (n *Needle) Read(r io.Reader, size uint32) (int, error) {
|
||||||
n.Id = util.BytesToUint64(bytes[4:12])
|
n.Id = util.BytesToUint64(bytes[4:12])
|
||||||
n.Size = util.BytesToUint32(bytes[12:16])
|
n.Size = util.BytesToUint32(bytes[12:16])
|
||||||
n.Data = bytes[16 : 16+size]
|
n.Data = bytes[16 : 16+size]
|
||||||
n.Checksum = int32(util.BytesToUint32(bytes[16+size : 16+size+4]))
|
checksum := util.BytesToUint32(bytes[16+size : 16+size+4])
|
||||||
|
if checksum != NewCRC(n.Data).Value() {
|
||||||
|
return 0, errors.New("CRC error! Data On Disk Corrupted!")
|
||||||
|
}
|
||||||
return ret, e
|
return ret, e
|
||||||
}
|
}
|
||||||
func ReadNeedle(r *os.File) (*Needle, uint32) {
|
func ReadNeedle(r *os.File) (*Needle, uint32) {
|
||||||
|
|
Loading…
Reference in a new issue