fix expiration completion after external expunge
when the expiration is interrupted, but an external expunge removes the near-side message before we resume, we would just drop the transaction, resulting in an "unmarked" orphan. a corner case is an expiration that finishes, but initially isn't expunged (probably due to an interruption), followed by an unexpiration that gets interrupted, and the message being expunged externally (because it's still marked as deleted). we obviously can't complete that transaction without re-propagating the message, so effectively cancel it instead.
This commit is contained in:
		
							parent
							
								
									1ca278ad0d
								
							
						
					
					
						commit
						fe4e478e95
					
				
					 1 changed files with 5 additions and 0 deletions
				
			
		|  | @ -1047,6 +1047,11 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux | |||
| 					// The target may be in an unknown state (not fetched).
 | ||||
| 					if ((t == F) && (srec->status & (S_EXPIRE|S_EXPIRED))) { | ||||
| 						/* Don't propagate deletion resulting from expiration. */ | ||||
| 						if (~srec->status & (S_EXPIRE | S_EXPIRED)) { | ||||
| 							// An expiration was interrupted, but the message was expunged since.
 | ||||
| 							srec->status |= S_EXPIRE | S_EXPIRED;  // Override failed unexpiration attempts.
 | ||||
| 							JLOG( "~ %u %u %u", (srec->uid[F], srec->uid[N], srec->status), "forced expiration commit" ); | ||||
| 						} | ||||
| 						JLOG( "> %u %u 0", (srec->uid[F], srec->uid[N]), "near side expired, orphaning far side" ); | ||||
| 						srec->uid[N] = 0; | ||||
| 					} else { | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue