pygradle icon indicating copy to clipboard operation
pygradle copied to clipboard

PythonDetails is not serializable

Open JLLeitschuh opened this issue 8 years ago • 3 comments

PythonDetails implements Serializable but it takes a Project that is not serializable.

If you try to make it so that the PipInstallTask gets cached you get an exception that it can't be

Failed to execute org.gradle.cache.internal.AsyncCacheAccessDecoratedCache$2@613b3d80.
org.gradle.api.UncheckedIOException: Could not add entry ':PlexxiCorePythonAPI:installPythonRequirements' to cache taskArtifacts.bin (/Users/jonathanleitschuh/work/git/plexxicontrol/.gradle/3.4-20161216120313+0000/taskArtifacts/taskArtifacts.bin).
        at org.gradle.cache.internal.btree.BTreePersistentIndexedCache.put(BTreePersistentIndexedCache.java:158)
        at org.gradle.cache.internal.DefaultMultiProcessSafePersistentIndexedCache$2.run(DefaultMultiProcessSafePersistentIndexedCache.java:53)
        at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.doWriteAction(DefaultFileLockManager.java:184)
        at org.gradle.cache.internal.DefaultFileLockManager$DefaultFileLock.writeFile(DefaultFileLockManager.java:174)
        at org.gradle.cache.internal.DefaultCacheAccess$UnitOfWorkFileAccess.writeFile(DefaultCacheAccess.java:457)
        at org.gradle.cache.internal.DefaultMultiProcessSafePersistentIndexedCache.put(DefaultMultiProcessSafePersistentIndexedCache.java:51)
        at org.gradle.cache.internal.AsyncCacheAccessDecoratedCache$2.run(AsyncCacheAccessDecoratedCache.java:48)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.cache.internal.CacheAccessWorker$2.run(CacheAccessWorker.java:187)
        at org.gradle.internal.Factories$1.create(Factories.java:25)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:179)
        at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:162)
        at org.gradle.cache.internal.CacheAccessWorker.flushOperations(CacheAccessWorker.java:177)
        at org.gradle.cache.internal.CacheAccessWorker.run(CacheAccessWorker.java:147)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: org.gradle.api.GradleException: Unable to store task input properties. Property 'pythonDetails' with value 'com.linkedin.gradle.python.extension.PythonDetails@79695a29' cannot be serialized.
        at org.gradle.api.internal.changedetection.state.InputPropertiesSerializer.write(InputPropertiesSerializer.java:42)
        at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository$LazyTaskExecution$TaskExecutionSnapshotSerializer.write(CacheBackedTaskHistoryRepository.java:441)
        at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository$TaskExecutionListSerializer.write(CacheBackedTaskHistoryRepository.java:224)
        at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository$TaskExecutionListSerializer.write(CacheBackedTaskHistoryRepository.java:200)
        at org.gradle.cache.internal.btree.BTreePersistentIndexedCache$DataBlock.setValue(BTreePersistentIndexedCache.java:659)
        at org.gradle.cache.internal.btree.BTreePersistentIndexedCache$DataBlock.<init>(BTreePersistentIndexedCache.java:646)
        at org.gradle.cache.internal.btree.BTreePersistentIndexedCache.put(BTreePersistentIndexedCache.java:150)
        ... 18 more
Caused by: org.gradle.internal.serialize.MapSerializer$EntrySerializationException: Unable to write entry with key: 'pythonDetails' and value: 'com.linkedin.gradle.python.extension.PythonDetails@79695a29'.
        at org.gradle.internal.serialize.MapSerializer.write(MapSerializer.java:50)
        at org.gradle.api.internal.changedetection.state.InputPropertiesSerializer.write(InputPropertiesSerializer.java:40)
        ... 24 more
Caused by: java.io.NotSerializableException: org.gradle.api.internal.project.DefaultProject_Decorated
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at org.gradle.internal.serialize.DefaultSerializer.write(DefaultSerializer.java:53)
        at org.gradle.internal.serialize.MapSerializer.write(MapSerializer.java:48)
        ... 25 more

The solution would be to mark the Project field in PipInstallTask as transient.

JLLeitschuh avatar Jan 06 '17 21:01 JLLeitschuh

This should be fixed now with 0.4.1 release. Would you be able to try it and see if it works for you?

ethankhall avatar Feb 01 '17 17:02 ethankhall

I'll test this out when I next get a chance.

JLLeitschuh avatar Feb 01 '17 17:02 JLLeitschuh

Awesome thanks!

ethankhall avatar Feb 01 '17 17:02 ethankhall