Skip to content
Open
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 35 additions & 14 deletions pkg/actions/lua/databricks/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ import (
"net/url"
"regexp"
"strings"
"time"

"github.com/Shopify/go-lua"
"github.com/cenkalti/backoff/v4"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/config"
"github.com/databricks/databricks-sdk-go/service/catalog"
Expand Down Expand Up @@ -141,24 +143,43 @@ func (client *Client) RegisterExternalTable(l *lua.State) int {
if metadata != nil {
metadataMap = metadata.(map[string]any)
}
status, err := client.createExternalTable(warehouseID, catalogName, schemaName, tableName, location, metadataMap)
if err != nil {
if alreadyExists(err) {
err = client.deleteTable(catalogName, schemaName, tableName)
if err != nil {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}
status, err = client.createExternalTable(warehouseID, catalogName, schemaName, tableName, location, metadataMap)
if err != nil {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}
} else {

// check whether the the table already exists
_, err := client.workspaceClient.Tables.GetByFullName(client.ctx, tableFullName(catalogName, schemaName, tableName))
if err != nil && !errors.Is(err, databricks.ErrResourceDoesNotExist) {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}
// in case there is no error, table exists and we will delete it before creating a new one
if err == nil {
Comment on lines 148 to 154
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comment on the condition at the end that if no error, table exists and we need to delete it before creation.

note: the previous version had it in a function that just was a call, you can keep the function if you like to include the "is exists" logic, but you need to report the error.

err = client.deleteTable(catalogName, schemaName, tableName)
if err != nil {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}
}

var bo backoff.BackOff = backoff.NewExponentialBackOff(
backoff.WithInitialInterval(100*time.Millisecond), backoff.WithMaxInterval(3*time.Second), backoff.WithMaxElapsedTime(10*time.Second))
bo = backoff.WithContext(bo, client.ctx)

createTableBO := func() (string, error) {
status, err := client.createExternalTable(warehouseID, catalogName, schemaName, tableName, location, metadataMap)
if err != nil {
if alreadyExists(err) {
return "", err
}
return "", backoff.Permanent(err)
}
return status, nil
}

status, err := backoff.RetryWithData(createTableBO, bo)
if err != nil {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style

Suggested change
var bo backoff.BackOff = backoff.NewExponentialBackOff(
backoff.WithInitialInterval(100*time.Millisecond), backoff.WithMaxInterval(3*time.Second), backoff.WithMaxElapsedTime(10*time.Second))
bo = backoff.WithContext(bo, client.ctx)
createTableBO := func() (string, error) {
status, err := client.createExternalTable(warehouseID, catalogName, schemaName, tableName, location, metadataMap)
if err != nil {
if alreadyExists(err) {
return "", err
}
return "", backoff.Permanent(err)
}
return status, nil
}
status, err := backoff.RetryWithData(createTableBO, bo)
if err != nil {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}
bo := backoff.NewExponentialBackOff(
backoff.WithInitialInterval(100*time.Millisecond),
backoff.WithMaxInterval(3*time.Second),
backoff.WithMaxElapsedTime(10*time.Second),
)
status, err := backoff.RetryWithData(func() (string, error) {
status, err := client.createExternalTable(warehouseID, catalogName, schemaName, tableName, location, metadataMap)
if err != nil {
if alreadyExists(err) {
return "", err
}
return "", backoff.Permanent(err)
}
return status, nil
}, backoff.WithContext(bo, client.ctx))
if err != nil {
lua.Errorf(l, "%s", err.Error())
panic("unreachable")
}


l.PushString(status)
return 1
}
Expand Down
Loading