Processing keeps stalling

I’m interested in purchasing Photostructure licensed, however the non-pro version keeps stalling on processing of photos.

Expected Behavior

Processing continues until it’s done.

Current Behavior

Processing continues but is stalled – nothing more is processed. It is like the worker pool becomes empty.

I need to shutdown photostructure and restart it. Then it continues. Until it stalls again.

Steps to Reproduce

Restart photostructure with my library and configuration.

Environment

Debian bullseye, Docker server edition with Photostructure 1.1.0 (latest).

Libraries are on NFS from a local NAS (LAN connected). Photostructure library is on NFS NAS as well, with the local-replica option and previews on local SSD on the machine running Photostructure.

Logs

An example unhandled exception is below. This may be related. Currently I’m running with logs at INFO level, rather than DEBUG.

sync-file-81-002.log:

{"ts":1653814679900,"l":"warn","ctx":"Sentry","msg":"Sentry.beforeSend(): event quota exceeded","meta":{"exception":{"values":[{"stacktrace":{"frames":[{"colno":805277,"
filename":"/ps/app/bin/sync-file.js","function":"t.AssetFileImporter._apply","lineno":9,"in_app":true,"module":"sync-file","pre_context":["","/*"," * Copyright © 2021, PhotoStructure Inc.","
 * By using this software, you accept all of the terms in <eula>."," * IF YOU DO NOT ACCEPT THESE TERMS, DO NOT USE THIS SOFTWARE"," */",""],"context_line":"'{snip
} await b.updateAssetPreviews(r),null==i.id?this.logger.throw(\"_apply(): unexpected missing asset file id\",{path:this.file.nativePath,af:i}):i {snip}","post_context":["//# sourceMappingURL
=sync-file.js.map"]},{"colno":359330,"filename":"/ps/app/bin/sync-file.js","function":"y.throw","lineno":9,"in_app":true,"module":"sync-file","pre_context":["","/*"," * Copyright © 2021, Pho
toStructure Inc."," * By using this software, you accept all of the terms in <https://photostructure.com/eula>."," * IF YOU DO NOT ACCEPT THESE TERMS, DO NOT USE THIS SOFTWARE"," */",""],"co
ntext_line":"'{snip} rable),h=n.isError(e)?e:null!==(i=t.error)&&void 0!==i?i:n.asError(e);t=null==t?void 0:p.prepMeta(o.omit(t,\"fatal\",\"retriable\",\"ignorable\",\" {snip}","post_context
":["//# sourceMappingURL=sync-file.js.map"]},{"colno":611008,"filename":"/ps/app/bin/sync-file.js","function":"Object.t.asError","lineno":9,"in_app":true,"module":"sync-file","pre_context":[
"","/*"," * Copyright © 2021, PhotoStructure Inc."," * By using this software, you accept all of the terms in <https://photostructure.com/eula>."," * IF YOU DO NOT ACCEPT THESE TERMS, DO NOT
 USE THIS SOFTWARE"," */",""],"context_line":"'{snip} , \"))}{const t=l(e),i=t.indexOf(\":\");if(i>2&&i<15){const e=new Error(t.slice(i+1).trim());return e.name=t.slice(0,i).trim(),e}return 
new Err {snip}","post_context":["//# sourceMappingURL=sync-file.js.map"]}]},"type":"_apply()","value":"unexpected missing asset file id"},{"stacktrace":{"frames":[{"colno":805277,"filename":
"/ps/app/bin/sync-file.js","function":"t.AssetFileImporter._apply","lineno":9,"in_app":true,"module":"sync-file","pre_context":["","/*"," * Copyright © 2021, PhotoStructure Inc."," * By usin
g this software, you accept all of the terms in <eula>."," * IF YOU DO NOT ACCEPT THESE TERMS, DO NOT USE THIS SOFTWARE"," */",""],"context_line":"'{snip} await b.
updateAssetPreviews(r),null==i.id?this.logger.throw(\"_apply(): unexpected missing asset file id\",{path:this.file.nativePath,af:i}):i {snip}","post_context":["//# sourceMappingURL=sync-file
.js.map"]},{"colno":359330,"filename":"/ps/app/bin/sync-file.js","function":"y.throw","lineno":9,"in_app":true,"module":"sync-file","pre_context":["","/*"," * Copyright © 2021, PhotoStructur
e Inc."," * By using this software, you accept all of the terms in <EULA-link>."," * IF YOU DO NOT ACCEPT THESE TERMS, DO NOT USE THIS SOFTWARE"," */",""],"context_line
":"'{snip} rable),h=n.isError(e)?e:null!==(i=t.error)&&void 0!==i?i:n.asError(e);t=null==t?void 0:p.prepMeta(o.omit(t,\"fatal\",\"retriable\",\"ignorable\",\" {snip}","post_context":["//# so
urceMappingURL=sync-file.js.map"]},{"colno":611008,"filename":"/ps/app/bin/sync-file.js","function":"Object.t.asError","lineno":9,"in_app":true,"module":"sync-file","pre_context":["","/*"," 
* Copyright © 2021, PhotoStructure Inc."," * By using this software, you accept all of the terms in <ULA-link>."," * IF YOU DO NOT ACCEPT THESE TERMS, DO NOT USE THIS 
SOFTWARE"," */",""],"context_line":"'{snip} , \"))}{const t=l(e),i=t.indexOf(\":\");if(i>2&&i<15){const e=new Error(t.slice(i+1).trim());return e.name=t.slice(0,i).trim(),e}return new Err {s
nip}","post_context":["//# sourceMappingURL=sync-file.js.map"]}]},"type":"Error","value":"AssetFileImporter(/ps/ppermant/Camera Roll/2021/06/20210626_094731000_iOS.mp4) _apply(): unexpected 
missing asset file id {\"path\":\"/ps/ppermant/Camera Roll/2021/06/20210626_094731000_iOS.mp4\",\"af\":{\"$ctor\":\"models.AssetFile\",\"assetId\":7095,\"capturedA...","mechanism":{"handled"
:true,"type":"generic"}}]},"event_id":"cd45541b714540919401fa2faaf021be","platform":"node","timestamp":1653814679.892,"environment":"production","release":"1.1.0+20210815185424","sdk":{"inte
grations":["InboundFilters","FunctionToString","Console","Http","OnUncaughtException","OnUnhandledRejection","LinkedErrors"]}}}

I’ll also add I’m happy to switch to more alpha/beta – as long as the principles of photostructure (copy data into originals, respect DAM-generated metadata) remain as the use case is primarily sharing curated photos with family.

Mark

Thanks for your report: apologies that PhotoStructure is misbehaving for you.

To remedy job queue issues, I made a bunch of improvements to job scheduling and concurrency management to v2.1, so I suspect the stable release of v2.1 will resolve your problem. Read more about it in this post. All the gory details are in the release notes.

Bug reports for alpha and beta (and stable) releases are always welcome! Please read this first before switching, though:

Alpha, beta, stable, and latest; What should you use?

That’s the plan!

As I add features, I typically add a setting or two (like I did with hide/delete/fave) that disable the feature, so if it’s not something you want, you’re in charge.