Merge branch '1.2.4'
commit
3ecc09cb77
27
README.MD
27
README.MD
|
@ -18,9 +18,10 @@ STVM(truck of Virtual memory table)是一个开源的使用ANSI C语言编
|
||||||
***使用须知***
|
***使用须知***
|
||||||
* 表空间大小在创建时已经确定, 一旦创建不能随意修改大小。
|
* 表空间大小在创建时已经确定, 一旦创建不能随意修改大小。
|
||||||
* 多机集群无法使用事务。
|
* 多机集群无法使用事务。
|
||||||
* 数据无法持久化(宕机情况), 可以定时利用接口备份。
|
* 数据无法持久化(宕机情况)。
|
||||||
* 索引长度限制(默认64字节),修改需编译项目。
|
* 索引长度限制(默认64字节),修改需编译项目。
|
||||||
* 启动后不能修改表字段,但可以修改字段别名
|
* 启动后不能修改表字段,但可以修改字段别名
|
||||||
|
* 单机模式下,进程要设置退出接口,避免kill -9将正在操作内存表的进程杀死造成死锁(可用stvm -l table来重置锁)
|
||||||
|
|
||||||
建议使用场景:***数据库缓存、数据缓存、事件驱动***
|
建议使用场景:***数据库缓存、数据缓存、事件驱动***
|
||||||
|
|
||||||
|
@ -46,7 +47,7 @@ cd src目录 **./make**
|
||||||
* **TVMCFG=$(TVMDBD)/.tvm.run** 启动参数
|
* **TVMCFG=$(TVMDBD)/.tvm.run** 启动参数
|
||||||
|
|
||||||
使用方法:
|
使用方法:
|
||||||
如果不使用多机集群,无需配置域文件,缺省本地启动(该版本对集群支持较弱, 时间有限,稍后更新,请悉知)。
|
如果不使用多机集群,无需配置域文件,缺省本地启动。
|
||||||
|
|
||||||
启动系统
|
启动系统
|
||||||
> stvm -w
|
> stvm -w
|
||||||
|
@ -55,11 +56,8 @@ cd src目录 **./make**
|
||||||
> stvm -s
|
> stvm -s
|
||||||
|
|
||||||
STVM也提供一个类型sqlpuls类型简单工具。
|
STVM也提供一个类型sqlpuls类型简单工具。
|
||||||
进入SQL界面, 该工具主要用来运维调试使用,其中showmode显示模式ROW|COLUMN,showsize单次显示记录数,也可用封装该指令的脚本**msql**进入
|
进入SQL界面, 该工具主要用来运维调试使用
|
||||||
> stvm SQL --showmode=row --showsize=8
|
> stvm SQL
|
||||||
|
|
||||||
批量执行M-SQL脚本**exsql**,也可直接执行
|
|
||||||
>stvm SQL --msql=msql.bat
|
|
||||||
|
|
||||||
域的维护
|
域的维护
|
||||||
> stvm DOM
|
> stvm DOM
|
||||||
|
@ -70,7 +68,7 @@ STVM也提供一个类型sqlpuls类型简单工具。
|
||||||
配置域完成后,可以配置编译到$TVMCFG下
|
配置域完成后,可以配置编译到$TVMCFG下
|
||||||
> stvm -c stvm.conf
|
> stvm -c stvm.conf
|
||||||
|
|
||||||
然后在 **stvm -w** 启动即可
|
然后在stvm -w启动即可
|
||||||
|
|
||||||
建议以单机模式64位下运行,将性能发挥在极致。
|
建议以单机模式64位下运行,将性能发挥在极致。
|
||||||
|
|
||||||
|
@ -124,11 +122,20 @@ STVM也提供一个类型sqlpuls类型简单工具。
|
||||||
创建队列语法示例:
|
创建队列语法示例:
|
||||||
在M-SQL中执行 create que_user_info.def
|
在M-SQL中执行 create que_user_info.def
|
||||||
|
|
||||||
|
|
||||||
**下本版本:**
|
**下本版本:**
|
||||||
* 0、新增分布式锁
|
* 0、新增分布式锁
|
||||||
* 1、新增多机资源共享方式。
|
* 1、新增多机资源共享方式。
|
||||||
* 2、JAVA接口开发
|
* 2、基于raft协议计算分布式集群
|
||||||
|
* 3、JAVA接口开发
|
||||||
|
|
||||||
|
|
||||||
**不定时更新**
|
**不定时更新**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
#### *常见错误集合* ####
|
||||||
|
```
|
||||||
|
Q、failed to boot TVM, Invalid parameter or sem has disappeared
|
||||||
|
A:echo "500 X X X" > /proc/sys/kernel/sem
|
||||||
|
```
|
||||||
|
|
|
@ -29,8 +29,9 @@ POPUP=popup
|
||||||
PRESSURE=press_demo
|
PRESSURE=press_demo
|
||||||
TVMPUSH=tvmpush
|
TVMPUSH=tvmpush
|
||||||
ASYPUSH=asypush
|
ASYPUSH=asypush
|
||||||
|
THREAD=thread_demo
|
||||||
|
|
||||||
all: $(CREATE) $(INSERT) $(QUEUE) $(PUSH) $(POP) $(SELECT) $(QUERY) $(DELETE) $(UPDATE) $(COUNT) $(GROUP) $(EXTREME) $(TRUNCATE) $(DROP) $(PRESSURE) $(CLICK) $(POPUP) $(REPLACE) $(TVMPUSH) $(ASYPUSH) $(TVMPOP) $(TVMREPLACE) clean
|
all: $(CREATE) $(INSERT) $(QUEUE) $(PUSH) $(POP) $(SELECT) $(QUERY) $(DELETE) $(UPDATE) $(COUNT) $(GROUP) $(EXTREME) $(TRUNCATE) $(DROP) $(PRESSURE) $(CLICK) $(POPUP) $(REPLACE) $(TVMPUSH) $(ASYPUSH) $(TVMPOP) $(TVMREPLACE) $(THREAD) clean
|
||||||
$(CREATE): create_table.o
|
$(CREATE): create_table.o
|
||||||
$(CC) -o $@ $< $(LIBDIR)
|
$(CC) -o $@ $< $(LIBDIR)
|
||||||
$(TVMREPLACE): tvmreplace.o
|
$(TVMREPLACE): tvmreplace.o
|
||||||
|
@ -75,6 +76,8 @@ $(POPUP): popup.o
|
||||||
$(CC) -o $@ $< $(LIBDIR)
|
$(CC) -o $@ $< $(LIBDIR)
|
||||||
$(PRESSURE): press_demo.o
|
$(PRESSURE): press_demo.o
|
||||||
$(CC) -o $@ $< $(LIBDIR)
|
$(CC) -o $@ $< $(LIBDIR)
|
||||||
|
$(THREAD): thread_demo.o
|
||||||
|
$(CC) -o $@ $< $(LIBDIR)
|
||||||
|
|
||||||
.SUFFIXES: .c .o
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
#include "tmain.h"
|
||||||
|
|
||||||
|
#define QUEUE_USER_INFO 21
|
||||||
|
|
||||||
|
typedef struct __QUEUE_USER_INFO
|
||||||
|
{
|
||||||
|
long acct_id;
|
||||||
|
char user_no[21];
|
||||||
|
char user_type[2];
|
||||||
|
char user_nm[81];
|
||||||
|
char user_addr[161];
|
||||||
|
char user_phone[31];
|
||||||
|
}dbUser;
|
||||||
|
|
||||||
|
typedef unsigned long long uint64;
|
||||||
|
extern uint64 get_tick_time();
|
||||||
|
|
||||||
|
typedef struct _ST_ARG_
|
||||||
|
{
|
||||||
|
int threadIndex;
|
||||||
|
uint64 rows;
|
||||||
|
uint64 start;
|
||||||
|
}ARG;
|
||||||
|
|
||||||
|
void* vPushUserInfo(void *arg)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
dbUser stUser;
|
||||||
|
ARG *pArgInfo = (ARG *)arg;
|
||||||
|
SATvm *pstSavm = (SATvm *)pCloneSATvm();
|
||||||
|
|
||||||
|
queueinit(pstSavm, stUser, QUEUE_USER_INFO); // 绑定变量
|
||||||
|
for(i = 0; i < pArgInfo->rows; i++)
|
||||||
|
{
|
||||||
|
stUser.acct_id = pArgInfo->start + i; // 对结构体赋值
|
||||||
|
strcpy(stUser.user_no, "20180223"); // 对结构体赋值
|
||||||
|
strcpy(stUser.user_type, "1"); // 对结构体赋值
|
||||||
|
strcpy(stUser.user_nm, "Savens Liu"); // 对结构体赋值
|
||||||
|
strcpy(stUser.user_addr, "China"); // 对结构体赋值
|
||||||
|
strcpy(stUser.user_phone, "18672911111"); // 对结构体赋值
|
||||||
|
|
||||||
|
if(RC_SUCC != lPush(pstSavm)) // 插入记录
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Insert error:(%d)(%s)\n", pstSavm->m_lErrno,
|
||||||
|
sGetTError(pstSavm->m_lErrno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vCloneFree(pstSavm);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
uint64 uTime = 0;
|
||||||
|
ARG arg[100];
|
||||||
|
pthread_t thread[10];
|
||||||
|
int i = 0, j = 0, rows = 0, num;
|
||||||
|
SATvm *pstSavm = (SATvm *)pGetSATvm();
|
||||||
|
|
||||||
|
if(1 != argc)
|
||||||
|
num = strlen(argv[1])>0?atoi(argv[1]):1;
|
||||||
|
else
|
||||||
|
num = 1;
|
||||||
|
|
||||||
|
/* 初始化QUEUE_USER_INFO表,每张表都需要初始化一次, 对于表重建后,需要重新初始化一次。*/
|
||||||
|
vHoldConnect(pstSavm);
|
||||||
|
if(RC_SUCC != lAttchTable(pstSavm, QUEUE_USER_INFO))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "attch failed, err:(%d)(%s)\n", pstSavm->m_lErrno, sGetTError(pstSavm->m_lErrno));
|
||||||
|
return RC_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows = 4000000 / num;
|
||||||
|
for(uTime = get_tick_time(); i < num; i++)
|
||||||
|
{
|
||||||
|
arg[i].threadIndex = i + 1;
|
||||||
|
arg[i].start = rows * i;
|
||||||
|
arg[i].rows = rows;
|
||||||
|
pthread_create(&thread[i], NULL, vPushUserInfo, (void*)&arg[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(j = 0; j < num; j++)
|
||||||
|
pthread_join(thread[j], NULL);
|
||||||
|
|
||||||
|
fprintf(stdout, "cost_time:[%lld]\r\n", get_tick_time() - uTime);
|
||||||
|
vTvmDisconnect(pstSavm);
|
||||||
|
|
||||||
|
fprintf(stdout, "新增记录成功, completed successfully!!!\n");
|
||||||
|
fflush(stderr);
|
||||||
|
return RC_SUCC;
|
||||||
|
}
|
|
@ -62,7 +62,6 @@
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
typedef short int sint;
|
typedef short int sint;
|
||||||
|
|
|
@ -166,6 +166,12 @@ long lRestoreTables(SATvm *pstSavm)
|
||||||
snprintf(szPath, sizeof(szPath), "%s/backup", getenv("TVMDBD"));
|
snprintf(szPath, sizeof(szPath), "%s/backup", getenv("TVMDBD"));
|
||||||
if ((NULL == (dir = opendir(szPath))))
|
if ((NULL == (dir = opendir(szPath))))
|
||||||
{
|
{
|
||||||
|
if(ENOENT == errno)
|
||||||
|
{
|
||||||
|
mkdir(szPath, S_IRWXU | S_IRGRP);
|
||||||
|
return RC_SUCC;
|
||||||
|
}
|
||||||
|
|
||||||
vRedeError(pstSavm->m_lErrno = 127, strerror(errno));
|
vRedeError(pstSavm->m_lErrno = 127, strerror(errno));
|
||||||
return RC_FAIL;
|
return RC_FAIL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2988,7 +2988,7 @@ long _lSelectSyntax(SATvm *pstSavm, char *pszSQL, char *pszFile, char *pszDem
|
||||||
return RC_FAIL;
|
return RC_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((p = strcasestr(szWhere, "group")) || (p = strcasestr(szWhere, "order")))
|
if((p = strcasestr(szWhere, " group ")) || (p = strcasestr(szWhere, " order ")))
|
||||||
{
|
{
|
||||||
strcpy(szAdorn, p);
|
strcpy(szAdorn, p);
|
||||||
memset(p, 0, sizeof(szWhere) - (p - szWhere));
|
memset(p, 0, sizeof(szWhere) - (p - szWhere));
|
||||||
|
@ -3008,7 +3008,7 @@ long _lSelectSyntax(SATvm *pstSavm, char *pszSQL, char *pszFile, char *pszDem
|
||||||
}
|
}
|
||||||
|
|
||||||
sltrim(szTable);
|
sltrim(szTable);
|
||||||
if((p = strcasestr(szTable, "group")) || (p = strcasestr(szTable, "order")))
|
if((p = strcasestr(szTable, " group ")) || (p = strcasestr(szTable, " order ")))
|
||||||
{
|
{
|
||||||
strcpy(szAdorn, p);
|
strcpy(szAdorn, p);
|
||||||
memset(p, 0, sizeof(szTable) - (p - szTable));
|
memset(p, 0, sizeof(szTable) - (p - szTable));
|
||||||
|
|
|
@ -569,6 +569,7 @@ long lAttchTable(SATvm *pstSovm, TABLE t)
|
||||||
return RC_FAIL;
|
return RC_FAIL;
|
||||||
|
|
||||||
memcpy((RunTime *)pGetRunTime(pstSovm, t), pstRun, sizeof(RunTime));
|
memcpy((RunTime *)pGetRunTime(pstSovm, t), pstRun, sizeof(RunTime));
|
||||||
|
vSetQueueAttch(pstRun, 1);
|
||||||
return RC_SUCC;
|
return RC_SUCC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue