[
https://issues.apache.org/jira/browse/CASSANDRA-8325?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14224734#comment-14224734
]
graham sanderson commented on CASSANDRA-8325:
---------------------------------------------
Well that was a good guess ;-)
So {{unsafe.getByte(null, address)}} and {{unsafe.getByte(address)}} are not
documented to be the same, but do seem to be on most platforms
However from getInt() docs:
{code}
* This method refers to a variable by means of two parameters, and so
* it provides (in effect) a <em>double-register</em> addressing mode
* for Java variables. When the object reference is null, this method
* uses its offset as an absolute address. This is similar in operation
* to methods such as {@link #getInt(long)}, which provide (in effect) a
* <em>single-register</em> addressing mode for non-Java variables.
* However, because Java variables may have a different layout in memory
* from non-Java variables, programmers should not assume that these
* two addressing modes are ever equivalent. Also, programmers should
* remember that offsets from the double-register addressing mode cannot
* be portably confused with longs used in the single-register addressing
* mode.
{code}
The why? Well you could look on FreeBSD OpenJDK mailing lists, or dig up the
source - changes to {{hotspot/src/share/vm/opto/library_call.cpp}} may help.
However this may not be a JVM bug, it might just be a consequence of address
space layout on FreeBSD. Things like -XX:+UseCompressedOps and heap size <= or
>= 32gig may have an effect.
Anyway, you might consider this a C* bug... sort of fuzzy there. If you're
building C* yourself, I'd start by changing (though it isn't necessarily the
only effected method)
In FastByteOperations.UnsafeOperations, I'd change
{code}
public static void copy(Object src, long srcOffset, byte[] trg, int
trgPosition, int length)
{
if (length <= MIN_COPY_THRESHOLD)
{
for (int i = 0 ; i < length ; i++)
trg[trgPosition + i] = theUnsafe.getByte(src, srcOffset +
i);
}
else
{
copy(src, srcOffset, trg, BYTE_ARRAY_BASE_OFFSET + trgPosition,
length);
}
}
{code}
to
{code}
public static void copy(Object src, long srcOffset, byte[] trg, int
trgPosition, int length)
{
if (length <= MIN_COPY_THRESHOLD)
{
if (src == null)
{
for (int i = 0 ; i < length ; i++)
trg[trgPosition + i] = theUnsafe.getByte(srcOffset + i);
}
else
{
for (int i = 0 ; i < length ; i++)
trg[trgPosition + i] = theUnsafe.getByte(src, srcOffset
+ i);
}
}
else
{
copy(src, srcOffset, trg, BYTE_ARRAY_BASE_OFFSET + trgPosition,
length);
}
}
{code}
> Cassandra 2.1.x fails to start on FreeBSD (JVM crash)
> -----------------------------------------------------
>
> Key: CASSANDRA-8325
> URL: https://issues.apache.org/jira/browse/CASSANDRA-8325
> Project: Cassandra
> Issue Type: Bug
> Environment: FreeBSD 10.0 with openjdk version "1.7.0_71", 64-Bit
> Server VM
> Reporter: Leonid Shalupov
> Attachments: hs_err_pid1856.log, system.log
>
>
> See attached error file after JVM crash
> {quote}
> FreeBSD xxx.intellij.net 10.0-RELEASE FreeBSD 10.0-RELEASE #0 r260789: Thu
> Jan 16 22:34:59 UTC 2014
> [email protected]:/usr/obj/usr/src/sys/GENERIC amd64
> {quote}
> {quote}
> % java -version
> openjdk version "1.7.0_71"
> OpenJDK Runtime Environment (build 1.7.0_71-b14)
> OpenJDK 64-Bit Server VM (build 24.71-b01, mixed mode)
> {quote}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)