@@ -17,6 +17,7 @@ limitations under the License.
1717package job
1818
1919import (
20+ "errors"
2021 "fmt"
2122 "sort"
2223 "sync"
@@ -157,19 +158,19 @@ func (cc *Controller) createJob(job *vkv1.Job) (*vkv1.Job, error) {
157158 return nil , err
158159 }
159160
160- if err := cc .createPodGroupIfNotExist (job ); err != nil {
161- cc .recorder .Event (job , v1 .EventTypeWarning , string (vkv1 .PodGroupError ),
162- fmt .Sprintf ("Failed to create PodGroup, err: %v" , err ))
163- return nil , err
164- }
165-
166161 newJob , err := cc .createJobIOIfNotExist (job )
167162 if err != nil {
168163 cc .recorder .Event (job , v1 .EventTypeWarning , string (vkv1 .PVCError ),
169164 fmt .Sprintf ("Failed to create PVC, err: %v" , err ))
170165 return nil , err
171166 }
172167
168+ if err := cc .createPodGroupIfNotExist (newJob ); err != nil {
169+ cc .recorder .Event (job , v1 .EventTypeWarning , string (vkv1 .PodGroupError ),
170+ fmt .Sprintf ("Failed to create PodGroup, err: %v" , err ))
171+ return nil , err
172+ }
173+
173174 return newJob , nil
174175}
175176
@@ -336,18 +337,20 @@ func (cc *Controller) syncJob(jobInfo *apis.JobInfo, updateStatus state.UpdateSt
336337
337338func (cc * Controller ) createJobIOIfNotExist (job * vkv1.Job ) (* vkv1.Job , error ) {
338339 // If PVC does not exist, create them for Job.
339- var needUpdate , nameExist bool
340+ var needUpdate bool
340341 volumes := job .Spec .Volumes
342+ if job .Status .ControlledResources == nil {
343+ job .Status .ControlledResources = make (map [string ]string )
344+ }
341345 for index , volume := range volumes {
342- nameExist = false
343346 vcName := volume .VolumeClaimName
344347 if len (vcName ) == 0 {
345348 //NOTE(k82cn): Ensure never have duplicated generated names.
346349 for {
347350 vcName = vkjobhelpers .MakeVolumeClaimName (job .Name )
348351 exist , err := cc .checkPVCExist (job , vcName )
349352 if err != nil {
350- return nil , err
353+ return job , err
351354 }
352355 if exist {
353356 continue
@@ -356,37 +359,40 @@ func (cc *Controller) createJobIOIfNotExist(job *vkv1.Job) (*vkv1.Job, error) {
356359 needUpdate = true
357360 break
358361 }
359- } else {
360- exist , err := cc .checkPVCExist (job , vcName )
361- if err != nil {
362- return nil , err
363- }
364- nameExist = exist
365- }
366-
367- if ! nameExist {
368- if job .Status .ControlledResources == nil {
369- job .Status .ControlledResources = make (map [string ]string )
370- }
371362 if volume .VolumeClaim != nil {
372363 if err := cc .createPVC (job , vcName , volume .VolumeClaim ); err != nil {
373- return nil , err
364+ return job , err
374365 }
375366 job .Status .ControlledResources ["volume-pvc-" + vcName ] = vcName
376367 } else {
377368 job .Status .ControlledResources ["volume-emptyDir-" + vcName ] = vcName
378369 }
370+ } else {
371+ if job .Status .ControlledResources ["volume-emptyDir-" + vcName ] == vcName || job .Status .ControlledResources ["volume-pvc-" + vcName ] == vcName {
372+ continue
373+ }
374+ exist , err := cc .checkPVCExist (job , vcName )
375+ if err != nil {
376+ return job , err
377+ }
378+ if exist {
379+ job .Status .ControlledResources ["volume-pvc-" + vcName ] = vcName
380+ } else {
381+ msg := fmt .Sprintf ("pvc %s is not found, the job will be in the Pending state until the PVC is created" , vcName )
382+ glog .Error (msg )
383+ return job , errors .New (msg )
384+ }
379385 }
380386 }
381387 if needUpdate {
382388 newJob , err := cc .vkClients .BatchV1alpha1 ().Jobs (job .Namespace ).Update (job )
383389 if err != nil {
384390 glog .Errorf ("Failed to update Job %v/%v for volume claim name: %v " ,
385391 job .Namespace , job .Name , err )
386- return nil , err
392+ return job , err
387393 }
388- newJob .Status = job .Status
389394
395+ newJob .Status = job .Status
390396 return newJob , err
391397 }
392398 return job , nil
0 commit comments