Skip to content

Commit f9582b6

Browse files
committed
add some features
1. update cos sdk 2. support migrate csp 3. migrateUrl support skip head 4. migrateLocal support skip empty file and skip suffix
1 parent 7378e98 commit f9582b6

25 files changed

+1166
-291
lines changed

conf/config.ini

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ exeludes=
6060
# 默认不设置, 表示不根据lastmodified时间进行筛选
6161
# 适用于客户在更新文件的同时又在运行迁移工具, 不准备把正在更新的文件迁移上传到COS, 比如设置为300, 表示只上传更新了5分钟以上的文件
6262
ignoreModifiedTimeLessThanSeconds=
63-
63+
#多个后缀用;隔开,例如:.txt;.tmp;
64+
ignoreSuffix=
65+
#on:忽略空文件,off:不忽略。默认不忽略
66+
ignoreEmptyFile=
6467

6568
## 从阿里迁移到COS的配置分节
6669
[migrateAli]
@@ -103,6 +106,9 @@ needSign=true
103106
# 对于linux绝对路径, 如/a/b/c, 对于windows绝对路径,注意分隔符为两个反斜杠,如E:\\a\\b\\c
104107
urllistPath=/data/mydata/url
105108

109+
#on:迁移时不去head url,off:会head url,默认off。不去head可能导致源更新了,迁移工具却不知道,适用于确定源不更新,加快迁移速度。
110+
isSkipHead=
111+
106112
## 从AWS迁移到COS的配置分节
107113
[migrateAws]
108114
# aws的bucket
@@ -135,3 +141,13 @@ srcSecretId=xxxxxxxxxxx
135141
srcSecretKey=yyyyyyyyyyyyyyyy
136142
# 要迁移的cos路径的
137143
srcCosPath=/
144+
145+
[migrateCsp]
146+
bucket=xxx
147+
accessKeyId=xxx
148+
accessKeySecret=xxx
149+
endPoint=xxx.com
150+
151+
#指定了uriList之后,就只迁uri列表中的数据,不指定则是自动list全部数据然后迁移。uri格式不带域名,如:/dir1/subdir2/a.txt
152+
uriList=/data/uriList.txt
153+
prefix=
17.1 KB
Binary file not shown.

src/main/java/com/qcloud/cos_migrate_tool/app/App.java

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

3+
import java.io.BufferedReader;
4+
import java.io.FileInputStream;
5+
import java.io.FileNotFoundException;
6+
import java.io.IOException;
7+
import java.io.InputStreamReader;
8+
39
import org.slf4j.Logger;
410
import org.slf4j.LoggerFactory;
511

@@ -8,14 +14,17 @@
814
import com.qcloud.cos_migrate_tool.config.CopyBucketConfig;
915
import com.qcloud.cos_migrate_tool.config.CopyFromAliConfig;
1016
import com.qcloud.cos_migrate_tool.config.CopyFromAwsConfig;
17+
import com.qcloud.cos_migrate_tool.config.CopyFromCompetitorConfig;
1118
import com.qcloud.cos_migrate_tool.config.CopyFromLocalConfig;
1219
import com.qcloud.cos_migrate_tool.config.CopyFromQiniuConfig;
1320
import com.qcloud.cos_migrate_tool.config.CopyFromUrllistConfig;
21+
import com.qcloud.cos_migrate_tool.config.CopyFromCspConfig;
1422
import com.qcloud.cos_migrate_tool.config.MigrateType;
1523
import com.qcloud.cos_migrate_tool.meta.TaskStatics;
1624
import com.qcloud.cos_migrate_tool.task.MigrateAliTaskExecutor;
1725
import com.qcloud.cos_migrate_tool.task.MigrateAwsTaskExecutor;
1826
import com.qcloud.cos_migrate_tool.task.MigrateCopyBucketTaskExecutor;
27+
import com.qcloud.cos_migrate_tool.task.MigrateCspTaskExecutor;
1928
import com.qcloud.cos_migrate_tool.task.MigrateLocalTaskExecutor;
2029
import com.qcloud.cos_migrate_tool.task.MigrateQiniuTaskExecutor;
2130
import com.qcloud.cos_migrate_tool.task.MigrateUrllistTaskExecutor;
@@ -40,6 +49,8 @@ private static TaskExecutor buildTaskExecutor(CommonConfig config) {
4049
return new MigrateUrllistTaskExecutor((CopyFromUrllistConfig) config);
4150
} else if (ConfigParser.instance.getMigrateType().equals(MigrateType.MIGRATE_FROM_QINIU)) {
4251
return new MigrateQiniuTaskExecutor((CopyFromQiniuConfig) config);
52+
} else if (ConfigParser.instance.getMigrateType().equals(MigrateType.MIGRATE_FROM_CSP)) {
53+
return new MigrateCspTaskExecutor((CopyFromCspConfig) config);
4354
} else {
4455
System.out.println("unknown migrate type");
4556
}
@@ -48,26 +59,80 @@ private static TaskExecutor buildTaskExecutor(CommonConfig config) {
4859
}
4960

5061
public static void main(String[] args) {
62+
5163
if (!ConfigParser.instance.parse()) {
5264
return;
5365
}
5466

5567
CommonConfig config = ConfigParser.instance.getConfig();
56-
while (true) {
57-
TaskStatics.instance.reset();
58-
59-
TaskExecutor taskExecutor = buildTaskExecutor(config);
60-
taskExecutor.run();
61-
taskExecutor.waitTaskOver();
6268

63-
if (!config.isDamonMode())
64-
break;
69+
String batchTaskPath = config.getBatchTaskPath();
70+
if (!batchTaskPath.isEmpty()) {
71+
72+
FileInputStream inputStream = null;
73+
try {
74+
inputStream = new FileInputStream(batchTaskPath);
75+
} catch (FileNotFoundException e) {
76+
e.printStackTrace();
77+
return;
78+
}
79+
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
6580

81+
String str = null;
6682
try {
67-
Thread.sleep(config.getDamonInterVal() * 1000);
68-
} catch (InterruptedException e) {
69-
log.error("the program is interrupted!", e);
70-
break;
83+
while (true) {
84+
while ((str = bufferedReader.readLine()) != null) {
85+
String[] task = str.split("\t");
86+
if (!((CopyFromCompetitorConfig) config).setTask(task)) {
87+
System.out.printf("task:%s invalid\n", str);
88+
log.error("task:{} invalid", str);
89+
continue;
90+
}
91+
92+
TaskStatics.instance.reset();
93+
94+
TaskExecutor taskExecutor = buildTaskExecutor(config);
95+
taskExecutor.run();
96+
taskExecutor.waitTaskOver();
97+
}
98+
99+
if (!config.isDamonMode())
100+
break;
101+
102+
try {
103+
Thread.sleep(config.getDamonInterVal() * 1000);
104+
} catch (InterruptedException e) {
105+
log.error("the program is interrupted!", e);
106+
break;
107+
}
108+
}
109+
110+
inputStream.close();
111+
bufferedReader.close();
112+
} catch (IOException e) {
113+
// TODO Auto-generated catch block
114+
e.printStackTrace();
115+
return;
116+
}
117+
118+
} else {
119+
120+
while (true) {
121+
TaskStatics.instance.reset();
122+
123+
TaskExecutor taskExecutor = buildTaskExecutor(config);
124+
taskExecutor.run();
125+
taskExecutor.waitTaskOver();
126+
127+
if (!config.isDamonMode())
128+
break;
129+
130+
try {
131+
Thread.sleep(config.getDamonInterVal() * 1000);
132+
} catch (InterruptedException e) {
133+
log.error("the program is interrupted!", e);
134+
break;
135+
}
71136
}
72137
}
73138
}

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

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class CommonConfig {
2020
private String cosPath;
2121
private boolean enableHttps;
2222
private boolean entireFileMd5Attached;
23-
private int taskExecutorNumber = 64;
23+
private int taskExecutorNumber = 68;
2424
private StorageClass storageClass = StorageClass.Standard;
2525
private int smallFileExecutorNumber = 64;
2626
private int bigFileExecutorNum = 4;
@@ -33,6 +33,30 @@ public class CommonConfig {
3333
private String cosProxyHost = "";
3434
private int cosProxyPort = -1;
3535
private String encryptionType = "";
36+
private String batchTaskPath = "";
37+
private boolean realTimeCompare = false;
38+
39+
public void setRealTimeCompare(String realTimeCompare) throws IllegalArgumentException {
40+
if (realTimeCompare.equalsIgnoreCase("on")) {
41+
this.realTimeCompare = true;
42+
} else if (realTimeCompare.equalsIgnoreCase("off")) {
43+
this.realTimeCompare = false;
44+
} else {
45+
throw new IllegalArgumentException("invalid realTimeCompare config. only support on/off");
46+
}
47+
}
48+
49+
public boolean getRealTimeCompare() {
50+
return this.realTimeCompare;
51+
}
52+
53+
public void setBatchTaskPath(String batchTaskPath) {
54+
this.batchTaskPath = batchTaskPath;
55+
}
56+
57+
public String getBatchTaskPath() {
58+
return this.batchTaskPath;
59+
}
3660

3761
public void setEncryptionType(String encryptionType) {
3862
if (!encryptionType.equals("sse-cos")) {
@@ -71,11 +95,6 @@ public String getBucketName() {
7195

7296
public void setBucketName(String bucketName) {
7397
bucketName = bucketName.trim();
74-
String parrtern = ".*-(125|100|20)[0-9]{3,}$";
75-
if (!Pattern.matches(parrtern, bucketName)) {
76-
throw new IllegalArgumentException(
77-
"bucketName must contain appid. example: test-1250001000");
78-
}
7998
this.bucketName = bucketName;
8099
}
81100

0 commit comments

Comments
 (0)