belt and suspenders check
It's possible for there to be multiple queued changes all adding the same file, and for those changes to be reordered. Maybe. This check will guard against that ending up adding the wrong version of the file last.
This commit is contained in:
		
					parent
					
						
							
								33b914bcf1
							
						
					
				
			
			
				commit
				
					
						75dba7f7bc
					
				
			
		
					 1 changed files with 11 additions and 1 deletions
				
			
		| 
						 | 
					@ -118,7 +118,7 @@ handleAdds st changechan cs = returnWhen (null pendingadds) $ do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		add :: Change -> IO (Maybe Change)
 | 
							add :: Change -> IO (Maybe Change)
 | 
				
			||||||
		add change@(PendingAddChange { keySource = ks }) = do
 | 
							add change@(PendingAddChange { keySource = ks }) = do
 | 
				
			||||||
			r <- catchMaybeIO $ runThreadState st $ do
 | 
								r <- catchMaybeIO $ sanitycheck ks $ runThreadState st $ do
 | 
				
			||||||
				showStart "add" $ keyFilename ks
 | 
									showStart "add" $ keyFilename ks
 | 
				
			||||||
				handle (finishedChange change) (keyFilename ks)
 | 
									handle (finishedChange change) (keyFilename ks)
 | 
				
			||||||
					=<< Command.Add.ingest ks
 | 
										=<< Command.Add.ingest ks
 | 
				
			||||||
| 
						 | 
					@ -140,6 +140,16 @@ handleAdds st changechan cs = returnWhen (null pendingadds) $ do
 | 
				
			||||||
			showEndOk
 | 
								showEndOk
 | 
				
			||||||
			return $ Just change
 | 
								return $ Just change
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{- Check that the keysource's keyFilename still exists,
 | 
				
			||||||
 | 
							 - and is still a hard link to its contentLocation,
 | 
				
			||||||
 | 
							 - before ingesting it. -}
 | 
				
			||||||
 | 
							sanitycheck keysource a = do
 | 
				
			||||||
 | 
								fs <- getSymbolicLinkStatus $ keyFilename keysource
 | 
				
			||||||
 | 
								ks <- getSymbolicLinkStatus $ contentLocation keysource
 | 
				
			||||||
 | 
								if deviceID ks == deviceID fs && fileID ks == fileID fs
 | 
				
			||||||
 | 
									then a
 | 
				
			||||||
 | 
									else return Nothing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{- PendingAddChanges can Either be Right to be added now,
 | 
					{- PendingAddChanges can Either be Right to be added now,
 | 
				
			||||||
 - or are unsafe, and must be Left for later.
 | 
					 - or are unsafe, and must be Left for later.
 | 
				
			||||||
 -
 | 
					 -
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue