@@ -5,7 +5,7 @@ use std::{
55 fs,
66 io:: { Cursor , ErrorKind } ,
77 iter:: { self , Empty } ,
8- path:: Path ,
8+ path:: { Path , PathBuf } ,
99 process:: { Output , Stdio } ,
1010 sync:: Arc ,
1111 time:: Duration ,
@@ -16,8 +16,8 @@ use clusterizer_client::result::ClientResult;
1616use clusterizer_common:: {
1717 errors:: SubmitResultError ,
1818 records:: {
19- Platform , PlatformFilter , Project , ProjectFilter , ProjectVersion , ProjectVersionFilter ,
20- Task ,
19+ File , FileFilter , Platform , PlatformFilter , Project , ProjectFilter , ProjectVersion ,
20+ ProjectVersionFilter , Task ,
2121 } ,
2222 requests:: { FetchTasksRequest , SubmitResultRequest } ,
2323 types:: Id ,
@@ -35,9 +35,9 @@ struct ClusterizerClient {
3535}
3636
3737struct TaskInfo {
38+ file : File ,
39+ program_dir : PathBuf ,
3840 task : Task ,
39- project : Project ,
40- project_version : ProjectVersion ,
4141}
4242
4343enum Return {
@@ -92,24 +92,41 @@ impl ClusterizerClient {
9292
9393 async fn fetch_tasks ( self : Arc < Self > ) -> ClientResult < Return > {
9494 let tasks = loop {
95- let mut projects: HashMap < _ , _ > = self
95+ let projects: HashMap < _ , _ > = self
9696 . client
97- . get_all :: < Project > ( & ProjectFilter :: default ( ) )
97+ . get_all :: < Project > ( & ProjectFilter :: default ( ) . disabled ( false ) )
9898 . await ?
9999 . into_iter ( )
100100 . map ( |project| ( project. id , project) )
101101 . collect ( ) ;
102102
103- let projects : HashMap < _ , _ > = self
103+ let project_versions : HashMap < _ , _ > = self
104104 . client
105105 . get_all :: < ProjectVersion > ( & ProjectVersionFilter :: default ( ) . disabled ( false ) )
106106 . await ?
107107 . into_iter ( )
108108 . filter ( |project_version| self . platform_ids . contains ( & project_version. platform_id ) )
109- . filter_map ( |project_version| {
110- projects
111- . remove ( & project_version. project_id )
112- . map ( |project| ( project. id , ( project, project_version) ) )
109+ . map ( |project_version| ( project_version. id , project_version) )
110+ . collect ( ) ;
111+
112+ let files: HashMap < _ , _ > = self
113+ . client
114+ . get_all :: < File > ( & FileFilter :: default ( ) )
115+ . await ?
116+ . into_iter ( )
117+ . filter ( |file| {
118+ project_versions
119+ . clone ( )
120+ . into_iter ( )
121+ . any ( |( _, project_version) | project_version. file_id == file. id )
122+ } )
123+ . filter_map ( |file| {
124+ for project_version in project_versions. values ( ) {
125+ if project_version. file_id == file. id {
126+ return Some ( ( project_version. project_id , file) ) ;
127+ }
128+ }
129+ None
113130 } )
114131 . collect ( ) ;
115132
@@ -122,13 +139,12 @@ impl ClusterizerClient {
122139 . await ?
123140 . into_iter ( )
124141 . filter_map ( |task| {
125- let info = projects
126- . get ( & task. project_id )
127- . map ( |( project, project_version) | TaskInfo {
128- task,
129- project : project. clone ( ) ,
130- project_version : project_version. clone ( ) ,
131- } ) ;
142+ let file_path = self . args . cache_dir . join ( "bin" ) ;
143+ let info = files. get ( & task. project_id ) . map ( |file| TaskInfo {
144+ task,
145+ file : file. clone ( ) ,
146+ program_dir : file_path. clone ( ) . join ( format ! ( "{:x}" , file) ) ,
147+ } ) ;
132148
133149 if info. is_none ( ) {
134150 warn ! ( "Unwanted task received from server." ) ;
@@ -147,14 +163,10 @@ impl ClusterizerClient {
147163 } ;
148164
149165 for TaskInfo {
150- project_version , ..
166+ program_dir , file , ..
151167 } in & tasks
152168 {
153- let file = self . client . get_one ( project_version. file_id ) . await ?;
154-
155- let binary_dir = self . args . binaries_dir ( ) . join ( format ! ( "{:x}" , file) ) ;
156-
157- download_archive ( & file. url , & binary_dir, & self . args . cache_dir ) . await ?;
169+ download_archive ( & file. url , program_dir, & self . args . cache_dir ) . await ?;
158170 }
159171
160172 Ok ( Return :: FetchTasks ( tasks) )
@@ -163,26 +175,16 @@ impl ClusterizerClient {
163175 async fn execute_task (
164176 self : Arc < Self > ,
165177 TaskInfo {
166- task,
167- project,
168- project_version,
178+ task, program_dir, ..
169179 } : TaskInfo ,
170180 ) -> ClientResult < Return > {
171181 let slot_dir = tempfile:: tempdir ( ) ?;
172182
173183 info ! ( "Task id: {}, stdin: {}" , task. id, task. stdin) ;
174- info ! ( "Project id: {}, name: {}" , project. id, project. name) ;
175- debug ! (
176- "Project version id: {}, file id: {}" ,
177- project_version. id, project_version. file_id
178- ) ;
184+ info ! ( "Project id: {}" , task. project_id) ;
179185 debug ! ( "Slot dir: {}" , slot_dir. path( ) . display( ) ) ;
180186
181- let file = self . client . get_one ( project_version. file_id ) . await ?;
182-
183- let project_version_dir = self . args . binaries_dir ( ) . join ( format ! ( "{:x}" , file) ) ;
184-
185- let program = project_version_dir
187+ let program = program_dir
186188 . join ( format ! ( "main{}" , env:: consts:: EXE_SUFFIX ) )
187189 . canonicalize ( ) ?;
188190
0 commit comments