|  | @@ -5119,6 +5119,18 @@ or_state_load(void)
 | 
	
		
			
				|  |  |    return r;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/** Did the last time we tried to write the state file fail? If so, we
 | 
	
		
			
				|  |  | + * should consider disabling such features as preemptive circuit generation
 | 
	
		
			
				|  |  | + * to compute circuit-build-time. */
 | 
	
		
			
				|  |  | +static int last_state_file_write_failed = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/** Return whether the state file failed to write last time we tried. */
 | 
	
		
			
				|  |  | +int
 | 
	
		
			
				|  |  | +did_last_state_file_write_fail(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  return last_state_file_write_failed;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /** If writing the state to disk fails, try again after this many seconds. */
 | 
	
		
			
				|  |  |  #define STATE_WRITE_RETRY_INTERVAL 3600
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -5143,11 +5155,13 @@ or_state_save(time_t now)
 | 
	
		
			
				|  |  |    if (accounting_is_enabled(get_options()))
 | 
	
		
			
				|  |  |      accounting_run_housekeeping(now);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  global_state->LastWritten = now;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    tor_free(global_state->TorVersion);
 | 
	
		
			
				|  |  |    tor_asprintf(&global_state->TorVersion, "Tor %s", get_version());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    state = config_dump(&state_format, global_state, 1, 0);
 | 
	
		
			
				|  |  | -  format_local_iso_time(tbuf, time(NULL));
 | 
	
		
			
				|  |  | +  format_local_iso_time(tbuf, now);
 | 
	
		
			
				|  |  |    tor_asprintf(&contents,
 | 
	
		
			
				|  |  |                 "# Tor state file last generated on %s local time\n"
 | 
	
		
			
				|  |  |                 "# Other times below are in GMT\n"
 | 
	
	
		
			
				|  | @@ -5158,7 +5172,7 @@ or_state_save(time_t now)
 | 
	
		
			
				|  |  |    if (write_str_to_file(fname, contents, 0)<0) {
 | 
	
		
			
				|  |  |      log_warn(LD_FS, "Unable to write state to file \"%s\"; "
 | 
	
		
			
				|  |  |               "will try again later", fname);
 | 
	
		
			
				|  |  | -    global_state->LastWritten = -1;
 | 
	
		
			
				|  |  | +    last_state_file_write_failed = 1;
 | 
	
		
			
				|  |  |      tor_free(fname);
 | 
	
		
			
				|  |  |      tor_free(contents);
 | 
	
		
			
				|  |  |      /* Try again after STATE_WRITE_RETRY_INTERVAL (or sooner, if the state
 | 
	
	
		
			
				|  | @@ -5167,7 +5181,7 @@ or_state_save(time_t now)
 | 
	
		
			
				|  |  |      return -1;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  global_state->LastWritten = time(NULL);
 | 
	
		
			
				|  |  | +  last_state_file_write_failed = 0;
 | 
	
		
			
				|  |  |    log_info(LD_GENERAL, "Saved state to \"%s\"", fname);
 | 
	
		
			
				|  |  |    tor_free(fname);
 | 
	
		
			
				|  |  |    tor_free(contents);
 |