Skip to content

Commit

Permalink
feature(development): Better developer experience with Goland and Mak…
Browse files Browse the repository at this point in the history
…efile

1. Create `Debug` target for `Docker`, which allows remote debugging
2. Allow running `gemini` as a `Docker` container from `Makefile`. This replicates the production environment inside SCT
3. Added IDEA run configurations for `gemini` and `gemini-tests` to run inside `Docker` container

Signed-off-by: Dusan Malusev <[email protected]>
  • Loading branch information
CodeLieutenant committed Nov 24, 2024
1 parent 3f163b9 commit 5e71bed
Show file tree
Hide file tree
Showing 10 changed files with 232 additions and 64 deletions.
13 changes: 13 additions & 0 deletions .run/Cassandra Oracle.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Cassandra Oracle" type="docker-deploy" factoryName="docker-compose.yml" server-name="Docker">
<deployment type="docker-compose.yml">
<settings>
<option name="envFilePath" value="" />
<option name="removeVolumesOnComposeDown" value="true" />
<option name="sourceFilePath" value="docker/docker-compose-cassandra.yml" />
<option name="upTimeout" value="60" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
32 changes: 32 additions & 0 deletions .run/Debug Gemini Docker.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Debug Gemini Docker" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="scylladb/gemini:dev" />
<option name="attachToContainerNeeded" value="true" />
<option name="buildCliOptions" value="--compress --target debug --platform linux/amd64/v3" />
<option name="command" value="--fail-fast --level=info --non-interactive --consistency=LOCAL_QUORUM --test-host-selection-policy=token-aware --oracle-host-selection-policy=token-aware --mode=mixed --non-interactive --request-timeout=5s --connect-timeout=15s --use-server-timestamps=false --async-objects-stabilization-attempts=10 --max-mutation-retries=10 --replication-strategy=&quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --oracle-replication-strategy=&quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --concurrency=16 --dataset-size=large --seed=93 --schema-seed=93 --cql-features=normal --duration=15m --warmup=1m --profiling-port=6060 --drop-schema=true --test-cluster=gemini-test --oracle-cluster=gemini-oracle --outfile=stdout --verbose=true --test-statement-log-file=/test.log --oracle-statement-log-file=/oracle.log" />
<option name="containerName" value="gemini" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="6060" />
<option name="hostPort" value="6060" />
</DockerPortBindingImpl>
<DockerPortBindingImpl>
<option name="containerPort" value="2112" />
<option name="hostPort" value="2112" />
</DockerPortBindingImpl>
<DockerPortBindingImpl>
<option name="containerPort" value="2345" />
<option name="hostPort" value="2345" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="-m 4G -w / --network gemini" />
<option name="sourceFilePath" value="Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
28 changes: 28 additions & 0 deletions .run/Run Gemini Docker.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Gemini Docker" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="scylladb/gemini:dev" />
<option name="attachToContainerNeeded" value="true" />
<option name="buildCliOptions" value="--compress --target production --platform linux/amd64/v3" />
<option name="command" value="--fail-fast --level=info --non-interactive --consistency=LOCAL_QUORUM --test-host-selection-policy=token-aware --oracle-host-selection-policy=token-aware --mode=mixed --non-interactive --request-timeout=5s --connect-timeout=15s --use-server-timestamps=false --async-objects-stabilization-attempts=10 --max-mutation-retries=10 --replication-strategy=&quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --oracle-replication-strategy=&quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --concurrency=16 --dataset-size=large --seed=93 --schema-seed=93 --cql-features=normal --duration=15m --warmup=1m --profiling-port=6060 --drop-schema=true --test-cluster=gemini-test --oracle-cluster=gemini-oracle --outfile=stdout --verbose=true --test-statement-log-file=/test.log --oracle-statement-log-file=/oracle.log" />
<option name="containerName" value="gemini" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="6060" />
<option name="hostPort" value="6060" />
</DockerPortBindingImpl>
<DockerPortBindingImpl>
<option name="containerPort" value="2112" />
<option name="hostPort" value="2112" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="-m 4G -w / --network gemini" />
<option name="sourceFilePath" value="Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
13 changes: 13 additions & 0 deletions .run/Run Gemini Mixed.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Gemini Mixed" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="gemini" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-gcflags &quot;all=-N -l&quot;" />
<parameters value="--mode mixed --seed=150 --schema-seed=150 --dataset-size=large --cql-features normal --warmup 0 --duration 2m --drop-schema true --fail-fast --level info --test-host-selection-policy token-aware --oracle-host-selection-policy token-aware --test-cluster=192.168.100.2 --oracle-cluster=192.168.100.3 --non-interactive --request-timeout 180s --connect-timeout 120s --use-server-timestamps false --async-objects-stabilization-attempts 10 --async-objects-stabilization-backoff 100ms --replication-strategy &quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --oracle-replication-strategy &quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --max-mutation-retries 5 --max-mutation-retries-backoff 1000ms --concurrency 16 --profiling-port 6060" />
<kind value="PACKAGE" />
<package value="github.com/scylladb/gemini/cmd/gemini" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/cmd/gemini/main.go" />
<method v="2" />
</configuration>
</component>
13 changes: 13 additions & 0 deletions .run/Run Gemini Read.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Gemini Read" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="gemini" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-gcflags &quot;all=-N -l&quot;" />
<parameters value="--mode read --seed=100 --schema-seed=100 --dataset-size=small --cql-features normal --warmup 0 --duration 2m --drop-schema true --fail-fast --level info --test-host-selection-policy token-aware --oracle-host-selection-policy token-aware --test-cluster=192.168.100.2 --oracle-cluster=192.168.100.3 --non-interactive --request-timeout 180s --connect-timeout 120s --use-server-timestamps false --async-objects-stabilization-attempts 10 --async-objects-stabilization-backoff 100ms --replication-strategy &quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --oracle-replication-strategy &quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --max-mutation-retries 5 --max-mutation-retries-backoff 1000ms --concurrency 1 --profiling-port 6060" />
<kind value="PACKAGE" />
<package value="github.com/scylladb/gemini/cmd/gemini" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/cmd/gemini/main.go" />
<method v="2" />
</configuration>
</component>
13 changes: 13 additions & 0 deletions .run/Run Gemini Write.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Gemini Write" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="gemini" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-gcflags &quot;all=-N -l&quot;" />
<parameters value="--mode write --seed=100 --schema-seed=100 --dataset-size=small --cql-features normal --warmup 0 --duration 2m --drop-schema true --fail-fast --level info --test-host-selection-policy token-aware --oracle-host-selection-policy token-aware --test-cluster=192.168.100.2 --oracle-cluster=192.168.100.3 --non-interactive --request-timeout 180s --connect-timeout 120s --use-server-timestamps false --async-objects-stabilization-attempts 10 --async-objects-stabilization-backoff 100ms --replication-strategy &quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --oracle-replication-strategy &quot;{'class': 'NetworkTopologyStrategy', 'replication_factor': '1'}&quot; --max-mutation-retries 5 --max-mutation-retries-backoff 1000ms --concurrency 1 --profiling-port 6060" />
<kind value="PACKAGE" />
<package value="github.com/scylladb/gemini/cmd/gemini" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/cmd/gemini/main.go" />
<method v="2" />
</configuration>
</component>
13 changes: 13 additions & 0 deletions .run/Scylla Oracle.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Scylla Oracle" type="docker-deploy" factoryName="docker-compose.yml" server-name="Docker">
<deployment type="docker-compose.yml">
<settings>
<option name="envFilePath" value="" />
<option name="removeVolumesOnComposeDown" value="true" />
<option name="sourceFilePath" value="docker/docker-compose-scylla.yml" />
<option name="upTimeout" value="60" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
14 changes: 14 additions & 0 deletions .run/Tests.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Tests" type="GoTestRunConfiguration" factoryName="Go Test">
<module name="gemini" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-timeout 5m -race" />
<kind value="DIRECTORY" />
<package value="github.com/scylladb/gemini" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<framework value="gotest" />
<pattern value="./..." />
<method v="2" />
</configuration>
</component>
32 changes: 32 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ ENV GOAMD64=v3
ENV GOARM64=v8.3,crypto
ENV CFLAGS="-O3"
ENV CXXFLAGS="-O3"
ENV DEBIAN_FRONTEND="noninteractive"
ENV TZ="UTC"

WORKDIR /gemini

Expand All @@ -15,22 +17,52 @@ RUN apt-get update \
&& apt-get install -y build-essential ca-certificates libc-dev \
&& make build

FROM build AS debug

ENV GODEBUG="default=go1.23,cgocheck=1,disablethp=0,panicnil=0,http2client=1,http2server=1,asynctimerchan=0,madvdontneed=0"
ENV PATH="/gemini/bin:${PATH}"

RUN apt-get install -y gdb gcc iputils-ping mlocate vim \
&& make debug-build \
&& go install github.com/go-delve/delve/cmd/dlv@latest \
&& updatedb

EXPOSE 6060
EXPOSE 2121
EXPOSE 2345

ENTRYPOINT [ \
"dlv", "exec", "--log", "--listen=0.0.0.0:2345", "--allow-non-terminal-interactive", \
"--headless", "--api-version=2", "--accept-multiclient", \
"/gemini/bin/gemini", "--" \
]

FROM busybox AS production

WORKDIR /

ENV GODEBUG="default=go1.23,cgocheck=0,disablethp=0,panicnil=0,http2client=1,http2server=1,asynctimerchan=0,madvdontneed=0"

COPY --from=build /gemini/bin/gemini /usr/local/bin/gemini

ENV PATH="/usr/local/bin:${PATH}"

EXPOSE 6060
EXPOSE 2121

ENTRYPOINT ["gemini"]

FROM busybox AS production-goreleaser

ENV GODEBUG="default=go1.23,cgocheck=0,disablethp=0,panicnil=0,http2client=1,http2server=1,asynctimerchan=0,madvdontneed=0"

WORKDIR /

COPY gemini /usr/local/bin/gemini

ENV PATH="/usr/local/bin:${PATH}"

EXPOSE 6060
EXPOSE 2121

ENTRYPOINT ["gemini"]
Loading

0 comments on commit 5e71bed

Please sign in to comment.