Hello,

thanks for your feedback.

> MVStore is actually a third storage engine for H2 and who knows, maybe 
there will be a new one without this setting or MVStore itself will be 
changed incompatibly. I think you need to find some other way.

I thought about a different solution. I wanted to remove the awareness of 
H2 whether it is in-memory or persistent entirely. The idea I had was to 
simply rely on `java.nio.file.FileSystem`. Then H2 could write its data, 
regardless of storage format, and a restore point would simply make a copy 
of the data on the filesystem - be it in-memory, e.g. using Jimfs, or on 
disk. However, since I wanted restore points to work with both modes in H2, 
in-memory and persistent, and in-memory mode is not transparent (yet), I 
rejected the idea.
I still like the idea though. The current filesystem abstraction in H2 is a 
good start, but it would need to be able to use 
`java.nio.file.FileSystem#getPath(...)` on a single 
`java.nio.file.FileSystem` instance consistently to not end up on a 
different filesystem.
A downside would be that creating a restore point for large databases would 
be costly when it comes to storage.

> Your implementation seems to be not compatible with anything, including 
Oracle.

That's correct. As I said, it is vaguely similar to Oracle. Maybe I should 
rephrase: It is somewhat inspired by Oracle.
However, I don't care (too) much for the specific SQL syntax. I'd be happy 
to change it to whatever you think fits H2 best. Maybe `create database 
snapshot` and `restore database from snapshot`. Something like that. I'm 
open to suggestions.

> The integration with oldestVersionToKeep is not ideal, it could certainly 
be better [...]

Do you mean that I shouldn't introduce another variable 
`restorePointVersion` on top of `oldestVersionToKeep`? I don't think I can 
make it work without `restorePointVersion` on top, because 
`oldestVersionToKeep` increments as transactions are being committed. And I 
need some boundary to tell the actual storage system what to keep and what 
not.

> Please, don't use var and don't invent new interfaces for unit tests.

No problem. I got rid of `var` already (not pushed yet). Would it be ok if 
I added an interface to `BaseTest` similar to `VoidCallable`? Maybe 
`ThrowingConsumer`? I introduced the interface to deal with "aspects" 
(connections, statements and auto-commit) and to be able to work with 
lambdas which can throw exceptions. If you have something else in mind, 
could you point me in the right direction?

> I tried to add some reconnections to your tests and they started to fail.

Could you be more specific so I can look into it? The reconnections are one 
of the reasons I introduced the interface in my unit tests. I.e. everything 
is executed with and without auto-commit and, unless in-memory, everything 
is executed with and without reconnections, because I thought those are the 
most critical aspects when it comes to restore points.

Regards,
Enno

On Friday, November 8, 2024 at 11:09:14 AM UTC+1 Noel Grandin wrote:

>
>
> On 11/8/2024 11:32 AM, Evgenij Ryazanov wrote:
> > 
> > 1. I think it is a very bad idea to implement it on top of 
> oldestVersionToKeep from MVStore. MVStore by itself creates a 
> > lot of garbage and this setting will effectively prevent garbage 
> collection. In case of H2, all these versions also can 
> > be lost because H2 can rewrite the whole storage during shutdown. 
> MVStore is actually a third storage engine for H2 and 
> > who knows, maybe there will be a new one without this setting or MVStore 
> itself will be changed incompatibly. I think 
> > you need to find some other way.
>
> I think the strategy there is sufficient - we don't need to support all 
> features with all backends.
> We can just throw an exception in the future if this feature is used with 
> a backend which does not support it.
>
> The integration with oldestVersionToKeep is not ideal, it could certainly 
> be better, but we should "not let the perfect 
> be the enemy of the good".
>
> > 2. Your implementation seems to be not compatible with anything, 
> including Oracle. You shouldn't use mixed syntax 
> > partially taken from Oracle, partially your own, because it will prevent 
> introduction of Oracle-specific features in 
> > Oracle compatibility mode due to syntax conflict.
>
> Any such feature is going to be heavily dependant on various details of 
> how the underlying storage engine works, so I 
> don't think this is a deal-breaker. I cannot see us ever needing such a 
> thing in the Oracle compatibility mode. And in 
> the unlikely event that we do, our Parser class is flexible enough to copy 
> with having two different syntax paths for 
> different modes.
>
> > 
> > You also should use the same code style as the whole project. Please, 
> don't use var and don't invent new interfaces for 
> > unit tests.
> > 
> > I tried to add some reconnections to your tests and they started to 
> fail. You need to test all these cases too.
> > 
>
> Agreed, these areas will need improvement.
>
> Regards, Noel Grandin
>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to h2-database+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/h2-database/73c42f2e-8c07-4257-814c-8c5c86448c31n%40googlegroups.com.

Reply via email to