You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							59 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							59 lines
						
					
					
						
							2.0 KiB
						
					
					
				| package command | |
| 
 | |
| import ( | |
| 	"github.com/seaweedfs/seaweedfs/weed/glog" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| 	"github.com/seaweedfs/seaweedfs/weed/util" | |
| ) | |
| 
 | |
| func init() { | |
| 	cmdCompact.Run = runCompact // break init cycle | |
| } | |
| 
 | |
| var cmdCompact = &Command{ | |
| 	UsageLine: "compact -dir=/tmp -volumeId=234", | |
| 	Short:     "run weed tool compact on volume file", | |
| 	Long: `Force an compaction to remove deleted files from volume files. | |
|   The compacted .dat file is stored as .cpd file. | |
|   The compacted .idx file is stored as .cpx file. | |
|  | |
|   For method=0, it compacts based on the .dat file, works if .idx file is corrupted. | |
|   For method=1, it compacts based on the .idx file, works if deletion happened but not written to .dat files. | |
|  | |
|   `, | |
| } | |
| 
 | |
| var ( | |
| 	compactVolumePath        = cmdCompact.Flag.String("dir", ".", "data directory to store files") | |
| 	compactVolumeCollection  = cmdCompact.Flag.String("collection", "", "volume collection name") | |
| 	compactVolumeId          = cmdCompact.Flag.Int("volumeId", -1, "a volume id. The volume should already exist in the dir.") | |
| 	compactMethod            = cmdCompact.Flag.Int("method", 0, "option to choose which compact method. use 0 (default) or 1.") | |
| 	compactVolumePreallocate = cmdCompact.Flag.Int64("preallocateMB", 0, "preallocate volume disk space") | |
| ) | |
| 
 | |
| func runCompact(cmd *Command, args []string) bool { | |
| 
 | |
| 	if *compactVolumeId == -1 { | |
| 		return false | |
| 	} | |
| 
 | |
| 	preallocate := *compactVolumePreallocate * (1 << 20) | |
| 
 | |
| 	vid := needle.VolumeId(*compactVolumeId) | |
| 	v, err := storage.NewVolume(util.ResolvePath(*compactVolumePath), util.ResolvePath(*compactVolumePath), *compactVolumeCollection, vid, storage.NeedleMapInMemory, nil, nil, preallocate, needle.GetCurrentVersion(), 0, 0) | |
| 	if err != nil { | |
| 		glog.Fatalf("Load Volume [ERROR] %s\n", err) | |
| 	} | |
| 	if *compactMethod == 0 { | |
| 		if err = v.Compact(preallocate, 0); err != nil { | |
| 			glog.Fatalf("Compact Volume [ERROR] %s\n", err) | |
| 		} | |
| 	} else { | |
| 		if err = v.Compact2(preallocate, 0, nil); err != nil { | |
| 			glog.Fatalf("Compact Volume [ERROR] %s\n", err) | |
| 		} | |
| 	} | |
| 
 | |
| 	return true | |
| }
 |