In AbstractRocksDBState, why write a byte 42 between key and namespace?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

In AbstractRocksDBState, why write a byte 42 between key and namespace?

Biao Liu
In AbstractRocksDBState.writeKeyAndNamespace():

protected void writeKeyAndNamespace(DataOutputView out) throws IOException {
backend.keySerializer().serialize(backend.currentKey(), out);
out.writeByte(42);
namespaceSerializer.serialize(currentNamespace, out);
}

Why write a byte 42 between key and namespace? The keySerializer and namespaceSerializer know their lengths. It seems we don't need this byte.

Could anybody tell me what it is for?  Is there any situation that we must have this separator?
Reply | Threaded
Open this post in threaded view
|

Re: In AbstractRocksDBState, why write a byte 42 between key and namespace?

Stephan Ewen
My assumption is that this was a sanity check that actually just stuck in the code.

It can probably be removed.

PS: Moving this to the [hidden email] list...



On Fri, Jul 15, 2016 at 11:05 AM, 刘彪 <[hidden email]> wrote:
In AbstractRocksDBState.writeKeyAndNamespace():

protected void writeKeyAndNamespace(DataOutputView out) throws IOException {
backend.keySerializer().serialize(backend.currentKey(), out);
out.writeByte(42);
namespaceSerializer.serialize(currentNamespace, out);
}

Why write a byte 42 between key and namespace? The keySerializer and namespaceSerializer know their lengths. It seems we don't need this byte.

Could anybody tell me what it is for?  Is there any situation that we must have this separator?

Reply | Threaded
Open this post in threaded view
|

Re: In AbstractRocksDBState, why write a byte 42 between key and namespace?

Aljoscha Krettek
I left that in on purpose to protect against cases where the combination of key and namespace can be ambiguous. For example, these two combinations of key and namespace have the same written representation:
key [0 1 2] namespace [3 4 5] (values in brackets are byte arrays)
key [0 1] namespace [2 3 4 5]

having the "magic number" in there protects against such cases. 

On Fri, 15 Jul 2016 at 16:31 Stephan Ewen <[hidden email]> wrote:
My assumption is that this was a sanity check that actually just stuck in
the code.

It can probably be removed.

PS: Moving this to the [hidden email] list...



On Fri, Jul 15, 2016 at 11:05 AM, 刘彪 <[hidden email]> wrote:

> In AbstractRocksDBState.writeKeyAndNamespace():
>
> protected void writeKeyAndNamespace(DataOutputView out) throws IOException
> {
> backend.keySerializer().serialize(backend.currentKey(), out);
> out.writeByte(42);
> namespaceSerializer.serialize(currentNamespace, out);
> }
>
> Why write a byte 42 between key and namespace? The keySerializer and
> namespaceSerializer know their lengths. It seems we don't need this byte.
>
> Could anybody tell me what it is for?  Is there any situation that we must
> have this separator?
>