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.
		
		
		
		
		
			
		
			
				
					
					
						
							105 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							105 lines
						
					
					
						
							2.9 KiB
						
					
					
				| package main | |
| 
 | |
| import ( | |
| 	"flag" | |
| 	"fmt" | |
| 	"os" | |
| 	"path" | |
| 	"strconv" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/glog" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/backend" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/super_block" | |
| 	util_http "github.com/seaweedfs/seaweedfs/weed/util/http" | |
| ) | |
| 
 | |
| var ( | |
| 	fixVolumePath       = flag.String("dir", "/tmp", "data directory to store files") | |
| 	fixVolumeCollection = flag.String("collection", "", "the volume collection name") | |
| 	fixVolumeId         = flag.Int("volumeId", -1, "a volume id. The volume should already exist in the dir. The volume index file should not exist.") | |
| 	targetReplica       = flag.String("replication", "", "If just empty, only print out current replication setting.") | |
| 	targetTTL           = flag.String("ttl", "", "If just empty, only print out current ttl setting.") | |
| ) | |
| 
 | |
| /* | |
| This is to change replication factor in .dat file header. Need to shut down the volume servers | |
| that has those volumes. | |
|  | |
| 1. fix the .dat file in place | |
| 	// just see the replication setting | |
| 	go run change_replication.go -volumeId=9 -dir=/Users/chrislu/Downloads | |
| 		Current Volume Replication: 000 | |
| 	// fix the replication setting | |
| 	go run change_replication.go -volumeId=9 -dir=/Users/chrislu/Downloads -replication 001 | |
| 		Current Volume Replication: 000 | |
| 		Changing to: 001 | |
| 		Done. | |
|  | |
| 2. copy the fixed .dat and related .idx files to some remote server | |
| 3. restart volume servers or start new volume servers. | |
| */ | |
| func main() { | |
| 	flag.Parse() | |
| 	util_http.NewGlobalHttpClient() | |
| 	 | |
| 	fileName := strconv.Itoa(*fixVolumeId) | |
| 	if *fixVolumeCollection != "" { | |
| 		fileName = *fixVolumeCollection + "_" + fileName | |
| 	} | |
| 	datFile, err := os.OpenFile(path.Join(*fixVolumePath, fileName+".dat"), os.O_RDWR, 0644) | |
| 	if err != nil { | |
| 		glog.Fatalf("Open Volume Data File [ERROR]: %v", err) | |
| 	} | |
| 	datBackend := backend.NewDiskFile(datFile) | |
| 	defer datBackend.Close() | |
| 
 | |
| 	superBlock, err := super_block.ReadSuperBlock(datBackend) | |
| 
 | |
| 	if err != nil { | |
| 		glog.Fatalf("cannot parse existing super block: %v", err) | |
| 	} | |
| 
 | |
| 	fmt.Printf("Current Volume Replication: %s\n", superBlock.ReplicaPlacement) | |
| 	fmt.Printf("Current Volume TTL: %s\n", superBlock.Ttl.String()) | |
| 
 | |
| 	hasChange := false | |
| 
 | |
| 	if *targetReplica != "" { | |
| 		replica, err := super_block.NewReplicaPlacementFromString(*targetReplica) | |
| 
 | |
| 		if err != nil { | |
| 			glog.Fatalf("cannot parse target replica %s: %v", *targetReplica, err) | |
| 		} | |
| 
 | |
| 		fmt.Printf("Changing replication to: %s\n", replica) | |
| 
 | |
| 		superBlock.ReplicaPlacement = replica | |
| 		hasChange = true | |
| 	} | |
| 
 | |
| 	if *targetTTL != "" { | |
| 		ttl, err := needle.ReadTTL(*targetTTL) | |
| 
 | |
| 		if err != nil { | |
| 			glog.Fatalf("cannot parse target ttl %s: %v", *targetTTL, err) | |
| 		} | |
| 
 | |
| 		fmt.Printf("Changing ttl to: %s\n", ttl) | |
| 
 | |
| 		superBlock.Ttl = ttl | |
| 		hasChange = true | |
| 	} | |
| 
 | |
| 	if hasChange { | |
| 
 | |
| 		header := superBlock.Bytes() | |
| 
 | |
| 		if n, e := datBackend.WriteAt(header, 0); n == 0 || e != nil { | |
| 			glog.Fatalf("cannot write super block: %v", e) | |
| 		} | |
| 
 | |
| 		fmt.Println("Change Applied.") | |
| 	} | |
| 
 | |
| }
 |