mirror of
https://github.com/dolthub/dolt.git
synced 2026-04-23 05:13:00 -05:00
migrate dolt gc to use sql queries
This commit is contained in:
+25
-37
@@ -16,9 +16,6 @@ package commands
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/fatih/color"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
|
||||
@@ -82,48 +79,39 @@ func (cmd GarbageCollectionCmd) EventType() eventsapi.ClientEventType {
|
||||
// Version displays the version of the running dolt client
|
||||
// Exec executes the command
|
||||
func (cmd GarbageCollectionCmd) Exec(ctx context.Context, commandStr string, args []string, dEnv *env.DoltEnv, cliCtx cli.CliContext) int {
|
||||
var verr errhand.VerboseError
|
||||
|
||||
ap := cmd.ArgParser()
|
||||
help, usage := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, gcDocs, ap))
|
||||
apr := cli.ParseArgsOrDie(ap, args, help)
|
||||
|
||||
// We assert this here simply because the implementation of GC can
|
||||
// delay actually trying to write to the chunk store for a long time
|
||||
// after doing a lot or work. It's better to fail early.
|
||||
if dEnv.IsAccessModeReadOnly() {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(env.ErrDatabaseIsLocked), help)
|
||||
queryist, sqlCtx, closeFunc, err := cliCtx.QueryEngine(ctx)
|
||||
if err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
if closeFunc != nil {
|
||||
defer closeFunc()
|
||||
}
|
||||
|
||||
var err error
|
||||
query, err := constructDoltGCQuery(apr)
|
||||
if err != nil {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
|
||||
_, _, err = queryist.Query(sqlCtx, query)
|
||||
if err != nil && err != chunks.ErrNothingToCollect {
|
||||
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
|
||||
}
|
||||
|
||||
return HandleVErrAndExitCode(nil, usage)
|
||||
}
|
||||
|
||||
// constructDoltGCQuery generates the sql query necessary to call DOLT_GC()
|
||||
func constructDoltGCQuery(apr *argparser.ArgParseResults) (string, error) {
|
||||
query := "call DOLT_GC("
|
||||
if apr.Contains(cli.ShallowFlag) {
|
||||
err = dEnv.DoltDB.ShallowGC(ctx)
|
||||
if err != nil {
|
||||
if err == chunks.ErrUnsupportedOperation {
|
||||
verr = errhand.BuildDError("this database does not support shallow garbage collection").Build()
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
}
|
||||
verr = errhand.BuildDError("an error occurred during garbage collection").AddCause(err).Build()
|
||||
}
|
||||
} else {
|
||||
// full gc
|
||||
dEnv, err = MaybeMigrateEnv(ctx, dEnv)
|
||||
if err != nil {
|
||||
verr = errhand.BuildDError("could not load manifest for gc").AddCause(err).Build()
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
}
|
||||
|
||||
err = dEnv.DoltDB.GC(ctx, nil)
|
||||
if err != nil {
|
||||
if errors.Is(err, chunks.ErrNothingToCollect) {
|
||||
cli.PrintErrln(color.YellowString("Nothing to collect."))
|
||||
} else {
|
||||
verr = errhand.BuildDError("an error occurred during garbage collection").AddCause(err).Build()
|
||||
}
|
||||
}
|
||||
query += "'--shallow'"
|
||||
}
|
||||
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
query += ")"
|
||||
return query, nil
|
||||
}
|
||||
|
||||
func MaybeMigrateEnv(ctx context.Context, dEnv *env.DoltEnv) (*env.DoltEnv, error) {
|
||||
|
||||
@@ -139,7 +139,6 @@ var commandsWithoutCliCtx = []cli.Command{
|
||||
commands.MigrateCmd{},
|
||||
indexcmds.Commands,
|
||||
commands.ReadTablesCmd{},
|
||||
commands.GarbageCollectionCmd{},
|
||||
commands.FilterBranchCmd{},
|
||||
commands.RootsCmd{},
|
||||
commands.VersionCmd{VersionStr: Version},
|
||||
|
||||
@@ -135,7 +135,6 @@ SKIP_SERVER_TESTS=$(cat <<-EOM
|
||||
~cli-hosted.bats~
|
||||
~profile.bats~
|
||||
~ls.bats~
|
||||
~reflog.bats~
|
||||
EOM
|
||||
)
|
||||
|
||||
|
||||
@@ -1294,3 +1294,47 @@ SQL
|
||||
|
||||
[[ "$localOutput" == "$remoteOutput" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-local-remote: verify dolt gc behavior" {
|
||||
cd altDB
|
||||
dolt sql <<SQL
|
||||
CREATE TABLE test (pk int PRIMARY KEY);
|
||||
INSERT INTO test VALUES
|
||||
(1),(2),(3),(4),(5);
|
||||
SQL
|
||||
run dolt sql -q 'select count(*) from test' -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
|
||||
run dolt --verbose-engine-setup gc
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "starting local mode" ]] || false
|
||||
|
||||
run dolt sql -q 'select count(*) from test' -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
|
||||
start_sql_server altDB
|
||||
dolt sql <<SQL
|
||||
CREATE TABLE test2 (pk int PRIMARY KEY);
|
||||
INSERT INTO test2 VALUES
|
||||
(1),(2),(3),(4),(5);
|
||||
SQL
|
||||
run dolt sql -q 'select count(*) from test' -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
run dolt sql -q 'select count(*) from test2' -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
|
||||
run dolt --verbose-engine-setup gc
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "starting remote mode" ]] || false
|
||||
|
||||
run dolt sql -q 'select count(*) from test' -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
run dolt sql -q 'select count(*) from test2' -r csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user