Skip to content

Rest: Implement register table #1521

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

gabeiglio
Copy link

Which issue does this PR close?

What changes are included in this PR?

  • New type for RegisterTableRequest
  • New method in rest catalog for implementing register table

Are these changes tested?

  • 2 unit tests for a successful registered table operation and a failed one due to namespace is non existent
  • Integration tests for a successful registered table operation

Im new to Rust so any feedback is welcomed! :)

@gabeiglio gabeiglio force-pushed the rest-register-table branch from 0bfda56 to 5c342f3 Compare July 17, 2025 07:52
Comment on lines +804 to +814
StatusCode::SERVICE_UNAVAILABLE => {
return Err(Error::new(
ErrorKind::Unexpected,
"The service is not ready to handle the request.",
));
}
StatusCode::INTERNAL_SERVER_ERROR => {
return Err(Error::new(
ErrorKind::Unexpected,
"An unknown server-side problem occurred; the commit state is unknown.",
));
Copy link
Author

Choose a reason for hiding this comment

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

Not sure if these are needed

@gabeiglio gabeiglio marked this pull request as ready for review July 17, 2025 16:37
Comment on lines +780 to +791
StatusCode::UNAUTHORIZED => {
return Err(Error::new(
ErrorKind::Unexpected,
"Authenticated user does not have the necessary permissions.",
));
}
StatusCode::FORBIDDEN => {
return Err(Error::new(
ErrorKind::Unexpected,
"Authenticated user does not have the necessary permissions.",
));
}
Copy link
Author

Choose a reason for hiding this comment

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

Also not sure if we need to check for these cases

Copy link
Contributor

Choose a reason for hiding this comment

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

Following iceberg-java's error handling logic, I think it's necessary to handle all of these error codes

Copy link
Contributor

@CTTY CTTY left a comment

Choose a reason for hiding this comment

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

Hi @gabeiglio , thanks for your contribution! I've left some suggestions

}
StatusCode::CONFLICT => {
return Err(Error::new(
ErrorKind::TableAlreadyExists,
Copy link
Contributor

Choose a reason for hiding this comment

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

This should use ErrorKind::CatalogCommitConflicts and should be explicitly set to retryable using with_retryable(true)

@@ -745,10 +749,86 @@ impl Catalog for RestCatalog {
_table_ident: &TableIdent,
Copy link
Contributor

Choose a reason for hiding this comment

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

the _ prefix is for unused variables, we should remove it since now it's implemented

@@ -745,10 +749,86 @@ impl Catalog for RestCatalog {
_table_ident: &TableIdent,
_metadata_location: String,
Copy link
Contributor

Choose a reason for hiding this comment

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

Same here with the _ prefix

Comment on lines +780 to +791
StatusCode::UNAUTHORIZED => {
return Err(Error::new(
ErrorKind::Unexpected,
"Authenticated user does not have the necessary permissions.",
));
}
StatusCode::FORBIDDEN => {
return Err(Error::new(
ErrorKind::Unexpected,
"Authenticated user does not have the necessary permissions.",
));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Following iceberg-java's error handling logic, I think it's necessary to handle all of these error codes

let metadata_location = response.metadata_location.as_ref().ok_or(Error::new(
ErrorKind::DataInvalid,
"Metadata location missing in `register_table` response!",
))?;
Copy link
Contributor

Choose a reason for hiding this comment

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

nit: this can be slightly simplified using some syntax sugar

let Some(metadata_location) = response.metadata_location else { return Err(Error::new(...)) }

let file_io = self.load_file_io(metadata_location, None).await?;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implement register_table for rest catalog
2 participants