| 
														
															@@ -5119,6 +5119,18 @@ or_state_load(void) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   return r; 
														 | 
														
														 | 
														
															   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. */ 
														 | 
														
														 | 
														
															 /** If writing the state to disk fails, try again after this many seconds. */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 #define STATE_WRITE_RETRY_INTERVAL 3600 
														 | 
														
														 | 
														
															 #define STATE_WRITE_RETRY_INTERVAL 3600 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -5143,11 +5155,13 @@ or_state_save(time_t now) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   if (accounting_is_enabled(get_options())) 
														 | 
														
														 | 
														
															   if (accounting_is_enabled(get_options())) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     accounting_run_housekeeping(now); 
														 | 
														
														 | 
														
															     accounting_run_housekeeping(now); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+  global_state->LastWritten = now; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   tor_free(global_state->TorVersion); 
														 | 
														
														 | 
														
															   tor_free(global_state->TorVersion); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   tor_asprintf(&global_state->TorVersion, "Tor %s", get_version()); 
														 | 
														
														 | 
														
															   tor_asprintf(&global_state->TorVersion, "Tor %s", get_version()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															   state = config_dump(&state_format, global_state, 1, 0); 
														 | 
														
														 | 
														
															   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_asprintf(&contents, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                "# Tor state file last generated on %s local time\n" 
														 | 
														
														 | 
														
															                "# Tor state file last generated on %s local time\n" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                "# Other times below are in GMT\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) { 
														 | 
														
														 | 
														
															   if (write_str_to_file(fname, contents, 0)<0) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     log_warn(LD_FS, "Unable to write state to file \"%s\"; " 
														 | 
														
														 | 
														
															     log_warn(LD_FS, "Unable to write state to file \"%s\"; " 
														 | 
													
												
											
												
													
														| 
														 | 
														
															              "will try again later", fname); 
														 | 
														
														 | 
														
															              "will try again later", fname); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    global_state->LastWritten = -1; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    last_state_file_write_failed = 1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     tor_free(fname); 
														 | 
														
														 | 
														
															     tor_free(fname); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     tor_free(contents); 
														 | 
														
														 | 
														
															     tor_free(contents); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     /* Try again after STATE_WRITE_RETRY_INTERVAL (or sooner, if the state 
														 | 
														
														 | 
														
															     /* Try again after STATE_WRITE_RETRY_INTERVAL (or sooner, if the state 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -5167,7 +5181,7 @@ or_state_save(time_t now) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return -1; 
														 | 
														
														 | 
														
															     return -1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   } 
														 | 
														
														 | 
														
															   } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-  global_state->LastWritten = time(NULL); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+  last_state_file_write_failed = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   log_info(LD_GENERAL, "Saved state to \"%s\"", fname); 
														 | 
														
														 | 
														
															   log_info(LD_GENERAL, "Saved state to \"%s\"", fname); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   tor_free(fname); 
														 | 
														
														 | 
														
															   tor_free(fname); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															   tor_free(contents); 
														 | 
														
														 | 
														
															   tor_free(contents); 
														 |