On 13/1/21 3:15, Tim wrote:
Fantastic response, thank you! I did some more digging and properly
narrowed down where the issue is and created a test script that
demonstrates the problem. Let me know what you think and if it could
still be a similar problem to what you have stated above. I'll still
read that info you sent to sharpen up on these concepts.
Basically, the program calls a function which modifies a document in the
database. If it is called form it's own class' constructor, it works
fine. If it is called by a thread, it never returns. I don't think that
a member variable is going null or anything. But a strange problem that
I can't seem to debug. The output is at the bottom.
----------------------------------------------------------------
import vibe.db.mongo.mongo;
import core.thread;
import std.stdio;
void main(){
auto callable = new Callable();
while(true){}
}
class Caller : Thread{
void delegate() mFunc;
this(void delegate() func){
mFunc = func;
super(&loop);
start();
}
void loop(){
while(true){
mFunc();
}
}
}
class Callable{
MongoClient db;
Caller caller;
this(){
db = connectMongoDB("127.0.0.1");
foo();
caller = new Caller(&foo);
}
~this(){
db.cleanupConnections();
}
void foo(){
writeln("Started");
auto result = db.getCollection("test.collection").findAndModify([
"state": "running"],
["$set": ["state": "stopped"]
]);
writeln(result);
writeln("Finished");
}
}
----------------------------------------------------------------
Output:
Started
{"_id":"5ff6705e21e91678c737533f","state":"running","knowledge":true}
Finished
Started
Something that you could try for debugging is to add a try / catch block
around your call to `db.getCollection` (and printing out the exception
details). IIRC, if a thread throws, it will just end without printing
anything until the thread is joined, when the exception will be rethrown
[1].
The program hanging would be then the main thread waiting. This kind of
problem has already bitten me more than once...
[1]: https://dlang.org/library/core/thread/osthread/thread.join.html