adutra commented on code in PR #8857:
URL: https://github.com/apache/iceberg/pull/8857#discussion_r1364085322
##########
nessie/src/main/java/org/apache/iceberg/nessie/NessieIcebergClient.java:
##########
@@ -181,23 +183,65 @@ public IcebergTable table(TableIdentifier
tableIdentifier) {
}
public void createNamespace(Namespace namespace, Map<String, String>
metadata) {
+ getRef().checkMutable();
+
+ if (namespace.isEmpty()) {
+ throw new IllegalArgumentException("Creating empty namespaces is not
supported");
+ }
+
try {
- getRef().checkMutable();
- withReference(
- getApi()
- .createNamespace()
-
.namespace(org.projectnessie.model.Namespace.of(namespace.levels()))
- .properties(metadata))
- .create();
- refresh();
- } catch (NessieNamespaceAlreadyExistsException e) {
- throw new AlreadyExistsException(e, "Namespace already exists: %s",
namespace);
- } catch (NessieNotFoundException e) {
+ org.projectnessie.model.Namespace content =
+ org.projectnessie.model.Namespace.of(metadata, namespace.levels());
+ ContentKey key = content.toContentKey();
+
+ CommitMultipleOperationsBuilder commitBuilder =
+ api.commitMultipleOperations()
+ .commitMeta(NessieUtil.buildCommitMetadata("create namespace " +
key, catalogOptions))
+ .operation(Operation.Put.of(key, content));
+
+ Tasks.foreach(commitBuilder)
+ .retry(5)
+ // conflict can be thrown when parent namespace doesn't exist;
+ // bad request can be thrown when namespace already exists.
+ .stopRetryOn(
+ NessieNotFoundException.class,
+ NessieConflictException.class,
+ NessieBadRequestException.class)
+ .throwFailureWhenFinished()
+ .onFailure((o, exception) -> refresh())
+ .run(
+ b -> {
+ Branch branch = b.branch((Branch)
getRef().getReference()).commit();
+ getRef().updateReference(branch);
+ },
+ BaseNessieClientServerException.class);
+
+ } catch (NessieReferenceNotFoundException e) {
throw new RuntimeException(
String.format(
- "Cannot create Namespace '%s': " + "ref '%s' is no longer
valid.",
+ "Cannot create Namespace '%s': ref '%s' is no longer valid.",
namespace, getRef().getName()),
e);
+ } catch (Exception e) {
+ if (e instanceof NessieBadRequestException
+ && e.getMessage().contains("New value to update existing key")) {
+ // The existing content could be something else than a namespace, but
we don't know
+ throw new AlreadyExistsException(e, "Namespace already exists: '%s'",
namespace);
+ }
+ if (e instanceof NessieReferenceConflictException) {
Review Comment:
Hmm it wouldn't change the control flow imo, because if the `if` block
expression evaluates to true, the code throws. So you can only get here if it
evaluated to false.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]