use of org.projectnessie.error.NessieNotFoundException in project nessie by projectnessie.
the class NessieViewOperations method refresh.
@Override
public ViewVersionMetadata refresh() {
try {
reference.refresh(api);
} catch (NessieNotFoundException e) {
throw new RuntimeException("Failed to refresh as ref is no longer valid.", e);
}
String metadataLocation = null;
try {
Content content = api.getContent().key(key).reference(reference.getReference()).get().get(key);
LOG.debug("Content '{}' at '{}': {}", key, reference.getReference(), content);
if (content == null) {
if (currentMetadataLocation() != null) {
throw new NoSuchTableException("No such view %s in %s", key, reference.getReference());
}
} else {
this.icebergView = content.unwrap(IcebergView.class).orElseThrow(() -> new IllegalStateException("Cannot refresh iceberg view: " + String.format("Nessie points to a non-Iceberg object for path: %s.", key)));
metadataLocation = icebergView.getMetadataLocation();
}
} catch (NessieNotFoundException ex) {
if (currentMetadataLocation() != null) {
throw new NoSuchTableException(ex, "No such view %s", key);
}
}
refreshFromMetadataLocation(metadataLocation, RETRY_IF, 2);
return current();
}
use of org.projectnessie.error.NessieNotFoundException in project nessie by projectnessie.
the class NessieViewOperations method drop.
@Override
public void drop(String viewIdentifier) {
reference.checkMutable();
IcebergView existingView = view(toCatalogTableIdentifier(viewIdentifier));
if (existingView == null) {
return;
}
CommitMultipleOperationsBuilder commitBuilderBase = api.commitMultipleOperations().commitMeta(NessieUtil.buildCommitMetadata(String.format("Iceberg delete view %s", viewIdentifier), catalogOptions)).operation(Operation.Delete.of(NessieUtil.toKey(toCatalogTableIdentifier(viewIdentifier))));
// We try to drop the view. Simple retry after ref update.
try {
Tasks.foreach(commitBuilderBase).retry(5).stopRetryOn(NessieNotFoundException.class).throwFailureWhenFinished().onFailure((o, exception) -> refresh()).run(commitBuilder -> {
Branch branch = commitBuilder.branch(reference.getAsBranch()).commit();
reference.updateReference(branch);
}, BaseNessieClientServerException.class);
} catch (NessieConflictException e) {
LOG.error("Cannot drop view: failed after retry (update ref and retry)", e);
} catch (NessieNotFoundException e) {
LOG.error("Cannot drop view: ref is no longer valid.", e);
} catch (BaseNessieClientServerException e) {
LOG.error("Cannot drop view: unknown error", e);
}
}
use of org.projectnessie.error.NessieNotFoundException in project nessie by projectnessie.
the class NessieViewOperations method commit.
@Override
public void commit(ViewVersionMetadata base, ViewVersionMetadata metadata, Map<String, String> properties) {
reference.checkMutable();
String newMetadataLocation = writeNewMetadata(metadata, currentVersion() + 1);
boolean delete = true;
try {
ImmutableIcebergView.Builder viewBuilder = ImmutableIcebergView.builder();
if (icebergView != null) {
viewBuilder.id(icebergView.getId());
}
IcebergView newView = viewBuilder.metadataLocation(newMetadataLocation).versionId(metadata.currentVersionId()).schemaId(metadata.definition().schema().schemaId()).dialect("TODO: needs to be defined in Iceberg ViewDefinition").sqlText(metadata.definition().sql()).build();
LOG.debug("Committing '{}' against '{}': {}", key, reference.getReference(), newView);
ImmutableCommitMeta.Builder builder = ImmutableCommitMeta.builder();
builder.message(buildCommitMsg(base, metadata) + " " + key.getName());
Branch branch = api.commitMultipleOperations().operation(Operation.Put.of(key, newView, icebergView)).commitMeta(NessieUtil.catalogOptions(builder, catalogOptions).build()).branch(reference.getAsBranch()).commit();
reference.updateReference(branch);
delete = false;
} catch (NessieConflictException ex) {
throw new CommitFailedException(ex, "Commit failed: Reference hash is out of date. " + "Update the reference %s and try again", reference.getName());
} catch (HttpClientException ex) {
// Intentionally catch all nessie-client-exceptions here and not just the "timeout" variant
// to catch all kinds of network errors (e.g. connection reset). Network code implementation
// details and all kinds of network devices can induce unexpected behavior. So better be
// safe than sorry.
delete = false;
throw new CommitStateUnknownException(ex);
} catch (NessieNotFoundException ex) {
throw new RuntimeException(String.format("Commit failed: Reference %s no longer exist", reference.getName()), ex);
} finally {
if (delete) {
io().deleteFile(newMetadataLocation);
}
}
}
use of org.projectnessie.error.NessieNotFoundException in project nessie by projectnessie.
the class NessieViewOperations method view.
private IcebergView view(TableIdentifier viewIdentifier) {
try {
ContentKey key = NessieUtil.toKey(viewIdentifier);
Content view = api.getContent().key(key).reference(reference.getReference()).get().get(key);
return view != null ? view.unwrap(IcebergView.class).orElse(null) : null;
} catch (NessieNotFoundException e) {
return null;
}
}
Aggregations