Skip to content

Commit a10950a

Browse files
committed
commit 1.3.0
1. support cas 2. support sse-cos 3. support copy file list
1 parent 7e85fbf commit a10950a

File tree

8 files changed

+189
-38
lines changed

8 files changed

+189
-38
lines changed
-337 KB
Binary file not shown.

src/main/java/com/qcloud/cos_migrate_tool/config/CommonConfig.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,20 @@ public class CommonConfig {
3232
private String endpointSuffix = null;
3333
private String cosProxyHost = "";
3434
private int cosProxyPort = -1;
35+
private String encryptionType = "";
3536

37+
public void setEncryptionType(String encryptionType) {
38+
if (!encryptionType.equals("sse-cos")) {
39+
throw new IllegalArgumentException("Not support encryptionType:" + encryptionType);
40+
}
41+
42+
this.encryptionType = encryptionType.trim();
43+
}
44+
45+
public String getEncryptionType() {
46+
return encryptionType;
47+
}
48+
3649
public String getTempFolderPath() {
3750
return tempFolderPath;
3851
}

src/main/java/com/qcloud/cos_migrate_tool/config/ConfigParser.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class ConfigParser {
4343
private static final String COMMON_EXECUTE_TIME_WINDOW = "executeTimeWindow";
4444
private static final String COMMON_PROXY_HOST = "proxyHost";
4545
private static final String COMMON_PROXY_PORT = "proxyPort";
46+
private static final String COMMOM_ENCRYPTION_TYPE = "encryptionType";
47+
private static final String COMMON_THREAD_NUM = "threadNum";
4648

4749
private static final String LOCAL_SECTION_NAME = "migrateLocal";
4850
private static final String LOCAL_LOCALPATH = "localPath";
@@ -69,9 +71,12 @@ public class ConfigParser {
6971
private static final String COPY_SRC_SECRETKEY = "srcSecretKey";
7072
private static final String COPY_SRC_COSPATH = "srcCosPath";
7173
private static final String COPY_SRC_ENDPOINT_SUFFIX = "srcEndPointSuffix";
74+
private static final String COPY_SRC_FILE_LIST = "srcFileList";
7275

7376
private static final String URLLIST_SECTION_NAME = "migrateUrl";
7477
private static final String URLLIST_PATH = "urllistPath";
78+
79+
7580

7681
private CommonConfig config;
7782

@@ -446,6 +451,11 @@ private boolean initCommonConfig(Preferences prefs, CommonConfig commonConfig) {
446451
commonConfig.setProxyHost(proxyHost);
447452
}
448453

454+
String encryptionType = getConfigValue(prefs, COMMON_SECTION_NAME, COMMOM_ENCRYPTION_TYPE);
455+
if (encryptionType!= null && !encryptionType.trim().isEmpty()) {
456+
commonConfig.setEncryptionType(encryptionType);
457+
}
458+
449459
int port = -1;
450460
String portStr = getConfigValue(prefs, COMMON_SECTION_NAME, COMMON_PROXY_PORT);
451461

@@ -457,6 +467,11 @@ private boolean initCommonConfig(Preferences prefs, CommonConfig commonConfig) {
457467
throw new Exception("invalid cos proxy port");
458468
}
459469
}
470+
471+
String taskExecutorNumberStr = getConfigValue(prefs, COMMON_SECTION_NAME, COMMON_THREAD_NUM);
472+
if (taskExecutorNumberStr != null && !taskExecutorNumberStr.isEmpty()) {
473+
commonConfig.setTaskExecutorNumberStr(taskExecutorNumberStr);
474+
}
460475

461476

462477
} catch (Exception e) {
@@ -667,6 +682,11 @@ private boolean initCopyBucketConfig(Preferences prefs, CopyBucketConfig copyBuc
667682
copyBucketConfig.setSrcEndpointSuffix(srcEndpointSuffix);
668683
}
669684

685+
String fileList = getConfigValue(prefs, COPY_BUCKET_SECTION_NAME, COPY_SRC_FILE_LIST);
686+
if (fileList != null && !fileList.isEmpty()) {
687+
copyBucketConfig.setSrcFileList(fileList);
688+
}
689+
670690
} catch (Exception e) {
671691
System.err.println(e.getMessage());
672692
log.error(e.getMessage());

src/main/java/com/qcloud/cos_migrate_tool/config/CopyBucketConfig.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.qcloud.cos_migrate_tool.config;
22

3+
import java.io.File;
34
import java.util.regex.Pattern;
45

56
import com.qcloud.cos_migrate_tool.utils.PathUtils;
7+
import com.qcloud.cos_migrate_tool.utils.SystemUtils;
68

79
public class CopyBucketConfig extends CommonConfig {
810
private String srcRegion;
@@ -11,7 +13,20 @@ public class CopyBucketConfig extends CommonConfig {
1113
private String srcSk;
1214
private String srcCosPath;
1315
private String srcEndpointSuffix;
16+
private String srcFileList = "";
17+
18+
public void setSrcFileList(String srcFileList) {
19+
File localPathFile = new File(srcFileList);
20+
if (!localPathFile.exists()) {
21+
throw new IllegalArgumentException("copy file list:[" + srcFileList + "not exist!");
22+
}
23+
this.srcFileList = SystemUtils.formatLocalPath(srcFileList);
24+
}
1425

26+
public String getSrcFileList() {
27+
return srcFileList;
28+
}
29+
1530
public String getSrcBucket() {
1631
return srcBucket;
1732
}

src/main/java/com/qcloud/cos_migrate_tool/task/MigrateCopyBucketTask.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.concurrent.ThreadLocalRandom;
66

77
import com.qcloud.cos.COSClient;
8+
import com.qcloud.cos.endpoint.SuffixEndpointBuilder;
89
import com.qcloud.cos.exception.CosServiceException;
910
import com.qcloud.cos.model.CopyObjectRequest;
1011
import com.qcloud.cos.model.CopyResult;
@@ -27,8 +28,8 @@ public class MigrateCopyBucketTask extends Task {
2728
private final String srcEndpointSuffx;
2829
private final String srcBucketName;
2930
private final String srcKey;
30-
private final long srcSize;
31-
private final String srcEtag;
31+
private long srcSize;
32+
private String srcEtag;
3233

3334
public MigrateCopyBucketTask(Semaphore semaphore, CopyBucketConfig config,
3435
TransferManager smallFileTransfer, TransferManager bigFileTransfer, RecordDb recordDb,
@@ -82,6 +83,13 @@ private void transferFileForNotAllowedCopyObject(MigrateCopyBucketRecordElement
8283

8384
@Override
8485
public void doTask() {
86+
87+
if (srcEtag.isEmpty()) {
88+
ObjectMetadata objectMetadata = srcCOSClient.getObjectMetadata(srcBucketName, srcKey);
89+
srcEtag = objectMetadata.getETag();
90+
this.srcSize = objectMetadata.getContentLength();
91+
}
92+
8593
MigrateCopyBucketRecordElement migrateCopyBucketRecordElement =
8694
new MigrateCopyBucketRecordElement(destRegion, destBucketName, destKey, srcRegion,
8795
srcBucketName, srcKey, srcSize, srcEtag);
@@ -98,7 +106,13 @@ public void doTask() {
98106
copyObjectRequest.setNewObjectMetadata(newObjectMetadata);
99107
}
100108

101-
copyObjectRequest.setSourceEndpointSuffix(srcEndpointSuffx);
109+
if (srcEndpointSuffx != null && !srcEndpointSuffx.isEmpty()) {
110+
SuffixEndpointBuilder sourceEndpointBuilder = new SuffixEndpointBuilder(srcEndpointSuffx);
111+
copyObjectRequest.setSourceEndpointBuilder(sourceEndpointBuilder);
112+
}
113+
114+
copyObjectRequest.setStorageClass(this.config.getStorageClass());
115+
102116
try {
103117
Copy copy = smallFileTransfer.copy(copyObjectRequest, srcCOSClient, null);
104118
CopyResult copyResult = copy.waitForCopyResult();

src/main/java/com/qcloud/cos_migrate_tool/task/MigrateCopyBucketTaskExecutor.java

Lines changed: 118 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package com.qcloud.cos_migrate_tool.task;
22

3+
import java.io.BufferedReader;
4+
import java.io.File;
5+
import java.io.FileInputStream;
6+
import java.io.FileNotFoundException;
7+
import java.io.IOException;
8+
import java.io.InputStreamReader;
39
import java.util.List;
410

511
import org.apache.commons.codec.digest.DigestUtils;
@@ -15,6 +21,7 @@
1521
import com.qcloud.cos.model.ListObjectsRequest;
1622
import com.qcloud.cos.model.ObjectListing;
1723
import com.qcloud.cos.region.Region;
24+
import com.qcloud.cos.utils.UrlEncoderUtils;
1825
import com.qcloud.cos_migrate_tool.config.CopyBucketConfig;
1926
import com.qcloud.cos_migrate_tool.config.MigrateType;
2027
import com.qcloud.cos_migrate_tool.meta.TaskStatics;
@@ -27,6 +34,7 @@ public class MigrateCopyBucketTaskExecutor extends TaskExecutor {
2734
private String srcRegion;
2835
private String srcBucketName;
2936
private String srcCosPath;
37+
private String srcFileList;
3038

3139
public MigrateCopyBucketTaskExecutor(CopyBucketConfig config) {
3240
super(MigrateType.MIGRATE_FROM_COS_BUCKET_COPY, config);
@@ -42,19 +50,20 @@ public MigrateCopyBucketTaskExecutor(CopyBucketConfig config) {
4250
clientConfig.setConnectionTimeout(5000);
4351
clientConfig.setSocketTimeout(5000);
4452

45-
clientConfig.setUserAgent("cos-migrate-tool-v1.0");
53+
clientConfig.setUserAgent("cos-migrate-tool-v1.3.0");
4654
this.srcCosClient = new COSClient(srcCred, clientConfig);
4755
this.srcRegion = config.getSrcRegion();
4856
this.srcBucketName = config.getSrcBucket();
4957
this.srcCosPath = config.getSrcCosPath();
58+
this.srcFileList = config.getSrcFileList();
5059
}
5160

5261
@Override
5362
protected String buildTaskDbComment() {
5463
String comment = String.format(
55-
"[time: %s], [destRegion: %s], [destBucketName: %s], [destCosFolder: %s], [srcRegion: %s], [srcBucketName: %s], [srcFolder: %s], [smallTaskExecutor: %d]\n",
64+
"[time: %s], [destRegion: %s], [destBucketName: %s], [destCosFolder: %s], [srcRegion: %s], [srcFileList:%s], [srcBucketName: %s], [srcFolder: %s], [smallTaskExecutor: %d]\n",
5665
SystemUtils.getCurrentDateTime(), config.getRegion(), config.getBucketName(),
57-
config.getCosPath(), srcRegion, srcBucketName, srcCosPath,
66+
config.getCosPath(), srcRegion, srcFileList, srcBucketName, srcCosPath,
5867
this.smallFileUploadExecutorNum);
5968
return comment;
6069
}
@@ -73,49 +82,124 @@ protected String buildTaskDbFolderPath() {
7382

7483
@Override
7584
public void buildTask() {
76-
ListObjectsRequest listObjectsRequest =
77-
new ListObjectsRequest(srcBucketName, srcCosPath, null, null, 1000);
7885

7986
int lastDelimiter = srcCosPath.lastIndexOf("/");
80-
ObjectListing objectListing;
81-
int retry_num = 0;
8287

83-
do {
88+
if (!srcFileList.isEmpty()) {
89+
File file = new File(srcFileList);
90+
if (!file.isFile() || !file.exists()) {
91+
String printMsg = String.format("file[%s] not exist or not file", srcFileList);
92+
log.error(printMsg);
93+
System.out.println(printMsg);
94+
}
95+
96+
InputStreamReader read = null;
8497
try {
85-
while (true) {
86-
objectListing = srcCosClient.listObjects(listObjectsRequest);
87-
List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
88-
for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
89-
String srcKey = cosObjectSummary.getKey();
90-
String srcEtag = cosObjectSummary.getETag();
91-
long srcSize = cosObjectSummary.getSize();
92-
String keyName = srcKey.substring(lastDelimiter);
93-
String copyDestKey = config.getCosPath() + keyName;
94-
95-
MigrateCopyBucketTask task =
96-
new MigrateCopyBucketTask(semaphore, (CopyBucketConfig) config,
97-
smallFileTransferManager, bigFileTransferManager, recordDb,
98-
srcCosClient, srcKey, srcSize, srcEtag, copyDestKey);
99-
AddTask(task);
100-
}
101-
if (!objectListing.isTruncated()) {
102-
break;
98+
read = new InputStreamReader(new FileInputStream(file));
99+
} catch (FileNotFoundException e1) {
100+
e1.printStackTrace();
101+
return;
102+
}
103+
104+
BufferedReader bufferedReader = new BufferedReader(read);
105+
String srcKey = null;
106+
107+
try {
108+
while ((srcKey = bufferedReader.readLine()) != null){
109+
110+
srcKey = UrlEncoderUtils.urlDecode(srcKey);
111+
112+
String copyDestKey = null;
113+
if (srcKey.startsWith("/")) {
114+
copyDestKey = config.getCosPath() + srcKey.substring(1);
115+
srcKey = srcKey.substring(1);
116+
} else {
117+
copyDestKey = config.getCosPath() + srcKey;
103118
}
104-
listObjectsRequest.setMarker(objectListing.getNextMarker());
119+
120+
MigrateCopyBucketTask task = new MigrateCopyBucketTask(semaphore,
121+
(CopyBucketConfig) config, smallFileTransferManager,
122+
bigFileTransferManager, recordDb, srcCosClient, srcKey, 0,
123+
"", copyDestKey);
124+
125+
AddTask(task);
126+
105127
}
106-
128+
107129
TaskStatics.instance.setListFinished(true);
108130

109-
return;
110-
131+
} catch (IOException e) {
132+
log.error(e.toString());
133+
TaskStatics.instance.setListFinished(false);
134+
e.printStackTrace();
111135
} catch (Exception e) {
112-
log.error("List cos bucket occur a exception", e);
136+
log.error(e.toString());
137+
e.printStackTrace();
113138
TaskStatics.instance.setListFinished(false);
114139
}
115140

116-
++retry_num;
117-
118-
} while (retry_num < 20);
141+
try {
142+
bufferedReader.close();
143+
} catch (IOException e) {
144+
e.printStackTrace();
145+
}
146+
try {
147+
read.close();
148+
} catch (IOException e) {
149+
e.printStackTrace();
150+
}
151+
152+
153+
} else {
154+
155+
ListObjectsRequest listObjectsRequest =
156+
new ListObjectsRequest(srcBucketName, srcCosPath, null, null, 1000);
157+
158+
ObjectListing objectListing;
159+
int retry_num = 0;
160+
161+
do {
162+
try {
163+
while (true) {
164+
objectListing = srcCosClient.listObjects(listObjectsRequest);
165+
List<COSObjectSummary> cosObjectSummaries =
166+
objectListing.getObjectSummaries();
167+
168+
for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
169+
String srcKey = cosObjectSummary.getKey();
170+
String srcEtag = cosObjectSummary.getETag();
171+
long srcSize = cosObjectSummary.getSize();
172+
String keyName = srcKey.substring(lastDelimiter);
173+
String copyDestKey = config.getCosPath() + keyName;
174+
175+
MigrateCopyBucketTask task = new MigrateCopyBucketTask(semaphore,
176+
(CopyBucketConfig) config, smallFileTransferManager,
177+
bigFileTransferManager, recordDb, srcCosClient, srcKey, srcSize,
178+
srcEtag, copyDestKey);
179+
180+
AddTask(task);
181+
}
182+
183+
if (!objectListing.isTruncated()) {
184+
break;
185+
}
186+
187+
listObjectsRequest.setMarker(objectListing.getNextMarker());
188+
}
189+
190+
TaskStatics.instance.setListFinished(true);
191+
192+
return;
193+
194+
} catch (Exception e) {
195+
log.error("List cos bucket occur a exception:{}", e.toString());
196+
TaskStatics.instance.setListFinished(false);
197+
}
198+
199+
++retry_num;
200+
201+
} while (retry_num < 20);
202+
}
119203

120204
}
121205

src/main/java/com/qcloud/cos_migrate_tool/task/Task.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ public String uploadFile(String bucketName, String cosPath, File localFile,
202202
objectMetadata.addUserMetadata("md5", md5);
203203
}
204204

205+
if (config.getEncryptionType().equals("sse-cos")) {
206+
objectMetadata.setServerSideEncryption("AES256");
207+
}
208+
205209
putObjectRequest.setMetadata(objectMetadata);
206210
int retryTime = 0;
207211
final int maxRetry = 5;

src/main/java/com/qcloud/cos_migrate_tool/task/TaskExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ public TaskExecutor(MigrateType migrateType, CommonConfig config) {
5555
if (config.isEnableHttps()) {
5656
clientConfig.setHttpProtocol(HttpProtocol.https);
5757
}
58+
5859
if (config.getEndpointSuffix() != null) {
5960
clientConfig.setEndPointSuffix(config.getEndpointSuffix());
6061
}
61-
clientConfig.setUserAgent("cos-migrate-tool-v1.2.5");
62+
clientConfig.setUserAgent("cos-migrate-tool-v1.3.0");
6263

6364
if (!config.getProxyHost().isEmpty() && config.getProxyPort() > 0) {
6465
clientConfig.setHttpProxyIp(config.getProxyHost());

0 commit comments

Comments
 (0)