2.2 MiniOB的开发调试环境搭建
2.2.1 docker安装部署
顺带一提,本教程相关的材料方法都可以从这里获取:https://github.com/oceanbase/miniob,
本部分获得了大佬:徐文昊的碎碎念 的鼎立相助,https://www.xuwh.top,欢迎关注。
环境搭建有多种方式,可以参考源码中的docs文件,我个人经过踩坑,采用了下面这个方式,docker+vscode开发调试环境。docker官方建议在Ubuntu环境安装。这里我们在windows的wsl子系统使用docker搭建开发调试环境
看看自己电脑有没有开启虚拟化,没有的话自行百度解决。
https://hub.docker.com/,下一个docker
会提示下载linux子系统,这样性能更加出色,否则会使用虚拟机方式,参考官方链接配置即可。
到这里docker就装好了
2.2.2 源码部署与配置
在wsl中把代码clone下来。
sudo git clone https://github.com/oceanbase/miniob.git --depth 1
将dockerfile替换下,改了下官方的镜像文件 build出来的docker container加了 openssh-server 可以远程ssh到容器里,装了个zsh好用点,然后挂载了下本地目录。
# how to use # docker build -t miniob . # make sure docker has been installed # FROM rockylinux:8 FROM openanolis/anolisos:8.6 ARG HOME_DIR=/root ARG GIT_SOURCE=github ENV LANG=en_US.UTF-8 # install rpm # note: gcc-c++ in rockylinux 8 and gcc-g++ in rockylinux 9. use `dnf groupinfo "Development Tools"` to list the tools RUN dnf install -y make cmake git wget which flex gdb gcc gcc-c++ diffutils readline-devel texinfo # rockylinux:9 RUN dnf --enablerepo=crb install -y texinfo # rockylinux:8 # RUN dnf --enablerepo=powertools install -y texinfo # prepare env WORKDIR ${HOME_DIR} RUN echo alias ls="ls --color=auto" >> .bashrc RUN echo "export LD_LIBRARY_PATH=/usr/local/lib64:\$LD_LIBRARY_PATH" >> .bashrc # clone deps and compile deps RUN mkdir -p ${HOME_DIR}/deps WORKDIR ${HOME_DIR}/deps RUN git clone https://gitee.com/mirrors/libevent.git -b release-2.1.12-stable \ && mkdir -p ${HOME_DIR}/deps/libevent/build \ && cmake -DEVENT__DISABLE_OPENSSL=ON -B ${HOME_DIR}/deps/libevent/build ${HOME_DIR}/deps/libevent \ && make -C ${HOME_DIR}/deps/libevent/build -j install \ && rm -rf ${HOME_DIR}/deps/* RUN git clone https://gitee.com/mirrors/jsoncpp.git \ && mkdir -p ${HOME_DIR}/deps/jsoncpp/build \ && cmake -DJSONCPP_WITH_TESTS=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF -B ${HOME_DIR}/deps/jsoncpp/build ${HOME_DIR}/deps/jsoncpp/ \ && make -C ${HOME_DIR}/deps/jsoncpp/build -j install \ && rm -rf ${HOME_DIR}/deps/* RUN git clone https://gitee.com/mirrors/googletest.git \ && mkdir -p ${HOME_DIR}/deps/googletest/build \ && cmake -B ${HOME_DIR}/deps/googletest/build ${HOME_DIR}/deps/googletest \ && make -C ${HOME_DIR}/deps/googletest/build -j install \ && rm -rf ${HOME_DIR}/deps/* RUN wget http://ftp.gnu.org/gnu/bison/bison-3.7.tar.gz \ && tar xzvf bison-3.7.tar.gz \ && cd bison-3.7 \ && ./configure --prefix=/usr/local \ && make -j install \ && rm -rf ${HOME_DIR}/deps/* # install openssh RUN yum -y install openssh openssh-clients openssh-server RUN echo "root:root" | chpasswd #修改root密码 RUN mkdir /var/run/sshd RUN ssh-keygen -A RUN yum install -y zsh \ && git clone https://gitee.com/mirrors/ohmyzsh.git ~/.oh-my-zsh \ && cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc \ && sed -i "s/robbyrussell/bira/" ~/.zshrc \ && usermod --shell /bin/zsh root \ && echo "export LD_LIBRARY_PATH=/usr/local/lib64:\$LD_LIBRARY_PATH" >> ~/.zshrc # clone miniob code RUN mkdir -p ${HOME_DIR}/source # WORKDIR ${HOME_DIR}/source # RUN git clone https://${GIT_SOURCE}.com/oceanbase/miniob # RUN echo "mkdir -p build && cd build && cmake .. -DDEBUG=ON -DCMAKE_C_COMPILER=`which gcc` -DCMAKE_CXX_COMPILER=`which g++` && make -j4" > ${HOME_DIR}/source/miniob/build.sh && chmod +x ${HOME_DIR}/source/miniob/build.sh # RUN mkdir -p ${HOME_DIR}/source/miniob/build # WORKDIR ${HOME_DIR}/source/miniob/build # RUN cmake -B ${HOME_DIR}/source/miniob/build -DDEBUG=ON -DCMAKE_C_COMPILER=`which gcc` -DCMAKE_CXX_COMPILER=`which g++` ${HOME_DIR}/source/miniob/ \ # && make -j4 \ # && rm -rf ${HOME_DIR}/source/miniob/build WORKDIR ${HOME_DIR} RUN echo -e "#!/bin/bash\n/usr/sbin/sshd -D\ntail -f /dev/null" > ${HOME_DIR}/docker-starter.sh && chmod +x ${HOME_DIR}/docker-starter.sh ENTRYPOINT ./${HOME_DIR}/docker-starter.sh # ENTRYPOINT ["/usr/sbin/sshd", "-D", "tail", "-f", "/dev/null"]
将docker-compose.yml改下,图中标红的前部分地址换成自己wsl中项目的根目录地址(pwd命令就可以获得)
version: "3.9" services: miniob: build: . privileged: true ports: - "10000:22" volumes: - /home/huawei-pc/miniob/miniob:/root/source/miniob # host:container restart: unless-stopped
项目根目录下执行。
docker-compose up -d --build
检查下容器有没有起来。图中跑的就是。
2.3.3 基于vscode远程ssh开发
官网下载、安装vscode,https://code.visualstudio.com/docs/?dv=win
安装remote-ssh插件。
然后进项远程的ssh调试,
Ctrl + Shift + p, 输入 >Remote-SSH:Connect to Host. 回车.
输入:ssh root@localhost -p 10000,如果要选config任意选个就行,我选的第一个
右下角会弹出下面的框框,选择connect
linux,不需要解释吧。
continue,回车,输密码回车,密码是 root
控制台输出了一大堆,总之是好了。
打开文件夹,/root/source/miniob,回车
输入密码root,回车,信任。
文件就愉快的导入进来了。
安装如下插件:
C/C++
C/C++ Extension Pack
CMake
CMake Tools
CMake 装完配置一下, 点下方蓝色条子里的 Kit 选 GCC 8.5.0, 然后点旁边的build.
build成功了。
Ctrl+shift+p,然后输入task,点击第一个选项即可配置。在工程的 .vscode 目录下新建 tasks.json
create task.json …
others
改下内容。
{ "options": { "cwd": "${workspaceFolder}/build" }, "tasks": [ { "label": "cmake", "command": "cmake", "args": [ "-DDEBUG=ON", ".." ] }, { "label": "make", "command": "make" }, { "label": "CMake Build", "dependsOn": [ "cmake", "make" ] } ], "version": "2.0.0" }
注意:
- options:cmake临时文件的目录
- args:cmake需要的参数
在工程的 .vscode 目录下新建 launch.json
{ "version": "0.2.0", "configurations": [ { "name": "(gdb) for wangzhou", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/bin/observer", "args": ["-f", "../../etc/observer.ini"], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "enable pretty printing", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "gdb-set disassembly-flavor intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "CMake Build" } ] }
注意:
- program:编译出来的可执行文件
- args:运行参数
- preLaunchTask:
"label": "CMake Build"
对应 - 启动miniob的服务端,打开 /src/observer/main.cpp,按F5就能执行了,断点也正常用,下图输出就说明服务端启动成功咯。
还可以看到生成的日志文件。
再启动客户端。在vscode的底部打开一个新的terminal窗口。
./build/bin/obclient
跑两个玩玩。
miniob > help; show tables; desc `table name`; create table `table name` (`column name` `column type`, ...); create index `index name` on `table` (`column`); insert into `table` values(`value1`,`value2`); update `table` set column=value [where `column`=`value`]; delete from `table` [where `column`=`value`]; select [ * | `columns` ] from `table`; miniob > show tables; No table
更多参考下docs文件中的how_to_dev_miniob_by_vscode.md即可。