private void IncrementReferenceCountNoRecurse(BackupSetReference backupset, BlobLocation blocation, byte[] blobhash, int amount) { bool originallyshallow = blocation.TotalNonShallowReferenceCount == 0; int? refCount = blocation.GetBSetReferenceCount(backupset); int newRefCount = refCount.GetValueOrDefault(0) + amount; blocation.SetBSetReferenceCount(backupset, newRefCount); if (newRefCount == 0) { blocation.RemoveBSetReference(backupset); } else if (newRefCount < 0) { throw new Exception("Negative reference count in blobstore"); } if (blocation.BlockHashes == null) // Can't delete from disk if this is a multiblock reference (does not directly store data on disk) { if (blocation.TotalNonShallowReferenceCount == 0) { if (!originallyshallow) { try { if (blocation.EncryptedHash == null) { throw new Exception("Hash should not be null"); } Dependencies.DeleteBlob(blocation.EncryptedHash, blocation.RelativeFilePath); } catch (Exception e) { throw new Exception("Error deleting unreferenced file.", e); } } } } if (blocation.TotalReferenceCount == 0) { IndexStore.Remove(blobhash); } }