Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
07fca212
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
07fca212
编写于
7月 18, 2023
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/3.0' into feat/TD-24700
上级
294376de
7e896221
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
148 addition
and
33 deletion
+148
-33
include/common/tglobal.h
include/common/tglobal.h
+1
-0
include/os/osSysinfo.h
include/os/osSysinfo.h
+1
-1
source/common/CMakeLists.txt
source/common/CMakeLists.txt
+4
-0
source/common/src/tglobal.c
source/common/src/tglobal.c
+8
-6
source/common/src/tmisce.c
source/common/src/tmisce.c
+1
-1
source/dnode/mgmt/exe/dmMain.c
source/dnode/mgmt/exe/dmMain.c
+5
-1
source/dnode/mgmt/node_mgmt/src/dmEnv.c
source/dnode/mgmt/node_mgmt/src/dmEnv.c
+56
-9
source/dnode/mnode/impl/src/mndCluster.c
source/dnode/mnode/impl/src/mndCluster.c
+0
-1
source/dnode/mnode/impl/src/mndDnode.c
source/dnode/mnode/impl/src/mndDnode.c
+19
-2
source/dnode/mnode/impl/src/mndStb.c
source/dnode/mnode/impl/src/mndStb.c
+3
-0
source/dnode/mnode/impl/src/mndTelem.c
source/dnode/mnode/impl/src/mndTelem.c
+1
-1
source/libs/command/src/command.c
source/libs/command/src/command.c
+25
-0
source/os/src/osSysinfo.c
source/os/src/osSysinfo.c
+23
-10
source/os/test/osTests.cpp
source/os/test/osTests.cpp
+1
-1
未找到文件。
include/common/tglobal.h
浏览文件 @
07fca212
...
...
@@ -34,6 +34,7 @@ extern char tsFirst[];
extern
char
tsSecond
[];
extern
char
tsLocalFqdn
[];
extern
char
tsLocalEp
[];
extern
char
tsVersionName
[];
extern
uint16_t
tsServerPort
;
extern
int32_t
tsVersion
;
extern
int32_t
tsStatusInterval
;
...
...
include/os/osSysinfo.h
浏览文件 @
07fca212
...
...
@@ -36,7 +36,7 @@ typedef struct {
bool
taosCheckSystemIsLittleEnd
();
void
taosGetSystemInfo
();
int32_t
taosGetEmail
(
char
*
email
,
int32_t
maxLen
);
int32_t
taosGetOsReleaseName
(
char
*
releaseName
,
int32_t
maxLen
);
int32_t
taosGetOsReleaseName
(
char
*
releaseName
,
char
*
sName
,
char
*
ver
,
int32_t
maxLen
);
int32_t
taosGetCpuInfo
(
char
*
cpuModel
,
int32_t
maxLen
,
float
*
numOfCores
);
int32_t
taosGetCpuCores
(
float
*
numOfCores
);
void
taosGetCpuUsage
(
double
*
cpu_system
,
double
*
cpu_engine
);
...
...
source/common/CMakeLists.txt
浏览文件 @
07fca212
aux_source_directory
(
src COMMON_SRC
)
IF
(
TD_ENTERPRISE
)
LIST
(
APPEND COMMON_SRC
${
TD_ENTERPRISE_DIR
}
/src/plugins/common/src/tglobal.c
)
ENDIF
()
add_library
(
common STATIC
${
COMMON_SRC
}
)
if
(
DEFINED GRANT_CFG_INCLUDE_DIR
)
...
...
source/common/src/tglobal.c
浏览文件 @
07fca212
...
...
@@ -34,6 +34,7 @@ char tsFirst[TSDB_EP_LEN] = {0};
char
tsSecond
[
TSDB_EP_LEN
]
=
{
0
};
char
tsLocalFqdn
[
TSDB_FQDN_LEN
]
=
{
0
};
char
tsLocalEp
[
TSDB_EP_LEN
]
=
{
0
};
// Local End Point, hostname:port
char
tsVersionName
[
16
]
=
"community"
;
uint16_t
tsServerPort
=
6030
;
int32_t
tsVersion
=
30000000
;
int32_t
tsStatusInterval
=
1
;
// second
...
...
@@ -938,6 +939,12 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
return
0
;
}
#ifndef TD_ENTERPRISE
static
int32_t
taosSetReleaseCfg
(
SConfig
*
pCfg
)
{
return
0
;
}
#else
int32_t
taosSetReleaseCfg
(
SConfig
*
pCfg
);
#endif
void
taosLocalCfgForbiddenToChange
(
char
*
name
,
bool
*
forbidden
)
{
int32_t
len
=
strlen
(
name
);
char
lowcaseName
[
CFG_NAME_MAX_LEN
+
1
]
=
{
0
};
...
...
@@ -1444,6 +1451,7 @@ int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile
if
(
taosSetClientCfg
(
tsCfg
))
return
-
1
;
if
(
taosUpdateServerCfg
(
tsCfg
))
return
-
1
;
if
(
taosSetServerCfg
(
tsCfg
))
return
-
1
;
if
(
taosSetReleaseCfg
(
tsCfg
))
return
-
1
;
if
(
taosSetTfsCfg
(
tsCfg
)
!=
0
)
return
-
1
;
}
taosSetSystemCfg
(
tsCfg
);
...
...
@@ -1490,14 +1498,8 @@ void taosCfgDynamicOptions(const char *option, const char *value) {
if
(
strcasecmp
(
option
,
"keepTimeOffset"
)
==
0
)
{
int32_t
newKeepTimeOffset
=
atoi
(
value
);
if
(
newKeepTimeOffset
<
0
||
newKeepTimeOffset
>
23
)
{
uError
(
"failed to set keepTimeOffset from %d to %d. Valid range: [0, 23]"
,
tsKeepTimeOffset
,
newKeepTimeOffset
);
return
;
}
uInfo
(
"keepTimeOffset set from %d to %d"
,
tsKeepTimeOffset
,
newKeepTimeOffset
);
tsKeepTimeOffset
=
newKeepTimeOffset
;
return
;
}
...
...
source/common/src/tmisce.c
浏览文件 @
07fca212
...
...
@@ -109,7 +109,7 @@ int32_t taosGenCrashJsonMsg(int signum, char** pMsg, int64_t clusterId, int64_t
taosGetAppName
(
tmp
,
NULL
);
tjsonAddStringToObject
(
pJson
,
"appName"
,
tmp
);
if
(
taosGetOsReleaseName
(
tmp
,
sizeof
(
tmp
))
==
0
)
{
if
(
taosGetOsReleaseName
(
tmp
,
NULL
,
NULL
,
sizeof
(
tmp
))
==
0
)
{
tjsonAddStringToObject
(
pJson
,
"os"
,
tmp
);
}
...
...
source/dnode/mgmt/exe/dmMain.c
浏览文件 @
07fca212
...
...
@@ -359,7 +359,11 @@ int mainWindows(int argc, char **argv) {
taosCleanupArgs
();
if
(
dmInit
()
!=
0
)
{
dError
(
"failed to init dnode since %s"
,
terrstr
());
if
(
terrno
==
TSDB_CODE_NOT_FOUND
)
{
dError
(
"failed to init dnode since unsupported platform, please visit https://www.taosdata.com for support"
);
}
else
{
dError
(
"failed to init dnode since %s"
,
terrstr
());
}
taosCleanupCfg
();
taosCloseLog
();
...
...
source/dnode/mgmt/node_mgmt/src/dmEnv.c
浏览文件 @
07fca212
...
...
@@ -16,7 +16,33 @@
#define _DEFAULT_SOURCE
#include "dmMgmt.h"
static
SDnode
globalDnode
=
{
0
};
#define STR_CASE_CMP(s, d) (0 == strcasecmp((s), (d)))
#define STR_STR_CMP(s, d) (strstr((s), (d)))
#define STR_INT_CMP(s, d, c) (taosStr2Int32(s, 0, 10) c(d))
#define STR_STR_SIGN ("ia")
#define DM_INIT_MON() \
do { \
code = (int32_t)(2147483648 | 298); \
strncpy(stName, tsVersionName, 64); \
monCfg.maxLogs = tsMonitorMaxLogs; \
monCfg.port = tsMonitorPort; \
monCfg.server = tsMonitorFqdn; \
monCfg.comp = tsMonitorComp; \
if (monInit(&monCfg) != 0) { \
if (terrno != 0) code = terrno; \
goto _exit; \
} \
} while (0)
#define DM_ERR_RTN(c) \
do { \
code = (c); \
goto _exit; \
} while (0)
static
SDnode
globalDnode
=
{
0
};
static
const
char
*
dmOS
[
10
]
=
{
"Ubuntu"
,
"CentOS Linux"
,
"Red Hat"
,
"Debian GNU"
,
"CoreOS"
,
"FreeBSD"
,
"openSUSE"
,
"SLES"
,
"Fedora"
,
"MacOS"
};
SDnode
*
dmInstance
()
{
return
&
globalDnode
;
}
...
...
@@ -37,16 +63,37 @@ static int32_t dmInitSystem() {
}
static
int32_t
dmInitMonitor
()
{
int32_t
code
=
0
;
SMonCfg
monCfg
=
{
0
};
monCfg
.
maxLogs
=
tsMonitorMaxLogs
;
monCfg
.
port
=
tsMonitorPort
;
monCfg
.
server
=
tsMonitorFqdn
;
monCfg
.
comp
=
tsMonitorComp
;
if
(
monInit
(
&
monCfg
)
!=
0
)
{
dError
(
"failed to init monitor since %s"
,
terrstr
());
return
-
1
;
char
reName
[
64
]
=
{
0
};
char
stName
[
64
]
=
{
0
};
char
ver
[
64
]
=
{
0
};
DM_INIT_MON
();
if
(
STR_STR_CMP
(
stName
,
STR_STR_SIGN
))
{
DM_ERR_RTN
(
0
);
}
return
0
;
if
(
taosGetOsReleaseName
(
reName
,
stName
,
ver
,
64
)
!=
0
)
{
DM_ERR_RTN
(
code
);
}
if
(
STR_CASE_CMP
(
stName
,
dmOS
[
0
]))
{
if
(
STR_INT_CMP
(
ver
,
17
,
>
))
{
DM_ERR_RTN
(
0
);
}
}
else
if
(
STR_CASE_CMP
(
stName
,
dmOS
[
1
]))
{
if
(
STR_INT_CMP
(
ver
,
6
,
>
))
{
DM_ERR_RTN
(
0
);
}
}
else
if
(
STR_STR_CMP
(
stName
,
dmOS
[
2
])
||
STR_STR_CMP
(
stName
,
dmOS
[
3
])
||
STR_STR_CMP
(
stName
,
dmOS
[
4
])
||
STR_STR_CMP
(
stName
,
dmOS
[
5
])
||
STR_STR_CMP
(
stName
,
dmOS
[
6
])
||
STR_STR_CMP
(
stName
,
dmOS
[
7
])
||
STR_STR_CMP
(
stName
,
dmOS
[
8
])
||
STR_STR_CMP
(
stName
,
dmOS
[
9
]))
{
DM_ERR_RTN
(
0
);
}
_exit:
if
(
code
)
terrno
=
code
;
return
code
;
}
static
bool
dmCheckDiskSpace
()
{
...
...
source/dnode/mnode/impl/src/mndCluster.c
浏览文件 @
07fca212
...
...
@@ -20,7 +20,6 @@
#define CLUSTER_VER_NUMBE 1
#define CLUSTER_RESERVE_SIZE 60
char
tsVersionName
[
16
]
=
"community"
;
int64_t
tsExpireTime
=
0
;
static
SSdbRaw
*
mndClusterActionEncode
(
SClusterObj
*
pCluster
);
...
...
source/dnode/mnode/impl/src/mndDnode.c
浏览文件 @
07fca212
...
...
@@ -947,7 +947,7 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
goto
_OVER
;
}
mInfo
(
"dnode:%d, start to drop, ep:%s:%d, force:%s, unsafe:%s"
,
mInfo
(
"dnode:%d, start to drop, ep:%s:%d, force:%s, unsafe:%s"
,
dropReq
.
dnodeId
,
dropReq
.
fqdn
,
dropReq
.
port
,
dropReq
.
force
?
"true"
:
"false"
,
dropReq
.
unsafe
?
"true"
:
"false"
);
if
(
mndCheckOperPrivilege
(
pMnode
,
pReq
->
info
.
conn
.
user
,
MND_OPER_DROP_MNODE
)
!=
0
)
{
goto
_OVER
;
...
...
@@ -987,7 +987,7 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
int32_t
numOfVnodes
=
mndGetVnodesNum
(
pMnode
,
pDnode
->
id
);
bool
isonline
=
mndIsDnodeOnline
(
pDnode
,
taosGetTimestampMs
());
if
(
isonline
&&
force
)
{
terrno
=
TSDB_CODE_DNODE_ONLY_USE_WHEN_OFFLINE
;
mError
(
"dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d"
,
pDnode
->
id
,
terrstr
(),
...
...
@@ -1060,6 +1060,23 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) {
strcpy
(
dcfgReq
.
config
,
"monitor"
);
snprintf
(
dcfgReq
.
value
,
TSDB_DNODE_VALUE_LEN
,
"%d"
,
flag
);
}
else
if
(
strncasecmp
(
cfgReq
.
config
,
"keeptimeoffset"
,
14
)
==
0
)
{
if
(
' '
!=
cfgReq
.
config
[
14
]
&&
0
!=
cfgReq
.
config
[
14
])
{
mError
(
"dnode:%d, failed to config keeptimeoffset since invalid conf:%s"
,
cfgReq
.
dnodeId
,
cfgReq
.
config
);
terrno
=
TSDB_CODE_INVALID_CFG
;
return
-
1
;
}
const
char
*
value
=
cfgReq
.
value
;
int32_t
offset
=
atoi
(
value
);
if
(
offset
<
0
||
offset
>
23
)
{
mError
(
"dnode:%d, failed to config keepTimeOffset since value:%d. Valid range: [0, 23]"
,
cfgReq
.
dnodeId
,
offset
);
terrno
=
TSDB_CODE_INVALID_CFG
;
return
-
1
;
}
strcpy
(
dcfgReq
.
config
,
"keeptimeoffset"
);
snprintf
(
dcfgReq
.
value
,
TSDB_DNODE_VALUE_LEN
,
"%d"
,
offset
);
#ifdef TD_ENTERPRISE
}
else
if
(
strncasecmp
(
cfgReq
.
config
,
"activeCode"
,
10
)
==
0
||
strncasecmp
(
cfgReq
.
config
,
"cActiveCode"
,
11
)
==
0
)
{
int8_t
opt
=
strncasecmp
(
cfgReq
.
config
,
"a"
,
1
)
==
0
?
DND_ACTIVE_CODE
:
DND_CONN_ACTIVE_CODE
;
...
...
source/dnode/mnode/impl/src/mndStb.c
浏览文件 @
07fca212
...
...
@@ -1738,6 +1738,7 @@ static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbNa
SSchema
*
pSrcSchema
=
&
pStb
->
pColumns
[
i
];
memcpy
(
pSchema
->
name
,
pSrcSchema
->
name
,
TSDB_COL_NAME_LEN
);
pSchema
->
type
=
pSrcSchema
->
type
;
pSchema
->
flags
=
pSrcSchema
->
flags
;
pSchema
->
colId
=
pSrcSchema
->
colId
;
pSchema
->
bytes
=
pSrcSchema
->
bytes
;
}
...
...
@@ -1788,6 +1789,7 @@ static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName,
SSchema
*
pSrcSchema
=
&
pStb
->
pColumns
[
i
];
memcpy
(
pSchema
->
name
,
pSrcSchema
->
name
,
TSDB_COL_NAME_LEN
);
pSchema
->
type
=
pSrcSchema
->
type
;
pSchema
->
flags
=
pSrcSchema
->
flags
;
pSchema
->
colId
=
pSrcSchema
->
colId
;
pSchema
->
bytes
=
pSrcSchema
->
bytes
;
}
...
...
@@ -1797,6 +1799,7 @@ static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName,
SSchema
*
pSrcSchema
=
&
pStb
->
pTags
[
i
];
memcpy
(
pSchema
->
name
,
pSrcSchema
->
name
,
TSDB_COL_NAME_LEN
);
pSchema
->
type
=
pSrcSchema
->
type
;
pSchema
->
flags
=
pSrcSchema
->
flags
;
pSchema
->
colId
=
pSrcSchema
->
colId
;
pSchema
->
bytes
=
pSrcSchema
->
bytes
;
}
...
...
source/dnode/mnode/impl/src/mndTelem.c
浏览文件 @
07fca212
...
...
@@ -94,7 +94,7 @@ static char* mndBuildTelemetryReport(SMnode* pMnode) {
tjsonAddStringToObject
(
pJson
,
"instanceId"
,
clusterName
);
tjsonAddDoubleToObject
(
pJson
,
"reportVersion"
,
1
);
if
(
taosGetOsReleaseName
(
tmp
,
sizeof
(
tmp
))
==
0
)
{
if
(
taosGetOsReleaseName
(
tmp
,
NULL
,
NULL
,
sizeof
(
tmp
))
==
0
)
{
tjsonAddStringToObject
(
pJson
,
"os"
,
tmp
);
}
...
...
source/libs/command/src/command.c
浏览文件 @
07fca212
...
...
@@ -615,6 +615,31 @@ void appendTableOptions(char* buf, int32_t* len, SDbCfgInfo* pDbCfg, STableCfg*
if
(
pCfg
->
ttl
>
0
)
{
*
len
+=
sprintf
(
buf
+
VARSTR_HEADER_SIZE
+
*
len
,
" TTL %d"
,
pCfg
->
ttl
);
}
if
(
TSDB_SUPER_TABLE
==
pCfg
->
tableType
||
TSDB_NORMAL_TABLE
==
pCfg
->
tableType
)
{
int32_t
nSma
=
0
;
for
(
int32_t
i
=
0
;
i
<
pCfg
->
numOfColumns
;
++
i
)
{
if
(
IS_BSMA_ON
(
pCfg
->
pSchemas
+
i
))
{
++
nSma
;
}
}
if
(
nSma
<
pCfg
->
numOfColumns
)
{
bool
smaOn
=
false
;
*
len
+=
sprintf
(
buf
+
VARSTR_HEADER_SIZE
+
*
len
,
" SMA("
);
for
(
int32_t
i
=
0
;
i
<
pCfg
->
numOfColumns
;
++
i
)
{
if
(
IS_BSMA_ON
(
pCfg
->
pSchemas
+
i
))
{
if
(
smaOn
)
{
*
len
+=
sprintf
(
buf
+
VARSTR_HEADER_SIZE
+
*
len
,
",`%s`"
,
(
pCfg
->
pSchemas
+
i
)
->
name
);
}
else
{
smaOn
=
true
;
*
len
+=
sprintf
(
buf
+
VARSTR_HEADER_SIZE
+
*
len
,
"`%s`"
,
(
pCfg
->
pSchemas
+
i
)
->
name
);
}
}
}
*
len
+=
sprintf
(
buf
+
VARSTR_HEADER_SIZE
+
*
len
,
")"
);
}
}
}
static
int32_t
setCreateTBResultIntoDataBlock
(
SSDataBlock
*
pBlock
,
SDbCfgInfo
*
pDbCfg
,
char
*
tbName
,
STableCfg
*
pCfg
)
{
...
...
source/os/src/osSysinfo.c
浏览文件 @
07fca212
...
...
@@ -327,17 +327,19 @@ bool getWinVersionReleaseName(char *releaseName, int32_t maxLen) {
}
#endif
int32_t
taosGetOsReleaseName
(
char
*
releaseName
,
int32_t
maxLen
)
{
int32_t
taosGetOsReleaseName
(
char
*
releaseName
,
char
*
sName
,
char
*
ver
,
int32_t
maxLen
)
{
#ifdef WINDOWS
if
(
!
getWinVersionReleaseName
(
releaseName
,
maxLen
))
{
snprintf
(
releaseName
,
maxLen
,
"Windows"
);
}
if
(
sName
)
snprintf
(
sName
,
maxLen
,
"Windows"
);
return
0
;
#elif defined(_TD_DARWIN_64)
char
osversion
[
32
];
size_t
osversion_len
=
sizeof
(
osversion
)
-
1
;
int
osversion_name
[]
=
{
CTL_KERN
,
KERN_OSRELEASE
};
if
(
sName
)
snprintf
(
sName
,
maxLen
,
"macOS"
);
if
(
sysctl
(
osversion_name
,
2
,
osversion
,
&
osversion_len
,
NULL
,
0
)
==
-
1
)
{
return
-
1
;
}
...
...
@@ -357,24 +359,35 @@ int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) {
return
0
;
#else
char
line
[
1024
];
char
*
dest
=
NULL
;
size_t
size
=
0
;
int32_t
code
=
-
1
;
int32_t
cnt
=
0
;
TdFilePtr
pFile
=
taosOpenFile
(
"/etc/os-release"
,
TD_FILE_READ
|
TD_FILE_STREAM
);
if
(
pFile
==
NULL
)
return
fals
e
;
if
(
pFile
==
NULL
)
return
cod
e
;
while
((
size
=
taosGetsFile
(
pFile
,
sizeof
(
line
),
line
))
!=
-
1
)
{
line
[
size
-
1
]
=
'\0'
;
if
(
strncmp
(
line
,
"PRETTY_NAME"
,
11
)
==
0
)
{
const
char
*
p
=
strchr
(
line
,
'='
)
+
1
;
if
(
*
p
==
'"'
)
{
p
++
;
line
[
size
-
2
]
=
0
;
}
tstrncpy
(
releaseName
,
p
,
maxLen
);
if
(
strncmp
(
line
,
"NAME"
,
4
)
==
0
)
{
dest
=
sName
;
}
else
if
(
strncmp
(
line
,
"PRETTY_NAME"
,
11
)
==
0
)
{
dest
=
releaseName
;
code
=
0
;
break
;
}
else
if
(
strncmp
(
line
,
"VERSION_ID"
,
10
)
==
0
)
{
dest
=
ver
;
}
else
{
continue
;
}
if
(
!
dest
)
continue
;
const
char
*
p
=
strchr
(
line
,
'='
)
+
1
;
if
(
*
p
==
'"'
)
{
p
++
;
line
[
size
-
2
]
=
0
;
}
tstrncpy
(
dest
,
p
,
maxLen
);
if
(
++
cnt
>=
3
)
break
;
}
taosCloseFile
(
&
pFile
);
...
...
source/os/test/osTests.cpp
浏览文件 @
07fca212
...
...
@@ -37,7 +37,7 @@ TEST(osTest, osSystem) {
const
int
sysLen
=
64
;
char
osSysName
[
sysLen
];
int
ret
=
taosGetOsReleaseName
(
osSysName
,
sysLen
);
int
ret
=
taosGetOsReleaseName
(
osSysName
,
NULL
,
NULL
,
sysLen
);
printf
(
"os systeme name:%s
\n
"
,
osSysName
);
ASSERT_EQ
(
ret
,
0
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录