Skip to content
This repository has been archived by the owner on Mar 9, 2021. It is now read-only.

Commit

Permalink
Check if data structures are complete and valid at startup
Browse files Browse the repository at this point in the history
- Fixes crawler stall bug if the queue list is empty at startup which was introduced by the new database consistency checks (#284).
- Clears queue list before reinitializing it with a possible local Queuelist.json if the database location was changed in the settings view.
- Checks if for each IBlog exist an IFiles if the database location was changed in the settings view.
  • Loading branch information
johanneszab committed Nov 7, 2018
1 parent 3e0cc97 commit 30b8dc1
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ private async Task Crawl()
pauseCommand.RaiseCanExecuteChanged();
stopCommand.RaiseCanExecuteChanged();

await crawlerService.DatabasesLoaded.Task;
await Task.WhenAll(crawlerService.LibraryLoaded.Task, crawlerService.DatabasesLoaded.Task);

for (var i = 0; i < shellService.Settings.ConcurrentBlogs; i++)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ internal class ManagerController

private readonly AsyncDelegateCommand checkStatusCommand;
private readonly DelegateCommand copyUrlCommand;
private readonly DelegateCommand checkIfDatabasesCompleteCommand;
private readonly AsyncDelegateCommand addBlogCommand;
private readonly DelegateCommand autoDownloadCommand;
private readonly DelegateCommand enqueueSelectedCommand;
Expand Down Expand Up @@ -88,6 +89,7 @@ public ManagerController(IShellService shellService, ISelectionService selection
enqueueSelectedCommand = new DelegateCommand(EnqueueSelected, CanEnqueueSelected);
loadLibraryCommand = new AsyncDelegateCommand(LoadLibraryAsync, CanLoadLibrary);
loadAllDatabasesCommand = new AsyncDelegateCommand(LoadAllDatabasesAsync, CanLoadAllDatbases);
checkIfDatabasesCompleteCommand = new DelegateCommand(CheckIfDatabasesComplete, CanCheckIfDatabasesComplete);
listenClipboardCommand = new DelegateCommand(ListenClipboard);
autoDownloadCommand = new DelegateCommand(EnqueueAutoDownload, CanEnqueueAutoDownload);
showDetailsCommand = new DelegateCommand(ShowDetailsCommand);
Expand All @@ -113,6 +115,7 @@ public async Task Initialize()
crawlerService.EnqueueSelectedCommand = enqueueSelectedCommand;
crawlerService.LoadLibraryCommand = loadLibraryCommand;
crawlerService.LoadAllDatabasesCommand = loadAllDatabasesCommand;
crawlerService.CheckIfDatabasesCompleteCommand = checkIfDatabasesCompleteCommand;
crawlerService.AutoDownloadCommand = autoDownloadCommand;
crawlerService.ListenClipboardCommand = listenClipboardCommand;
crawlerService.PropertyChanged += CrawlerServicePropertyChanged;
Expand All @@ -128,6 +131,7 @@ public async Task Initialize()
ManagerViewModel.QueueItems = QueueManager.Items;
QueueManager.Items.CollectionChanged += QueueItemsCollectionChanged;
ManagerViewModel.QueueItems.CollectionChanged += ManagerViewModel.QueueItemsCollectionChanged;
BlogManagerFinishedLoadingLibrary += OnBlogManagerFinishedLoadingLibrary;
BlogManagerFinishedLoadingDatabases += OnBlogManagerFinishedLoadingDatabases;

shellService.ContentView = ManagerViewModel.View;
Expand All @@ -144,6 +148,11 @@ public void Shutdown()
{
}

private void OnBlogManagerFinishedLoadingLibrary(object sender, EventArgs e)
{
crawlerService.LibraryLoaded.SetResult(true);
}

private void OnBlogManagerFinishedLoadingDatabases(object sender, EventArgs e)
{
crawlerService.DatabasesLoaded.SetResult(true);
Expand All @@ -164,8 +173,9 @@ private void QueueItemsCollectionChanged(object sender, NotifyCollectionChangedE
private async Task LoadDataBasesAsync()
{
// TODO: Methods have side effects!
// They remove blogs from the blog manager.
await LoadLibraryAsync();
await LoadAllDatabasesAsync();
await LoadAllDatabasesAsync();
CheckIfDatabasesComplete();
await CheckBlogsOnlineStatusAsync();
}
Expand Down Expand Up @@ -359,6 +369,11 @@ private bool CanLoadAllDatbases()
return !crawlerService.IsCrawl;
}

private bool CanCheckIfDatabasesComplete()
{
return crawlerService.DatabasesLoaded.Task.GetAwaiter().IsCompleted && crawlerService.LibraryLoaded.Task.GetAwaiter().IsCompleted;
}

private bool CanEnqueueSelected()
{
return ManagerViewModel.SelectedBlogFile != null && ManagerViewModel.SelectedBlogFile.Online;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,14 @@ public void Initialize()
ManagerController.QueueManager = queueManager;
ManagerController.ManagerSettings = managerSettings;
ManagerController.BlogManagerFinishedLoadingLibrary += OnBlogManagerFinishedLoadingLibrary;
Task managerControllerInit = ManagerController.Initialize();
QueueController.QueueSettings = queueSettings;
QueueController.QueueManager = queueManager;
QueueController.Initialize();
DetailsController.QueueManager = queueManager;
DetailsController.Initialize();
CrawlerController.QueueManager = queueManager;

Task managerControllerInit = ManagerController.Initialize();
QueueController.Initialize();
DetailsController.Initialize();
CrawlerController.Initialize();
cookieService.SetUriCookie(cookieList);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ public void Run()

public void LoadQueue()
{
ClearList();
IReadOnlyList<string> blogNamesToLoad = QueueSettings.Names;
IReadOnlyList<BlogTypes> blogTypesToLoad = QueueSettings.Types;
InsertFilesCore(0, blogNamesToLoad, blogTypesToLoad);
Expand Down
15 changes: 15 additions & 0 deletions src/TumblThree/TumblThree.Applications/Services/CrawlerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ public class CrawlerService : Model, ICrawlerService
private ICommand enqueueSelectedCommand;
private ICommand loadLibraryCommand;
private ICommand loadAllDatabasesCommand;
private ICommand checkIfDatabasesCompleteCommand;
private bool isCrawl;
private bool isPaused;
private bool isTimerSet;
private TaskCompletionSource<bool> libraryLoaded;
private TaskCompletionSource<bool> databasesLoaded;
private ICommand listenClipboardCommand;
private string newBlogUrl;
Expand All @@ -47,6 +49,7 @@ public CrawlerService(IShellService shellService)

activeItems = new ObservableCollection<QueueListItem>();
readonlyActiveItems = new ReadOnlyObservableList<QueueListItem>(activeItems);
libraryLoaded = new TaskCompletionSource<bool>();
databasesLoaded = new TaskCompletionSource<bool>();
activeItems.CollectionChanged += ActiveItemsCollectionChanged;
}
Expand All @@ -57,6 +60,12 @@ public bool IsTimerSet
set => SetProperty(ref isTimerSet, value);
}

public TaskCompletionSource<bool> LibraryLoaded
{
get => libraryLoaded;
set => SetProperty(ref libraryLoaded, value);
}

public TaskCompletionSource<bool> DatabasesLoaded
{
get => databasesLoaded;
Expand Down Expand Up @@ -107,6 +116,12 @@ public ICommand LoadAllDatabasesCommand
set => SetProperty(ref loadAllDatabasesCommand, value);
}

public ICommand CheckIfDatabasesCompleteCommand
{
get => checkIfDatabasesCompleteCommand;
set => SetProperty(ref checkIfDatabasesCompleteCommand, value);
}

public ICommand RemoveBlogFromQueueCommand
{
get => removeBlogFromQueueCommand;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public interface ICrawlerService : INotifyPropertyChanged

ICommand LoadAllDatabasesCommand { get; set; }

ICommand CheckIfDatabasesCompleteCommand { get; set; }

ICommand RemoveBlogFromQueueCommand { get; set; }

ICommand ListenClipboardCommand { get; set; }
Expand Down Expand Up @@ -52,6 +54,8 @@ public interface ICrawlerService : INotifyPropertyChanged

Timer Timer { get; set; }

TaskCompletionSource<bool> LibraryLoaded { get; set; }

TaskCompletionSource<bool> DatabasesLoaded { get; set; }

void AddActiveItems(QueueListItem itemToAdd);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class SettingsViewModel : ViewModel<ISettingsView>
private readonly DelegateCommand browseExportLocationCommand;
private readonly DelegateCommand enableAutoDownloadCommand;
private readonly DelegateCommand exportCommand;
private readonly DelegateCommand saveCommand;
private readonly AsyncDelegateCommand saveCommand;
private readonly AsyncDelegateCommand tumblrLoginCommand;
private readonly AsyncDelegateCommand tumblrLogoutCommand;
private readonly AsyncDelegateCommand tumblrSubmitTFACommand;
Expand Down Expand Up @@ -143,7 +143,7 @@ public SettingsViewModel(ISettingsView view, IShellService shellService, ICrawle
tumblrLoginCommand = new AsyncDelegateCommand(TumblrLogin);
tumblrLogoutCommand = new AsyncDelegateCommand(TumblrLogout);
tumblrSubmitTFACommand = new AsyncDelegateCommand(TumblrSubmitTFA);
saveCommand = new DelegateCommand(Save);
saveCommand = new AsyncDelegateCommand(Save);
enableAutoDownloadCommand = new DelegateCommand(EnableAutoDownload);
exportCommand = new DelegateCommand(ExportBlogs);
bloglistExportFileType = new FileType(Resources.Textfile, SupportedFileTypes.BloglistExportFileType);
Expand Down Expand Up @@ -993,33 +993,39 @@ private void LoadSettings()
}
}

private void Save()
private async Task Save()
{
bool downloadLocationChanged = DownloadLocationChanged();
bool loadAllDatabasesChanged = LoadAllDatabasesChanged();
SaveSettings();
ApplySettings(downloadLocationChanged, loadAllDatabasesChanged);
await ApplySettings(downloadLocationChanged, loadAllDatabasesChanged);
}

private void ApplySettings(bool downloadLocationChanged, bool loadAllDatabasesChanged)
private async Task ApplySettings(bool downloadLocationChanged, bool loadAllDatabasesChanged)
{
CrawlerService.Timeconstraint.SetRate((MaxConnections / (double)ConnectionTimeInterval));

if (loadAllDatabasesChanged && downloadLocationChanged)
{
CrawlerService.LibraryLoaded = new TaskCompletionSource<bool>();
CrawlerService.DatabasesLoaded = new TaskCompletionSource<bool>();
if (CrawlerService.StopCommand.CanExecute(null))
CrawlerService.StopCommand.Execute(null);
CrawlerService.LoadLibraryCommand.Execute(null);
CrawlerService.LoadAllDatabasesCommand.Execute(null);
await Task.WhenAll(CrawlerService.LibraryLoaded.Task, CrawlerService.DatabasesLoaded.Task);
CrawlerService.CheckIfDatabasesCompleteCommand.Execute(null);
}
else if (downloadLocationChanged)
{
CrawlerService.LibraryLoaded = new TaskCompletionSource<bool>();
CrawlerService.DatabasesLoaded = new TaskCompletionSource<bool>();
if (CrawlerService.StopCommand.CanExecute(null))
CrawlerService.StopCommand.Execute(null);
CrawlerService.LoadLibraryCommand.Execute(null);
CrawlerService.LoadAllDatabasesCommand.Execute(null);
await Task.WhenAll(CrawlerService.LibraryLoaded.Task, CrawlerService.DatabasesLoaded.Task);
CrawlerService.CheckIfDatabasesCompleteCommand.Execute(null);
}
else if (loadAllDatabasesChanged)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ public void RemoveActiveItem(QueueListItem itemToRemove)

public ICommand LoadAllDatabasesCommand { get; set; }

public ICommand CheckIfDatabasesCompleteCommand { get; set; }

public ICommand ListenClipboardCommand { get; set; }

public ICommand CrawlCommand { get; set; }
Expand All @@ -75,8 +77,9 @@ public void RemoveActiveItem(QueueListItem itemToRemove)

public Timer Timer { get; set; }

public TaskCompletionSource<bool> DatabasesLoaded { get; set; }
public TaskCompletionSource<bool> LibraryLoaded { get; set; }

public TaskCompletionSource<bool> DatabasesLoaded { get; set; }

public void SetActiveBlogFiles(IEnumerable<IBlog> blogFilesToAdd)
{
Expand Down

0 comments on commit 30b8dc1

Please sign in to comment.