aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-10-08 18:33:06 -0700
committerChris Lu <chris.lu@gmail.com>2020-10-08 18:33:06 -0700
commitbd8b9b0c2e40db186505ccce231f771bbf90e829 (patch)
treec8a82d0e953b74eab698ee72840c059bb29c9323
parent78859e35fcd20c0aa8d8f60887c5b52c8cce84b5 (diff)
downloadseaweedfs-bd8b9b0c2e40db186505ccce231f771bbf90e829.tar.xz
seaweedfs-bd8b9b0c2e40db186505ccce231f771bbf90e829.zip
some changes to prepare fix after failed reads
-rw-r--r--weed/server/volume_server_handlers_read.go4
-rw-r--r--weed/storage/store_ec.go4
-rw-r--r--weed/storage/volume_read_write.go3
3 files changed, 8 insertions, 3 deletions
diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go
index bb04678d6..6f146cb55 100644
--- a/weed/server/volume_server_handlers_read.go
+++ b/weed/server/volume_server_handlers_read.go
@@ -93,6 +93,10 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request)
} else if hasEcVolume {
count, err = vs.store.ReadEcShardNeedle(volumeId, n)
}
+ if err != nil && err != storage.ErrorDeleted && r.FormValue("type") != "replicate" && hasVolume {
+ glog.V(4).Infoln("read needle: %v", err)
+ // start to fix it from other replicas, if not deleted and hasVolume and is not a replicated request
+ }
// glog.V(4).Infoln("read bytes", count, "error", err)
if err != nil || count < 0 {
glog.V(3).Infof("read %s isNormalVolume %v error: %v", r.URL.Path, hasVolume, err)
diff --git a/weed/storage/store_ec.go b/weed/storage/store_ec.go
index bd7bdacbd..853757ce3 100644
--- a/weed/storage/store_ec.go
+++ b/weed/storage/store_ec.go
@@ -128,7 +128,7 @@ func (s *Store) ReadEcShardNeedle(vid needle.VolumeId, n *needle.Needle) (int, e
return 0, fmt.Errorf("locate in local ec volume: %v", err)
}
if size.IsDeleted() {
- return 0, fmt.Errorf("entry %s is deleted", n.Id)
+ return 0, ErrorDeleted
}
glog.V(3).Infof("read ec volume %d offset %d size %d intervals:%+v", vid, offset.ToAcutalOffset(), size, intervals)
@@ -141,7 +141,7 @@ func (s *Store) ReadEcShardNeedle(vid needle.VolumeId, n *needle.Needle) (int, e
return 0, fmt.Errorf("ReadEcShardIntervals: %v", err)
}
if isDeleted {
- return 0, fmt.Errorf("ec entry %s is deleted", n.Id)
+ return 0, ErrorDeleted
}
err = n.ReadBytes(bytes, offset.ToAcutalOffset(), size, localEcVolume.Version)
diff --git a/weed/storage/volume_read_write.go b/weed/storage/volume_read_write.go
index e11bde2cb..10c87c8ea 100644
--- a/weed/storage/volume_read_write.go
+++ b/weed/storage/volume_read_write.go
@@ -16,6 +16,7 @@ import (
)
var ErrorNotFound = errors.New("not found")
+var ErrorDeleted = errors.New("already deleted")
// isFileUnchanged checks whether this needle to write is same as last one.
// It requires serialized access in the same volume.
@@ -266,7 +267,7 @@ func (v *Volume) readNeedle(n *needle.Needle, readOption *ReadOption) (int, erro
glog.V(3).Infof("reading deleted %s", n.String())
readSize = -readSize
} else {
- return -1, errors.New("already deleted")
+ return -1, ErrorDeleted
}
}
if readSize == 0 {