Skip to content

Shared object error running Rails 7 with concurrent requests #2799

Open
@headius

Description

@headius

I run into this occasionally attempting to run Rails 7 with Puma on TruffleRuby 22.3. It kills the server.

Caused by: java.lang.UnsupportedOperationException: Thread-safety bug: the object is already shared. This means another thread marked the object as shared concurrently.
	at org.truffleruby.language.objects.shared.ShareObjectNode.createSharedShape(ShareObjectNode.java:129)
	at org.truffleruby.language.objects.shared.ShareObjectNodeGen.executeAndSpecialize(ShareObjectNodeGen.java:99)
	at org.truffleruby.language.objects.shared.ShareObjectNodeGen.executeShare(ShareObjectNodeGen.java:69)
	at org.truffleruby.language.objects.shared.WriteBarrierNode.writeBarrierCached(WriteBarrierNode.java:69)
	at org.truffleruby.language.objects.shared.WriteBarrierNodeGen.executeWriteBarrier(WriteBarrierNodeGen.java:80)
	at org.truffleruby.core.array.library.ObjectArrayStore$ShareElements.shareElements(ObjectArrayStore.java:102)
	at org.truffleruby.core.array.library.ObjectArrayStoreGen$ArrayStoreLibraryExports$Cached.shareElements(ObjectArrayStoreGen.java:90)
	at org.truffleruby.core.array.library.ObjectArrayStore.makeShared(ObjectArrayStore.java:87)
	at org.truffleruby.core.array.library.ObjectArrayStoreGen$ArrayStoreLibraryExports$Cached.makeShared(ObjectArrayStoreGen.java:333)
	at org.truffleruby.language.objects.shared.ShareInternalFieldsNode.shareArray(ShareInternalFieldsNode.java:50)
	at org.truffleruby.language.objects.shared.ShareInternalFieldsNodeGen.executeShare(ShareInternalFieldsNodeGen.java:46)
	at org.truffleruby.language.objects.shared.ShareObjectNode.shareCached(ShareObjectNode.java:74)
	at org.truffleruby.language.objects.shared.ShareObjectNodeGen.executeShare(ShareObjectNodeGen.java:51)
	at org.truffleruby.language.objects.shared.WriteBarrierNode.writeBarrierCached(WriteBarrierNode.java:69)
	at org.truffleruby.language.objects.shared.WriteBarrierNodeGen.executeWriteBarrier(WriteBarrierNodeGen.java:80)
	at org.truffleruby.language.objects.shared.PropagateSharingNode.propagateShared(PropagateSharingNode.java:39)
	at org.truffleruby.language.objects.shared.PropagateSharingNodeGen.executePropagate(PropagateSharingNodeGen.java:39)
	at org.truffleruby.core.hash.library.PackedHashStoreLibrary$Set.setFirst(PackedHashStoreLibrary.java:180)
	at org.truffleruby.core.hash.library.PackedHashStoreLibraryGen$HashStoreLibraryExports$Cached.set(PackedHashStoreLibraryGen.java:102)
	at org.truffleruby.core.hash.library.HashStoreLibraryGen$CachedDispatch.set(HashStoreLibraryGen.java:999)
	at org.truffleruby.core.hash.library.EmptyHashStore.set(EmptyHashStore.java:49)
	at org.truffleruby.core.hash.library.EmptyHashStoreGen$HashStoreLibraryExports$Cached.set(EmptyHashStoreGen.java:86)
	at org.truffleruby.core.hash.HashNodes$SetIndexNode.set(HashNodes.java:239)
	at org.truffleruby.core.hash.HashNodesFactory$SetIndexNodeFactory$SetIndexNodeGen.execute(HashNodesFactory.java:981)
	at org.truffleruby.language.RubyCoreMethodRootNode.execute(RubyCoreMethodRootNode.java:48)

The app is a trivial generated "blog" scaffold app with Puma configured for 32 threads and siege doing 32 connections. If I drive the app with a few requests before starting benchmarking, it seems to fail less often.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions