Forgive me for reviving this debate about threadlocals.  Before anyone 
loses their heads, I'm not suggesting a need for threads or anything like 
that. However, I've used threadlocal a bit in other languages and and the 
lack of threadlocal(or something with a less contentious name that has 
nothing to do with threads) in node.js makes me wonder how people would 
solve problems like distributed transaction coordination?  In frameworks 
I've used in the past it was common to associate transaction context in 
threadlocal.  That way, if any part of the program needed to interact with 
the transaction coordinator (start, rollback, pause, resume, commit) the 
transaction coordinator could look in thread local for the transaction 
context and  know exactly which transaction was in progress on "this 
thread".  That concept doesn't go away in node.js just because things are 
processed in an event loop, each pass of the event loop could be for 
different transactions.  

It seems that the only way around this is to always have a direct reference 
to the transaction context, meaning passed to every function that might 
need the transaction context.  This approach seems to require transaction 
api details be litered throughout the code, and makes it nearly impossible 
for a 3rd party to quietly manage transactions.

I use mongoose, and have created a plugin for tracking some audit 
information for each record change:

module.exports.auditAttributesPlugin = function(schema, options) {
  schema.add({
    createdOn    : {type: Date, default: Date.now, required: true}
    , changedOn    : {type: Date, default: Date.now, required: true}
    , createdBy    : {type: Schema.ObjectId}
    , changedBy    : {type: Schema.ObjectId}
  });

  schema.pre('save', function (next) {
    this.createdOn = this.createdOn || Date.now;
    this.changedOn = Date.now;
    this.createdBy = this.createdBy || app.context.userId;
    this.changedBy = app.context.userId;
    console.log('orm plugin createdOn: %s, createdBy: %s, updatedOn: %s, 
updatedBy: %s', this.createdOn, this.createdBy, this.changedOn, 
this.changedBy);
    next()
  });
};

The part where I do app.context.userId, without a threadlocal, I need 
access directly to the request or session that contains the user id. 
 Typically(in threaded languages) I'd use threadlocal to store information 
like the userid executing in this iteration of the event loop.  This 
technique is pretty common, distributed transaction coordination, JAAS, 
etc. all use this technique. 

So far I haven't seen any solutions to this problem, so this post is either 
about to start a flame war, or could just be considered a vote for 
"threadlocal like behavior", or if anyone has any good suggestions, I'd 
like to hear them.

Thanks, Dave
 

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to