aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--weed/storage/disk_location.go28
-rw-r--r--weed/storage/volume.go15
-rw-r--r--weed/storage/volume_loading.go2
3 files changed, 21 insertions, 24 deletions
diff --git a/weed/storage/disk_location.go b/weed/storage/disk_location.go
index 853facc49..c309b3f92 100644
--- a/weed/storage/disk_location.go
+++ b/weed/storage/disk_location.go
@@ -2,7 +2,6 @@ package storage
import (
"fmt"
- "github.com/chrislusf/seaweedfs/weed/stats"
"io/ioutil"
"os"
"path/filepath"
@@ -11,6 +10,7 @@ import (
"time"
"github.com/chrislusf/seaweedfs/weed/glog"
+ "github.com/chrislusf/seaweedfs/weed/stats"
"github.com/chrislusf/seaweedfs/weed/storage/erasure_coding"
"github.com/chrislusf/seaweedfs/weed/storage/needle"
)
@@ -25,6 +25,8 @@ type DiskLocation struct {
// erasure coding
ecVolumes map[needle.VolumeId]*erasure_coding.EcVolume
ecVolumesLock sync.RWMutex
+
+ isDiskSpaceLow bool
}
func NewDiskLocation(dir string, maxVolumeCount int, minFreeSpacePercent float32) *DiskLocation {
@@ -79,9 +81,8 @@ func (l *DiskLocation) loadExistingVolume(fileInfo os.FileInfo, needleMapKind Ne
return false
}
- l.volumesLock.Lock()
- l.volumes[vid] = v
- l.volumesLock.Unlock()
+ l.SetVolume(vid, v)
+
size, _, _ := v.FileStat()
glog.V(0).Infof("data file %s, replicaPlacement=%s v=%d size=%d ttl=%s",
l.Directory+"/"+name, v.ReplicaPlacement, v.Version(), size, v.Ttl.String())
@@ -237,6 +238,7 @@ func (l *DiskLocation) SetVolume(vid needle.VolumeId, volume *Volume) {
defer l.volumesLock.Unlock()
l.volumes[vid] = volume
+ volume.location = l
}
func (l *DiskLocation) FindVolume(vid needle.VolumeId) (*Volume, bool) {
@@ -300,19 +302,19 @@ func (l *DiskLocation) UnUsedSpace(volumeSizeLimit uint64) (unUsedSpace uint64)
}
func (l *DiskLocation) CheckDiskSpace() {
- lastStat := false
- t := time.NewTicker(time.Minute)
- for _ = range t.C {
+ for {
if dir, e := filepath.Abs(l.Directory); e == nil {
s := stats.NewDiskStatus(dir)
- if (s.PercentFree < l.MinFreeSpacePercent) != lastStat {
- lastStat = !lastStat
- for _, v := range l.volumes {
- v.SetLowDiskSpace(lastStat)
- }
-
+ if (s.PercentFree < l.MinFreeSpacePercent) != l.isDiskSpaceLow {
+ l.isDiskSpaceLow = !l.isDiskSpaceLow
+ }
+ if l.isDiskSpaceLow {
+ glog.V(0).Infof("dir %s freePercent %.2f%% < min %.2f%%, isLowDiskSpace: %v", dir, s.PercentFree, l.MinFreeSpacePercent, l.isDiskSpaceLow)
+ } else {
+ glog.V(4).Infof("dir %s freePercent %.2f%% < min %.2f%%, isLowDiskSpace: %v", dir, s.PercentFree, l.MinFreeSpacePercent, l.isDiskSpaceLow)
}
}
+ time.Sleep(time.Minute)
}
}
diff --git a/weed/storage/volume.go b/weed/storage/volume.go
index e10f5afaa..73fdb417d 100644
--- a/weed/storage/volume.go
+++ b/weed/storage/volume.go
@@ -27,7 +27,6 @@ type Volume struct {
needleMapKind NeedleMapType
noWriteOrDelete bool // if readonly, either noWriteOrDelete or noWriteCanDelete
noWriteCanDelete bool // if readonly, either noWriteOrDelete or noWriteCanDelete
- lowDiskSpace bool
hasRemoteFile bool // if the volume has a remote file
MemoryMapMaxSizeMb uint32
@@ -35,8 +34,8 @@ type Volume struct {
dataFileAccessLock sync.RWMutex
asyncRequestsChan chan *needle.AsyncRequest
- lastModifiedTsSeconds uint64 //unix time in seconds
- lastAppendAtNs uint64 //unix time in nanoseconds
+ lastModifiedTsSeconds uint64 // unix time in seconds
+ lastAppendAtNs uint64 // unix time in nanoseconds
lastCompactIndexOffset uint64
lastCompactRevision uint16
@@ -44,11 +43,7 @@ type Volume struct {
isCompacting bool
volumeInfo *volume_server_pb.VolumeInfo
-}
-
-func (v *Volume) SetLowDiskSpace(lowDiskSpace bool) {
- glog.V(0).Infof("SetLowDiskSpace id %d value %t", v.Id, lowDiskSpace)
- v.lowDiskSpace = lowDiskSpace
+ location *DiskLocation
}
func NewVolume(dirname string, collection string, id needle.VolumeId, needleMapKind NeedleMapType, replicaPlacement *super_block.ReplicaPlacement, ttl *needle.TTL, preallocate int64, memoryMapMaxSizeMb uint32) (v *Volume, e error) {
@@ -182,7 +177,7 @@ func (v *Volume) NeedToReplicate() bool {
// or when volumeSizeLimit is 0 when server just starts
func (v *Volume) expired(volumeSizeLimit uint64) bool {
if volumeSizeLimit == 0 {
- //skip if we don't know size limit
+ // skip if we don't know size limit
return false
}
if v.ContentSize() == 0 {
@@ -250,5 +245,5 @@ func (v *Volume) RemoteStorageNameKey() (storageName, storageKey string) {
}
func (v *Volume) IsReadOnly() bool {
- return v.noWriteOrDelete || v.noWriteCanDelete || v.lowDiskSpace
+ return v.noWriteOrDelete || v.noWriteCanDelete || v.location.isDiskSpaceLow
}
diff --git a/weed/storage/volume_loading.go b/weed/storage/volume_loading.go
index b0b17af75..73e2de02b 100644
--- a/weed/storage/volume_loading.go
+++ b/weed/storage/volume_loading.go
@@ -94,7 +94,7 @@ func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind
glog.V(0).Infof("volumeDataIntegrityChecking failed %v", err)
}
- if v.IsReadOnly() {
+ if v.noWriteOrDelete || v.noWriteCanDelete {
if v.nm, err = NewSortedFileNeedleMap(fileName, indexFile); err != nil {
glog.V(0).Infof("loading sorted db %s error: %v", fileName+".sdx", err)
}