-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor/MTG-1254-json-downloader-service[mtg-144][mtg-526] #415
Draft
kstepanovdev
wants to merge
22
commits into
develop
Choose a base branch
from
refactor/json-downloader-service
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit
Hold shift + click to select a range
cc9eae2
Add pg migrations for new tasks structure
kstepanovdev 7ccd73f
Add Metadata Streamer
kstepanovdev bc20c66
Update tasks table & implement json downloader and streamer services
kstepanovdev de2656c
refactor persister
kstepanovdev 40ae4f6
add retry mechanism
kstepanovdev f3c7834
refactor persister
kstepanovdev 53f86b7
refactor the stuff
kstepanovdev dbb6d11
fix migrations and calls to new table structure
kstepanovdev c9de2a4
fix types and pg requests
kstepanovdev 89f0cad
add tests for json tasks selection && fix issues with db selection
kstepanovdev ab0a248
fmt
kstepanovdev 8a15a16
fmt && clippy
kstepanovdev 21921a5
remove redundant channel in streamer
kstepanovdev 1b44b1e
fix tests && refactor
kstepanovdev 68c690f
Refactor & fix comments from the PR
kstepanovdev 0d8f416
get rid of redundant spawning threads inside of functions
kstepanovdev a482673
remove redundant comment
kstepanovdev f3f3c86
Fix comments from PR review
kstepanovdev 64da4d3
work on comments
kstepanovdev ca86e90
avoid deadlocks and force immutability
kstepanovdev 530fe9c
fix comments
kstepanovdev b85ffac
rebase with develop
kstepanovdev File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
add tests for json tasks selection && fix issues with db selection
- Loading branch information
commit 89f0cade2cf6d5968d0755b3c64a2640b91aa43b
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,110 +1,199 @@ | ||
#[cfg(test)] | ||
#[cfg(feature = "integration_tests")] | ||
// #[cfg(feature = "integration_tests")] | ||
kstepanovdev marked this conversation as resolved.
Show resolved
Hide resolved
|
||
mod tests { | ||
use chrono::{DateTime, Days, Utc}; | ||
use entities::{enums::TaskStatus, models::Task}; | ||
use entities::{ | ||
enums::{OffchainDataMutability, TaskStatus}, | ||
models::Task, | ||
}; | ||
use setup::pg::*; | ||
use testcontainers::clients::Cli; | ||
|
||
#[tokio::test] | ||
async fn test_json_task_select() { | ||
async fn test_select_pending_tasks() { | ||
let cli = Cli::default(); | ||
let env = TestEnvironment::new(&cli).await; | ||
let asset_index_storage = &env.client; | ||
|
||
// make sure we select pending task | ||
let pending_task = Task { | ||
ofd_metadata_url: "https://url1.com".to_string(), | ||
ofd_locked_until: Some(Utc::now().checked_sub_days(Days::new(1)).unwrap()), | ||
ofd_attempts: 0, | ||
ofd_max_attempts: 10, | ||
ofd_error: None, | ||
ofd_status: TaskStatus::Pending, | ||
let pending_mutable_task = Task { | ||
metadata_url: "https://url1.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Mutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Pending, | ||
}; | ||
asset_index_storage | ||
.insert_json_download_tasks(&mut vec![pending_task.clone()]) | ||
.await | ||
.unwrap(); | ||
|
||
let selected = asset_index_storage.get_pending_tasks(100).await.unwrap(); | ||
assert_eq!(selected.len(), 1); | ||
assert_eq!(selected.get(0).unwrap().metadata_url, pending_task.ofd_metadata_url); | ||
|
||
// make sure we do not select locked task | ||
let locked_until: DateTime<Utc> = Utc::now().checked_add_days(Days::new(1)).unwrap(); | ||
let locked_task = Task { | ||
ofd_metadata_url: "https://url2.com".to_string(), | ||
ofd_locked_until: Some(locked_until), | ||
ofd_attempts: 0, | ||
ofd_max_attempts: 10, | ||
ofd_error: None, | ||
ofd_status: TaskStatus::Running, | ||
let pending_immutable_task = Task { | ||
metadata_url: "https://url2.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Immutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Pending, | ||
}; | ||
asset_index_storage | ||
.insert_json_download_tasks(&mut vec![locked_task.clone()]) | ||
.await | ||
.unwrap(); | ||
let mut tasks = vec![pending_mutable_task.clone(), pending_immutable_task.clone()]; | ||
|
||
let selected = asset_index_storage.get_pending_tasks(100).await.unwrap(); | ||
asset_index_storage.insert_new_tasks(&mut tasks).await.unwrap(); | ||
let selected = asset_index_storage.get_pending_metadata_tasks(2).await.unwrap(); | ||
assert_eq!(selected.len(), 2); | ||
assert_eq!(selected.get(0).unwrap().metadata_url, pending_mutable_task.metadata_url); | ||
assert_eq!(selected.get(1).unwrap().metadata_url, pending_immutable_task.metadata_url); | ||
} | ||
|
||
// previous task was selected and locked until row updated so here we receive 0 | ||
assert_eq!(selected.len(), 0); | ||
#[tokio::test] | ||
async fn test_select_pending_tasks_that_shouldnt_be_processed() { | ||
let cli = Cli::default(); | ||
let env = TestEnvironment::new(&cli).await; | ||
let asset_index_storage = &env.client; | ||
let next_try_at = Utc::now().checked_add_days(Days::new(10)).unwrap(); | ||
|
||
// make sure we do not select tasks with max_attempts reached | ||
let locked_until: DateTime<Utc> = Utc::now().checked_sub_days(Days::new(1)).unwrap(); | ||
let attempts_reached_task = Task { | ||
ofd_metadata_url: "https://url3.com".to_string(), | ||
ofd_locked_until: Some(locked_until), | ||
ofd_attempts: 10, | ||
ofd_max_attempts: 10, | ||
ofd_error: None, | ||
ofd_status: TaskStatus::Pending, | ||
let pending_mutable_task = Task { | ||
metadata_url: "https://url1.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Mutable, | ||
next_try_at, | ||
status: TaskStatus::Pending, | ||
}; | ||
asset_index_storage | ||
.insert_json_download_tasks(&mut vec![attempts_reached_task.clone()]) | ||
.await | ||
.unwrap(); | ||
|
||
let selected = asset_index_storage.get_pending_tasks(100).await.unwrap(); | ||
let pending_immutable_task = Task { | ||
metadata_url: "https://url2.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Mutable, | ||
next_try_at, | ||
status: TaskStatus::Pending, | ||
}; | ||
let mut tasks = vec![pending_mutable_task.clone(), pending_immutable_task.clone()]; | ||
|
||
asset_index_storage.insert_new_tasks(&mut tasks).await.unwrap(); | ||
let selected = asset_index_storage.get_pending_metadata_tasks(1).await.unwrap(); | ||
assert_eq!(selected.len(), 0); | ||
} | ||
|
||
// make sure we do not select failed tasks | ||
let locked_until: DateTime<Utc> = Utc::now().checked_sub_days(Days::new(1)).unwrap(); | ||
let failed_task = Task { | ||
ofd_metadata_url: "https://url4.com".to_string(), | ||
ofd_locked_until: Some(locked_until), | ||
ofd_attempts: 1, | ||
ofd_max_attempts: 10, | ||
ofd_error: None, | ||
ofd_status: TaskStatus::Failed, | ||
#[tokio::test] | ||
async fn test_select_successeful_tasks() { | ||
let cli = Cli::default(); | ||
let env = TestEnvironment::new(&cli).await; | ||
let asset_index_storage = &env.client; | ||
let next_try_at = Utc::now().checked_sub_days(Days::new(10)).unwrap(); | ||
|
||
let pending_mutable_task = Task { | ||
metadata_url: "https://url1.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Mutable, | ||
next_try_at, | ||
status: TaskStatus::Success, | ||
}; | ||
|
||
// will not be selected because it's immutable so refresh makes no sense | ||
let pending_immmutable_task = Task { | ||
metadata_url: "https://url2.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Immutable, | ||
next_try_at, | ||
status: TaskStatus::Success, | ||
}; | ||
asset_index_storage | ||
.insert_json_download_tasks(&mut vec![failed_task.clone()]) | ||
.await | ||
.unwrap(); | ||
|
||
let selected = asset_index_storage.get_pending_tasks(100).await.unwrap(); | ||
let mut tasks = vec![pending_mutable_task.clone(), pending_immmutable_task.clone()]; | ||
|
||
asset_index_storage.insert_new_tasks(&mut tasks).await.unwrap(); | ||
let selected = asset_index_storage.get_refresh_metadata_tasks(1).await.unwrap(); | ||
assert_eq!(selected.len(), 1); | ||
assert_eq!(selected.get(0).unwrap().metadata_url, pending_mutable_task.metadata_url); | ||
} | ||
|
||
#[tokio::test] | ||
async fn test_select_successeful_tasks_that_shouldnt_be_processed() { | ||
let cli = Cli::default(); | ||
let env = TestEnvironment::new(&cli).await; | ||
let asset_index_storage = &env.client; | ||
let next_try_at = Utc::now().checked_add_days(Days::new(10)).unwrap(); | ||
|
||
let pending_task = Task { | ||
metadata_url: "https://url1.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Mutable, | ||
next_try_at, | ||
status: TaskStatus::Success, | ||
}; | ||
|
||
asset_index_storage.insert_new_tasks(&mut vec![pending_task.clone()]).await.unwrap(); | ||
let selected = asset_index_storage.get_refresh_metadata_tasks(1).await.unwrap(); | ||
assert_eq!(selected.len(), 0); | ||
} | ||
|
||
// make sure we do not select success tasks | ||
let locked_until: DateTime<Utc> = Utc::now().checked_sub_days(Days::new(1)).unwrap(); | ||
let success_task = Task { | ||
ofd_metadata_url: "https://url5.com".to_string(), | ||
ofd_locked_until: Some(locked_until), | ||
ofd_attempts: 1, | ||
ofd_max_attempts: 10, | ||
ofd_error: None, | ||
ofd_status: TaskStatus::Success, | ||
#[tokio::test] | ||
async fn test_immutable_task_is_unselectable_for_refresh() { | ||
let cli = Cli::default(); | ||
let env = TestEnvironment::new(&cli).await; | ||
let asset_index_storage = &env.client; | ||
|
||
let immutable_and_pending_task = Task { | ||
metadata_url: "https://url1.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Immutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Pending, | ||
}; | ||
let immutable_and_successful_task = Task { | ||
metadata_url: "https://url2.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Immutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Success, | ||
}; | ||
asset_index_storage | ||
.insert_json_download_tasks(&mut vec![success_task.clone()]) | ||
.await | ||
.unwrap(); | ||
let immutable_and_failed_task = Task { | ||
metadata_url: "https://url3.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Immutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Failed, | ||
}; | ||
let mut tasks: Vec<Task> = vec![ | ||
immutable_and_pending_task.clone(), | ||
immutable_and_successful_task.clone(), | ||
immutable_and_failed_task.clone(), | ||
]; | ||
|
||
asset_index_storage.insert_new_tasks(&mut tasks).await.unwrap(); | ||
let selected = asset_index_storage.get_refresh_metadata_tasks(1).await.unwrap(); | ||
assert_eq!(selected.len(), 0); | ||
} | ||
|
||
#[tokio::test] | ||
async fn test_failed_task_is_unselectable() { | ||
let cli = Cli::default(); | ||
let env = TestEnvironment::new(&cli).await; | ||
let asset_index_storage = &env.client; | ||
|
||
let selected = asset_index_storage.get_pending_tasks(100).await.unwrap(); | ||
let failed_and_mutable_task = Task { | ||
metadata_url: "https://url1.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Mutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Failed, | ||
}; | ||
let failed_and_immutable_task = Task { | ||
metadata_url: "https://url2.com".to_string(), | ||
etag: None, | ||
last_modified_at: None, | ||
mutability: OffchainDataMutability::Immutable, | ||
next_try_at: DateTime::<Utc>::from(Utc::now()), | ||
status: TaskStatus::Failed, | ||
}; | ||
let mut tasks = vec![failed_and_mutable_task.clone(), failed_and_immutable_task.clone()]; | ||
|
||
asset_index_storage.insert_new_tasks(&mut tasks).await.unwrap(); | ||
let selected = asset_index_storage.get_pending_metadata_tasks(1).await.unwrap(); | ||
assert_eq!(selected.len(), 0); | ||
let selected = asset_index_storage.get_refresh_metadata_tasks(1).await.unwrap(); | ||
assert_eq!(selected.len(), 0); | ||
} | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same deadlocking potential here