[ 
https://issues.apache.org/jira/browse/HADOOP-3558?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Konstantin Boudnik updated HADOOP-3558:
---------------------------------------

    Tags: surelogic

> Class Job needs more synchronization
> ------------------------------------
>
>                 Key: HADOOP-3558
>                 URL: https://issues.apache.org/jira/browse/HADOOP-3558
>             Project: Hadoop Common
>          Issue Type: Bug
>    Affects Versions: 0.17.0
>            Reporter: Aaron Greenhouse
>         Attachments: HADOOP-3558.patch
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> Class Job needs additional synchronization to be truly thread-safe.  At a 
> minimum, the following changes should be made:
> * Making the field jc final.
> * Adding the synchronized modifier to the methods toString(), getJobName(), 
> setJobName(), getJobID(), setJobID(), getMapredJobID(), setMapredJobID(), 
> getJobConf(), setJobConf(), getMessage(), setMessage(), getDependingJobs(), 
> isCompleted(), and isReady(). 
> * Fix the method getDependingJobs() to return a *copy* of the list:
>   public synchronized ArrayList<Job> getDependingJobs() {
>      return new ArrayList<Job>(this.dependingJobs);
>    }
> The class can be further improved, however:
> * The methods setJobID() and setState() should be made package private (i.e., 
> default visibility) so that they can only be called from the JobControl class.
> * Reconsider the necessity of the all the getter and setter methods. In 
> particular, I question the need for getJobConf() and setJobConf(), 
> getDependingJobs(), setJobName(), setMapredJobId(), and setMesage(). If these 
> methods were eliminated, then the fields theJobConf and jobName could be made 
> final.
> * The field dependingJobs could also be made final if the constructor 
> Job(JobConf) were changed to
>   public Job(JobConf jobConf) throws IOException {
>      this(jobConf, new ArrayList());
>    }
> Then addDependingJob() could be simplified to
>   public synchronized boolean addDependingJob(Job dependingJob) {
>      if (this.state == Job.WAITING) { //only allowed to add jobs when waiting
>        return this.dependingJobs.add(dependingJob);
>      } else {
>        return false;
>      }
>    }
> This class has the additional weakness that the list object referenced by 
> field dependingJobs is provided by the outside environment to the 
> constructor.  This can be eliminated by copying the list when the object is 
> constructed:
>   public Job(JobConf jobConf, ArrayList<Job> dependingJobs) throws 
> IOException {
>     ...
>     this.dependingJobs = new ArrayList<Job>(dependingJobs);
>     ...
>   }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to