| 
									
										
										
										
											2016-07-22 08:31:14 +08:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Minio Cloud Storage, (C) 2016 Minio, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2016-07-22 08:31:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 07:09:08 +08:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2016-08-16 07:09:08 +08:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2016-08-16 07:09:08 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-07-22 08:31:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | func initFSObjects(disk string, t *testing.T) (obj ObjectLayer) { | 
					
						
							| 
									
										
										
										
											2016-10-27 18:30:52 +08:00
										 |  |  | 	endpoints, err := parseStorageEndpoints([]string{disk}) | 
					
						
							| 
									
										
										
										
											2016-10-19 03:49:24 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-11-12 08:36:07 +08:00
										 |  |  | 	obj, _, err = initObjectLayer(endpoints) | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal("Unexpected err: ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | // TestReadFsMetadata - readFSMetadata testing with a healthy and faulty disk
 | 
					
						
							|  |  |  | func TestReadFSMetadata(t *testing.T) { | 
					
						
							|  |  |  | 	disk := filepath.Join(os.TempDir(), "minio-"+nextSuffix()) | 
					
						
							|  |  |  | 	defer removeAll(disk) | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	obj := initFSObjects(disk, t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 	fs := obj.(fsObjects) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bucketName := "bucket" | 
					
						
							|  |  |  | 	objectName := "object" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if err := obj.MakeBucket(bucketName); err != nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Unexpected err: ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-03 06:51:49 +08:00
										 |  |  | 	sha256sum := "" | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if _, err := obj.PutObject(bucketName, objectName, int64(len("abcd")), bytes.NewReader([]byte("abcd")), | 
					
						
							| 
									
										
										
										
											2016-10-03 06:51:49 +08:00
										 |  |  | 		map[string]string{"X-Amz-Meta-AppId": "a"}, sha256sum); err != nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Unexpected err: ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Construct the full path of fs.json
 | 
					
						
							|  |  |  | 	fsPath := "buckets/" + bucketName + "/" + objectName + "/fs.json" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Regular fs metadata reading, no errors expected
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if _, err := readFSMetadata(fs.storage, ".minio.sys", fsPath); err != nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Unexpected error ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Corrupted fs.json
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if err := fs.storage.AppendFile(".minio.sys", fsPath, []byte{'a'}); err != nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Unexpected error ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if _, err := readFSMetadata(fs.storage, ".minio.sys", fsPath); err == nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Should fail", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Test with corrupted disk
 | 
					
						
							|  |  |  | 	fsStorage := fs.storage.(*posix) | 
					
						
							|  |  |  | 	naughty := newNaughtyDisk(fsStorage, nil, errFaultyDisk) | 
					
						
							|  |  |  | 	fs.storage = naughty | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if _, err := readFSMetadata(fs.storage, ".minio.sys", fsPath); errorCause(err) != errFaultyDisk { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Should fail", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TestWriteFsMetadata - tests of writeFSMetadata with healthy and faulty disks
 | 
					
						
							|  |  |  | func TestWriteFSMetadata(t *testing.T) { | 
					
						
							|  |  |  | 	disk := filepath.Join(os.TempDir(), "minio-"+nextSuffix()) | 
					
						
							|  |  |  | 	defer removeAll(disk) | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	obj := initFSObjects(disk, t) | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 	fs := obj.(fsObjects) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bucketName := "bucket" | 
					
						
							|  |  |  | 	objectName := "object" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if err := obj.MakeBucket(bucketName); err != nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Unexpected err: ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-03 06:51:49 +08:00
										 |  |  | 	sha256sum := "" | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	if _, err := obj.PutObject(bucketName, objectName, int64(len("abcd")), bytes.NewReader([]byte("abcd")), | 
					
						
							| 
									
										
										
										
											2016-10-03 06:51:49 +08:00
										 |  |  | 		map[string]string{"X-Amz-Meta-AppId": "a"}, sha256sum); err != nil { | 
					
						
							| 
									
										
										
										
											2016-09-17 04:06:49 +08:00
										 |  |  | 		t.Fatal("Unexpected err: ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Construct the complete path of fs.json
 | 
					
						
							|  |  |  | 	fsPath := "buckets/" + bucketName + "/" + objectName + "/fs.json" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Fs metadata reading, no errors expected (healthy disk)
 | 
					
						
							|  |  |  | 	fsMeta, err := readFSMetadata(fs.storage, ".minio.sys", fsPath) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatal("Unexpected error ", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Reading metadata with a corrupted disk
 | 
					
						
							|  |  |  | 	fsStorage := fs.storage.(*posix) | 
					
						
							|  |  |  | 	for i := 1; i <= 2; i++ { | 
					
						
							|  |  |  | 		naughty := newNaughtyDisk(fsStorage, map[int]error{i: errFaultyDisk, i + 1: errFaultyDisk}, nil) | 
					
						
							|  |  |  | 		fs.storage = naughty | 
					
						
							|  |  |  | 		if err = writeFSMetadata(fs.storage, ".minio.sys", fsPath, fsMeta); errorCause(err) != errFaultyDisk { | 
					
						
							|  |  |  | 			t.Fatal("Unexpected error", i, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |