mirror of
				https://github.com/minio/minio.git
				synced 2025-10-29 15:55:00 -04:00 
			
		
		
		
	heal: Move CheckParts from single handler to streaming RPC (#20755)
CheckParts call can take time to verify 10k parts of a single object in a single drive. To avoid an internal dealine of one minute in the single handler RPC, this commit will switch to streaming RPC instead.
This commit is contained in:
		
							parent
							
								
									f246c9053f
								
							
						
					
					
						commit
						c1a95a70ac
					
				| @ -464,16 +464,20 @@ func (client *storageRESTClient) WriteAll(ctx context.Context, volume string, pa | ||||
| // CheckParts - stat all file parts. | ||||
| func (client *storageRESTClient) CheckParts(ctx context.Context, volume string, path string, fi FileInfo) (*CheckPartsResp, error) { | ||||
| 	var resp *CheckPartsResp | ||||
| 	resp, err := storageCheckPartsRPC.Call(ctx, client.gridConn, &CheckPartsHandlerParams{ | ||||
| 	st, err := storageCheckPartsRPC.Call(ctx, client.gridConn, &CheckPartsHandlerParams{ | ||||
| 		DiskID:   *client.diskID.Load(), | ||||
| 		Volume:   volume, | ||||
| 		FilePath: path, | ||||
| 		FI:       fi, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 		return nil, toStorageErr(err) | ||||
| 	} | ||||
| 	return resp, nil | ||||
| 	err = st.Results(func(r *CheckPartsResp) error { | ||||
| 		resp = r | ||||
| 		return nil | ||||
| 	}) | ||||
| 	return resp, toStorageErr(err) | ||||
| } | ||||
| 
 | ||||
| // RenameData - rename source path to destination path atomically, metadata and data file. | ||||
|  | ||||
| @ -56,7 +56,7 @@ type storageRESTServer struct { | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	storageCheckPartsRPC       = grid.NewSingleHandler[*CheckPartsHandlerParams, *CheckPartsResp](grid.HandlerCheckParts2, func() *CheckPartsHandlerParams { return &CheckPartsHandlerParams{} }, func() *CheckPartsResp { return &CheckPartsResp{} }) | ||||
| 	storageCheckPartsRPC       = grid.NewStream[*CheckPartsHandlerParams, grid.NoPayload, *CheckPartsResp](grid.HandlerCheckParts3, func() *CheckPartsHandlerParams { return &CheckPartsHandlerParams{} }, nil, func() *CheckPartsResp { return &CheckPartsResp{} }) | ||||
| 	storageDeleteFileRPC       = grid.NewSingleHandler[*DeleteFileHandlerParams, grid.NoPayload](grid.HandlerDeleteFile, func() *DeleteFileHandlerParams { return &DeleteFileHandlerParams{} }, grid.NewNoPayload).AllowCallRequestPool(true) | ||||
| 	storageDeleteVersionRPC    = grid.NewSingleHandler[*DeleteVersionHandlerParams, grid.NoPayload](grid.HandlerDeleteVersion, func() *DeleteVersionHandlerParams { return &DeleteVersionHandlerParams{} }, grid.NewNoPayload) | ||||
| 	storageDiskInfoRPC         = grid.NewSingleHandler[*DiskInfoOptions, *DiskInfo](grid.HandlerDiskInfo, func() *DiskInfoOptions { return &DiskInfoOptions{} }, func() *DiskInfo { return &DiskInfo{} }).WithSharedResponse().AllowCallRequestPool(true) | ||||
| @ -456,16 +456,20 @@ func (s *storageRESTServer) UpdateMetadataHandler(p *MetadataHandlerParams) (gri | ||||
| 	return grid.NewNPErr(s.getStorage().UpdateMetadata(context.Background(), volume, filePath, p.FI, p.UpdateOpts)) | ||||
| } | ||||
| 
 | ||||
| // CheckPartsHandler - check if a file metadata exists. | ||||
| func (s *storageRESTServer) CheckPartsHandler(p *CheckPartsHandlerParams) (*CheckPartsResp, *grid.RemoteErr) { | ||||
| // CheckPartsHandler - check if a file parts exists. | ||||
| func (s *storageRESTServer) CheckPartsHandler(ctx context.Context, p *CheckPartsHandlerParams, out chan<- *CheckPartsResp) *grid.RemoteErr { | ||||
| 	if !s.checkID(p.DiskID) { | ||||
| 		return nil, grid.NewRemoteErr(errDiskNotFound) | ||||
| 		return grid.NewRemoteErr(errDiskNotFound) | ||||
| 	} | ||||
| 	volume := p.Volume | ||||
| 	filePath := p.FilePath | ||||
| 
 | ||||
| 	resp, err := s.getStorage().CheckParts(context.Background(), volume, filePath, p.FI) | ||||
| 	return resp, grid.NewRemoteErr(err) | ||||
| 	resp, err := s.getStorage().CheckParts(ctx, volume, filePath, p.FI) | ||||
| 	if err != nil { | ||||
| 		return grid.NewRemoteErr(err) | ||||
| 	} | ||||
| 	out <- resp | ||||
| 	return grid.NewRemoteErr(err) | ||||
| } | ||||
| 
 | ||||
| func (s *storageRESTServer) WriteAllHandler(p *WriteAllHandlerParams) (grid.NoPayload, *grid.RemoteErr) { | ||||
| @ -1382,7 +1386,7 @@ func registerStorageRESTHandlers(router *mux.Router, endpointServerPools Endpoin | ||||
| 			logger.FatalIf(storageRenameDataRPC.Register(gm, server.RenameDataHandler, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageRenameDataInlineRPC.Register(gm, server.RenameDataInlineHandler, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageDeleteFileRPC.Register(gm, server.DeleteFileHandler, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageCheckPartsRPC.Register(gm, server.CheckPartsHandler, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageCheckPartsRPC.RegisterNoInput(gm, server.CheckPartsHandler, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageReadVersionRPC.Register(gm, server.ReadVersionHandlerWS, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageWriteMetadataRPC.Register(gm, server.WriteMetadataHandler, endpoint.Path), "unable to register handler") | ||||
| 			logger.FatalIf(storageUpdateMetadataRPC.Register(gm, server.UpdateMetadataHandler, endpoint.Path), "unable to register handler") | ||||
|  | ||||
| @ -115,6 +115,7 @@ const ( | ||||
| 	HandlerCheckParts2 | ||||
| 	HandlerRenamePart | ||||
| 	HandlerClearUploadID | ||||
| 	HandlerCheckParts3 | ||||
| 
 | ||||
| 	// Add more above here ^^^ | ||||
| 	// If all handlers are used, the type of Handler can be changed. | ||||
| @ -196,6 +197,7 @@ var handlerPrefixes = [handlerLast]string{ | ||||
| 	HandlerRenameDataInline:            storagePrefix, | ||||
| 	HandlerRenameData2:                 storagePrefix, | ||||
| 	HandlerCheckParts2:                 storagePrefix, | ||||
| 	HandlerCheckParts3:                 storagePrefix, | ||||
| 	HandlerRenamePart:                  storagePrefix, | ||||
| 	HandlerClearUploadID:               peerPrefix, | ||||
| } | ||||
|  | ||||
| @ -85,14 +85,15 @@ func _() { | ||||
| 	_ = x[HandlerCheckParts2-74] | ||||
| 	_ = x[HandlerRenamePart-75] | ||||
| 	_ = x[HandlerClearUploadID-76] | ||||
| 	_ = x[handlerTest-77] | ||||
| 	_ = x[handlerTest2-78] | ||||
| 	_ = x[handlerLast-79] | ||||
| 	_ = x[HandlerCheckParts3-77] | ||||
| 	_ = x[handlerTest-78] | ||||
| 	_ = x[handlerTest2-79] | ||||
| 	_ = x[handlerLast-80] | ||||
| } | ||||
| 
 | ||||
| const _HandlerID_name = "handlerInvalidLockLockLockRLockLockUnlockLockRUnlockLockRefreshLockForceUnlockWalkDirStatVolDiskInfoNSScannerReadXLReadVersionDeleteFileDeleteVersionUpdateMetadataWriteMetadataCheckPartsRenameDataRenameFileReadAllServerVerifyTraceListenDeleteBucketMetadataLoadBucketMetadataReloadSiteReplicationConfigReloadPoolMetaStopRebalanceLoadRebalanceMetaLoadTransitionTierConfigDeletePolicyLoadPolicyLoadPolicyMappingDeleteServiceAccountLoadServiceAccountDeleteUserLoadUserLoadGroupHealBucketMakeBucketHeadBucketDeleteBucketGetMetricsGetResourceMetricsGetMemInfoGetProcInfoGetOSInfoGetPartitionsGetNetInfoGetCPUsServerInfoGetSysConfigGetSysServicesGetSysErrorsGetAllBucketStatsGetBucketStatsGetSRMetricsGetPeerMetricsGetMetacacheListingUpdateMetacacheListingGetPeerBucketMetricsStorageInfoConsoleLogListDirGetLocksBackgroundHealStatusGetLastDayTierStatsSignalServiceGetBandwidthWriteAllListBucketsRenameDataInlineRenameData2CheckParts2RenamePartClearUploadIDhandlerTesthandlerTest2handlerLast" | ||||
| const _HandlerID_name = "handlerInvalidLockLockLockRLockLockUnlockLockRUnlockLockRefreshLockForceUnlockWalkDirStatVolDiskInfoNSScannerReadXLReadVersionDeleteFileDeleteVersionUpdateMetadataWriteMetadataCheckPartsRenameDataRenameFileReadAllServerVerifyTraceListenDeleteBucketMetadataLoadBucketMetadataReloadSiteReplicationConfigReloadPoolMetaStopRebalanceLoadRebalanceMetaLoadTransitionTierConfigDeletePolicyLoadPolicyLoadPolicyMappingDeleteServiceAccountLoadServiceAccountDeleteUserLoadUserLoadGroupHealBucketMakeBucketHeadBucketDeleteBucketGetMetricsGetResourceMetricsGetMemInfoGetProcInfoGetOSInfoGetPartitionsGetNetInfoGetCPUsServerInfoGetSysConfigGetSysServicesGetSysErrorsGetAllBucketStatsGetBucketStatsGetSRMetricsGetPeerMetricsGetMetacacheListingUpdateMetacacheListingGetPeerBucketMetricsStorageInfoConsoleLogListDirGetLocksBackgroundHealStatusGetLastDayTierStatsSignalServiceGetBandwidthWriteAllListBucketsRenameDataInlineRenameData2CheckParts2RenamePartClearUploadIDCheckParts3handlerTesthandlerTest2handlerLast" | ||||
| 
 | ||||
| var _HandlerID_index = [...]uint16{0, 14, 22, 31, 41, 52, 63, 78, 85, 92, 100, 109, 115, 126, 136, 149, 163, 176, 186, 196, 206, 213, 225, 230, 236, 256, 274, 301, 315, 328, 345, 369, 381, 391, 408, 428, 446, 456, 464, 473, 483, 493, 503, 515, 525, 543, 553, 564, 573, 586, 596, 603, 613, 625, 639, 651, 668, 682, 694, 708, 727, 749, 769, 780, 790, 797, 805, 825, 844, 857, 869, 877, 888, 904, 915, 926, 936, 949, 960, 972, 983} | ||||
| var _HandlerID_index = [...]uint16{0, 14, 22, 31, 41, 52, 63, 78, 85, 92, 100, 109, 115, 126, 136, 149, 163, 176, 186, 196, 206, 213, 225, 230, 236, 256, 274, 301, 315, 328, 345, 369, 381, 391, 408, 428, 446, 456, 464, 473, 483, 493, 503, 515, 525, 543, 553, 564, 573, 586, 596, 603, 613, 625, 639, 651, 668, 682, 694, 708, 727, 749, 769, 780, 790, 797, 805, 825, 844, 857, 869, 877, 888, 904, 915, 926, 936, 949, 960, 971, 983, 994} | ||||
| 
 | ||||
| func (i HandlerID) String() string { | ||||
| 	if i >= HandlerID(len(_HandlerID_index)-1) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user