Browse Source

fix bug: upload a file which already existed return a wrong file size.

pull/38/head
yanyiwu 10 years ago
parent
commit
5a40f539f2
  1. 1
      go/storage/needle.go
  2. 12
      go/storage/store.go
  3. 8
      go/storage/volume.go

1
go/storage/needle.go

@ -25,6 +25,7 @@ const (
) )
/* /*
* A Needle means a uploaded and stored file.
* Needle file size is limited to 4GB for now. * Needle file size is limited to 4GB for now.
*/ */
type Needle struct { type Needle struct {

12
go/storage/store.go

@ -33,6 +33,10 @@ type MasterNodes struct {
lastNode int lastNode int
} }
func (mn *MasterNodes) String() string {
return fmt.Sprintf("nodes:%v, lastNode:%d", mn.nodes, mn.lastNode)
}
func NewMasterNodes(bootstrapNode string) (mn *MasterNodes) { func NewMasterNodes(bootstrapNode string) (mn *MasterNodes) {
mn = &MasterNodes{nodes: []string{bootstrapNode}, lastNode: -1} mn = &MasterNodes{nodes: []string{bootstrapNode}, lastNode: -1}
return return
@ -65,6 +69,9 @@ func (mn *MasterNodes) findMaster() (string, error) {
return mn.nodes[mn.lastNode], nil return mn.nodes[mn.lastNode], nil
} }
/*
* A VolumeServer contains one Store
*/
type Store struct { type Store struct {
Port int Port int
Ip string Ip string
@ -77,6 +84,11 @@ type Store struct {
masterNodes *MasterNodes masterNodes *MasterNodes
} }
func (s *Store) String() (str string) {
str = fmt.Sprintf("Ip:%s, Port:%d, PublicUrl:%s, dataCenter:%s, rack:%s, connected:%v, volumeSizeLimit:%d, masterNodes:%s", s.Ip, s.Port, s.PublicUrl, s.dataCenter, s.rack, s.connected, s.volumeSizeLimit, s.masterNodes)
return
}
func NewStore(port int, ip, publicUrl string, dirnames []string, maxVolumeCounts []int) (s *Store) { func NewStore(port int, ip, publicUrl string, dirnames []string, maxVolumeCounts []int) (s *Store) {
s = &Store{Port: port, Ip: ip, PublicUrl: publicUrl} s = &Store{Port: port, Ip: ip, PublicUrl: publicUrl}
s.Locations = make([]*DiskLocation, 0) s.Locations = make([]*DiskLocation, 0)

8
go/storage/volume.go

@ -33,6 +33,10 @@ func NewVolume(dirname string, collection string, id VolumeId, replicaPlacement
e = v.load(true, true) e = v.load(true, true)
return return
} }
func (v *Volume) String() string {
return fmt.Sprintf("Id:%v, dir:%s, Collection:%s, dataFile:%v, nm:%v, readOnly:%v", v.Id, v.dir, v.Collection, v.dataFile, v.nm, v.readOnly)
}
func loadVolumeWithoutIndex(dirname string, collection string, id VolumeId) (v *Volume, e error) { func loadVolumeWithoutIndex(dirname string, collection string, id VolumeId) (v *Volume, e error) {
v = &Volume{dir: dirname, Collection: collection, Id: id} v = &Volume{dir: dirname, Collection: collection, Id: id}
v.SuperBlock = SuperBlock{} v.SuperBlock = SuperBlock{}
@ -135,7 +139,7 @@ func (v *Volume) isFileUnchanged(n *Needle) bool {
oldNeedle := new(Needle) oldNeedle := new(Needle)
oldNeedle.Read(v.dataFile, int64(nv.Offset)*NeedlePaddingSize, nv.Size, v.Version()) oldNeedle.Read(v.dataFile, int64(nv.Offset)*NeedlePaddingSize, nv.Size, v.Version())
if oldNeedle.Checksum == n.Checksum && bytes.Equal(oldNeedle.Data, n.Data) { if oldNeedle.Checksum == n.Checksum && bytes.Equal(oldNeedle.Data, n.Data) {
n.Size = oldNeedle.Size
n.DataSize = oldNeedle.DataSize
return true return true
} }
} }
@ -165,7 +169,7 @@ func (v *Volume) write(n *Needle) (size uint32, err error) {
v.accessLock.Lock() v.accessLock.Lock()
defer v.accessLock.Unlock() defer v.accessLock.Unlock()
if v.isFileUnchanged(n) { if v.isFileUnchanged(n) {
size = n.Size
size = n.DataSize
glog.V(4).Infof("needle is unchanged!") glog.V(4).Infof("needle is unchanged!")
return return
} }

Loading…
Cancel
Save