Skip to content

Commit 51f0106

Browse files
committed
additions to user merging(helps ensuring process is not called twice in paralel)
1 parent 492fed1 commit 51f0106

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

api/jobs/userMerge.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ var handleMerges = function(db, callback) {
6464
}
6565
if (!oldAppUser && newAppUser) {
6666
//old user was merged to new user, but state update failed - we can mark it as merged and process other plugins
67-
usersApi.mergeOtherPlugins(db, app_id, {uid: user.merged_to}, {uid: olduid}, {"mc": true, "cc": true, "u": true}, resolve);
67+
usersApi.mergeOtherPlugins({db: db, app_id: app_id, newAppUser: {uid: user.merged_to}, oldAppUser: {uid: olduid}, updateFields: {"mc": true, "cc": true, "u": true}, mergeDoc: user}, resolve);
6868
}
6969
if (!newAppUser) {
7070
//new user do not exists - we can delete merging record
@@ -106,7 +106,7 @@ var handleMerges = function(db, callback) {
106106
log.e("Failed to remove merged user from database", errRemoving);
107107
}
108108
else {
109-
usersApi.mergeOtherPlugins(db, app_id, newAppUser, oldAppUser, {"cc": true, "u": true}, resolve);
109+
usersApi.mergeOtherPlugins({db: db, app_id: app_id, newAppUser: {uid: user.merged_to}, oldAppUser: {uid: olduid}, updateFields: {"cc": true, "u": true}, mergeDoc: user}, resolve);
110110
}
111111
});
112112
}
@@ -129,13 +129,13 @@ var handleMerges = function(db, callback) {
129129
log.e("Failed metric changes update in app_users merge", err7);
130130
}
131131
else {
132-
usersApi.mergeOtherPlugins(db, app_id, {uid: user.merged_to}, {uid: olduid}, {"cc": true, "mc": true}, resolve);
132+
usersApi.mergeOtherPlugins({db: db, app_id: app_id, newAppUser: {uid: user.merged_to}, oldAppUser: {uid: olduid}, updateFields: {"cc": true, "mc": true}, mergeDoc: user}, resolve);
133133
}
134134
});
135135
});
136136
}
137137
else {
138-
usersApi.mergeOtherPlugins(db, app_id, {uid: user.merged_to}, {uid: olduid}, {"cc": true}, resolve);
138+
usersApi.mergeOtherPlugins({db: db, app_id: app_id, newAppUser: {uid: user.merged_to}, oldAppUser: {uid: olduid}, updateFields: {"cc": true}, mergeDoc: user}, resolve);
139139
}
140140
}
141141
else {

api/parts/mgmt/app_users.js

+29-5
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,13 @@ usersApi.getUid = function(app_id, callback) {
382382
};
383383

384384

385-
usersApi.mergeOtherPlugins = function(db, app_id, newAppUser, oldAppUser, updateFields, callback) {
385+
usersApi.mergeOtherPlugins = function(options, callback) {
386+
var db = options.db;
387+
var app_id = options.app_id;
388+
var newAppUser = options.newAppUser;
389+
var oldAppUser = options.oldAppUser;
390+
var updateFields = options.updateFields;
391+
var mergeDoc = options.mergeDoc || {};
386392
log.d("Merging other plugins ", oldAppUser.uid + "->" + newAppUser.uid);
387393
var iid = app_id + "_" + newAppUser.uid + "_" + oldAppUser.uid;
388394
updateFields.lu = Math.round(new Date().getTime() / 1000);
@@ -396,17 +402,31 @@ usersApi.mergeOtherPlugins = function(db, app_id, newAppUser, oldAppUser, update
396402
}
397403
}
398404
else if (res && res.length > 0) {
399-
callback("skipping till previous merge is finished");
405+
//update lu field
406+
delete updateFields.cc;//do not set as calculating
407+
db.collection('app_user_merges').update({"_id": iid}, {"$set": updateFields}, {upsert: false}, function(err00) {
408+
if (err00) {
409+
log.e(err00);
410+
}
411+
callback("skipping till previous merge is finished");
412+
});
400413
}
401414
else {
402-
db.collection('app_user_merges').update({"_id": iid, "cc": {"$ne": true}}, {'$set': updateFields, "$inc": {"t": 1}}, {upsert: false}, function(err0) {
415+
var updateQuery = {"_id": iid};
416+
if (mergeDoc && mergeDoc.cc && mergeDoc.lu) {
417+
updateQuery.lu = mergeDoc.lu;
418+
}
419+
else {
420+
updateQuery.cc = {"$ne": true};
421+
}
422+
db.collection('app_user_merges').update(updateQuery, {'$set': updateFields, "$inc": {"t": 1}}, {upsert: false}, function(err0, resUpdate) {
403423
if (err0) {
404424
log.e("Failed to update merge document about started merge", err);
405425
if (callback && typeof callback === 'function') {
406426
callback(err);
407427
}
408428
}
409-
else {
429+
else if (resUpdate && resUpdate.modifiedCount > 0) { //doc was updated
410430
plugins.dispatch("/i/device_id", {
411431
app_id: app_id,
412432
oldUser: oldAppUser,
@@ -448,6 +468,10 @@ usersApi.mergeOtherPlugins = function(db, app_id, newAppUser, oldAppUser, update
448468
}
449469
});
450470
}
471+
else {
472+
//something else already triggered this change in paralel.
473+
callback();
474+
}
451475
});
452476
}
453477
});
@@ -661,7 +685,7 @@ usersApi.merge = function(app_id, newAppUser, new_id, old_id, new_device_id, old
661685
if (err7) {
662686
log.e("Failed metric changes update in app_users merge", err7);
663687
}
664-
usersApi.mergeOtherPlugins(common.db, app_id, newAppUserP, oldAppUser, {"cc": true, "u": true, "mc": true}, function() {});
688+
usersApi.mergeOtherPlugins({db: common.db, app_id: app_id, newAppUser: newAppUserP, oldAppUser: oldAppUser, updateFields: {"cc": true, "u": true, "mc": true}}, function() {});
665689
});
666690
}
667691
});

0 commit comments

Comments
 (0)