@@ -74,8 +74,9 @@ module.exports = (server, messageHandler) => (mailbox, update, session, callback
74
74
) ;
75
75
} ;
76
76
77
+ const LOCK_TTL = 2 * 60 * 1000 ;
77
78
let lockKey = [ 'mbwr' , mailboxData . _id . toString ( ) ] . join ( ':' ) ;
78
- server . lock . waitAcquireLock ( lockKey , 60 * 60 * 1000 , 1 * 60 * 1000 , ( err , lock ) => {
79
+ server . lock . waitAcquireLock ( lockKey , LOCK_TTL , 1 * 60 * 1000 , ( err , lock ) => {
79
80
if ( err ) {
80
81
return callback ( err ) ;
81
82
}
@@ -84,12 +85,48 @@ module.exports = (server, messageHandler) => (mailbox, update, session, callback
84
85
return callback ( null , new Error ( 'Failed to get folder write lock' ) ) ;
85
86
}
86
87
88
+ server . logger . debug (
89
+ {
90
+ tnx : 'MOVE'
91
+ } ,
92
+ 'Acquired lock for deleting messages user=%s mailbox=%s message=%s lock=%s' ,
93
+ session . user . id . toString ( ) ,
94
+ mailbox . toString ( ) ,
95
+ mailboxData . _id . toString ( ) ,
96
+ lock . id
97
+ ) ;
98
+
99
+ let extendLockIntervalTimer = setInterval ( ( ) => {
100
+ server . lock
101
+ . extendLock ( lock , LOCK_TTL )
102
+ . then ( info => {
103
+ server . logger . debug (
104
+ {
105
+ tnx : 'MOVE'
106
+ } ,
107
+ `Lock extended lock=${ info . id } result=${ info . success ? 'yes' : 'no' } `
108
+ ) ;
109
+ } )
110
+ . catch ( err => {
111
+ server . logger . debug (
112
+ {
113
+ tnx : 'MOVE' ,
114
+ err
115
+ } ,
116
+ 'Failed to extend lock lock=%s error=%s' ,
117
+ lock ?. id ,
118
+ err . message
119
+ ) ;
120
+ } ) ;
121
+ } , Math . round ( LOCK_TTL * 0.8 ) ) ;
122
+
87
123
// fetch entire messages as these need to be copied to the archive
88
124
let cursor = db . database . collection ( 'messages' ) . find ( query ) . sort ( { uid : 1 } ) . maxTimeMS ( consts . DB_MAX_TIME_MESSAGES ) ;
89
125
90
126
let processNext = ( ) => {
91
127
cursor . next ( ( err , messageData ) => {
92
128
if ( err ) {
129
+ clearInterval ( extendLockIntervalTimer ) ;
93
130
return server . lock . releaseLock ( lock , ( ) => {
94
131
updateQuota ( ( ) => callback ( err ) ) ;
95
132
} ) ;
@@ -111,6 +148,7 @@ module.exports = (server, messageHandler) => (mailbox, update, session, callback
111
148
]
112
149
} ) ;
113
150
}
151
+ clearInterval ( extendLockIntervalTimer ) ;
114
152
return server . lock . releaseLock ( lock , ( ) => {
115
153
updateQuota ( ( ) => callback ( null , true ) ) ;
116
154
} ) ;
@@ -140,6 +178,7 @@ module.exports = (server, messageHandler) => (mailbox, update, session, callback
140
178
logdata . _code = err . code ;
141
179
logdata . _response = err . response ;
142
180
server . loggelf ( logdata ) ;
181
+ clearInterval ( extendLockIntervalTimer ) ;
143
182
return cursor . close ( ( ) => server . lock . releaseLock ( lock , ( ) => updateQuota ( ( ) => callback ( err ) ) ) ) ;
144
183
}
145
184
0 commit comments