From df40908e578fdf0d41044a5d521c961c95b0ab55 Mon Sep 17 00:00:00 2001 From: Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com> Date: Fri, 29 Mar 2024 04:17:59 +0500 Subject: [PATCH] fix panic 5435 (#5436) --- weed/server/master_grpc_server_assign.go | 3 +++ weed/server/master_server_handlers.go | 4 +++- weed/topology/volume_layout.go | 2 +- weed/topology/volume_location_list.go | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/weed/server/master_grpc_server_assign.go b/weed/server/master_grpc_server_assign.go index 2aede2d50..5839a6a73 100644 --- a/weed/server/master_grpc_server_assign.go +++ b/weed/server/master_grpc_server_assign.go @@ -97,6 +97,9 @@ func (ms *MasterServer) Assign(ctx context.Context, req *master_pb.AssignRequest continue } dn := dnList.Head() + if dn == nil { + continue + } var replicas []*master_pb.Location for _, r := range dnList.Rest() { replicas = append(replicas, &master_pb.Location{ diff --git a/weed/server/master_server_handlers.go b/weed/server/master_server_handlers.go index c5e059f21..9dc6351a4 100644 --- a/weed/server/master_server_handlers.go +++ b/weed/server/master_server_handlers.go @@ -149,7 +149,9 @@ func (ms *MasterServer) dirAssignHandler(w http.ResponseWriter, r *http.Request) } else { ms.maybeAddJwtAuthorization(w, fid, true) dn := dnList.Head() - + if dn == nil { + continue + } writeJsonQuiet(w, r, http.StatusOK, operation.AssignResult{Fid: fid, Url: dn.Url(), PublicUrl: dn.PublicUrl, Count: count}) return } diff --git a/weed/topology/volume_layout.go b/weed/topology/volume_layout.go index 278978292..516d6a947 100644 --- a/weed/topology/volume_layout.go +++ b/weed/topology/volume_layout.go @@ -301,7 +301,7 @@ func (vl *VolumeLayout) PickForWrite(count uint64, option *VolumeGrowOption) (vi if float64(info.Size) > float64(vl.volumeSizeLimit)*option.Threshold() { shouldGrow = true } - return vid, count, locationList, shouldGrow, nil + return vid, count, locationList.Copy(), shouldGrow, nil } return 0, 0, nil, shouldGrow, errors.New("Strangely vid " + vid.String() + " is on no machine!") } diff --git a/weed/topology/volume_location_list.go b/weed/topology/volume_location_list.go index c26f77104..127ad67eb 100644 --- a/weed/topology/volume_location_list.go +++ b/weed/topology/volume_location_list.go @@ -28,6 +28,9 @@ func (dnll *VolumeLocationList) Copy() *VolumeLocationList { func (dnll *VolumeLocationList) Head() *DataNode { //mark first node as master volume + if dnll.Length() == 0 { + return nil + } return dnll.list[0] }