|  |  | @ -165,16 +165,14 @@ class Uploader(): | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     return self.last_resp |  |  |  |     return self.last_resp | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def upload(self, key, fn): |  |  |  |   def upload(self, key, fn, network_type): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     try: |  |  |  |     try: | 
			
		
	
		
		
			
				
					
					|  |  |  |       sz = os.path.getsize(fn) |  |  |  |       sz = os.path.getsize(fn) | 
			
		
	
		
		
			
				
					
					|  |  |  |     except OSError: |  |  |  |     except OSError: | 
			
		
	
		
		
			
				
					
					|  |  |  |       cloudlog.exception("upload: getsize failed") |  |  |  |       cloudlog.exception("upload: getsize failed") | 
			
		
	
		
		
			
				
					
					|  |  |  |       return False |  |  |  |       return False | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     cloudlog.event("upload", key=key, fn=fn, sz=sz) |  |  |  |     cloudlog.event("upload_start", key=key, fn=fn, sz=sz, network_type=network_type) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     cloudlog.debug("checking %r with size %r", key, sz) |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if sz == 0: |  |  |  |     if sz == 0: | 
			
		
	
		
		
			
				
					
					|  |  |  |       try: |  |  |  |       try: | 
			
		
	
	
		
		
			
				
					|  |  | @ -185,10 +183,8 @@ class Uploader(): | 
			
		
	
		
		
			
				
					
					|  |  |  |       success = True |  |  |  |       success = True | 
			
		
	
		
		
			
				
					
					|  |  |  |     else: |  |  |  |     else: | 
			
		
	
		
		
			
				
					
					|  |  |  |       start_time = time.monotonic() |  |  |  |       start_time = time.monotonic() | 
			
		
	
		
		
			
				
					
					|  |  |  |       cloudlog.debug("uploading %r", fn) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       stat = self.normal_upload(key, fn) |  |  |  |       stat = self.normal_upload(key, fn) | 
			
		
	
		
		
			
				
					
					|  |  |  |       if stat is not None and stat.status_code in (200, 201, 403, 412): |  |  |  |       if stat is not None and stat.status_code in (200, 201, 403, 412): | 
			
		
	
		
		
			
				
					
					|  |  |  |         cloudlog.event("upload_success" if stat.status_code != 412 else "upload_ignored", key=key, fn=fn, sz=sz, debug=True) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         try: |  |  |  |         try: | 
			
		
	
		
		
			
				
					
					|  |  |  |           # tag file as uploaded |  |  |  |           # tag file as uploaded | 
			
		
	
		
		
			
				
					
					|  |  |  |           setxattr(fn, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE) |  |  |  |           setxattr(fn, UPLOAD_ATTR_NAME, UPLOAD_ATTR_VALUE) | 
			
		
	
	
		
		
			
				
					|  |  | @ -199,9 +195,10 @@ class Uploader(): | 
			
		
	
		
		
			
				
					
					|  |  |  |         self.last_time = time.monotonic() - start_time |  |  |  |         self.last_time = time.monotonic() - start_time | 
			
		
	
		
		
			
				
					
					|  |  |  |         self.last_speed = (sz / 1e6) / self.last_time |  |  |  |         self.last_speed = (sz / 1e6) / self.last_time | 
			
		
	
		
		
			
				
					
					|  |  |  |         success = True |  |  |  |         success = True | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         cloudlog.event("upload_success" if stat.status_code != 412 else "upload_ignored", key=key, fn=fn, sz=sz, network_type=network_type) | 
			
		
	
		
		
			
				
					
					|  |  |  |       else: |  |  |  |       else: | 
			
		
	
		
		
			
				
					
					|  |  |  |         cloudlog.event("upload_failed", stat=stat, exc=self.last_exc, key=key, fn=fn, sz=sz, debug=True) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         success = False |  |  |  |         success = False | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         cloudlog.event("upload_failed", stat=stat, exc=self.last_exc, key=key, fn=fn, sz=sz, network_type=network_type) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     return success |  |  |  |     return success | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -248,8 +245,7 @@ def uploader_fn(exit_event): | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     key, fn = d |  |  |  |     key, fn = d | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     cloudlog.debug("upload %r over %s", d, network_type) |  |  |  |     success = uploader.upload(key, fn, sm['deviceState'].networkType.raw) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     success = uploader.upload(key, fn) |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     if success: |  |  |  |     if success: | 
			
		
	
		
		
			
				
					
					|  |  |  |       backoff = 0.1 |  |  |  |       backoff = 0.1 | 
			
		
	
		
		
			
				
					
					|  |  |  |     elif allow_sleep: |  |  |  |     elif allow_sleep: | 
			
		
	
	
		
		
			
				
					|  |  | @ -258,7 +254,6 @@ def uploader_fn(exit_event): | 
			
		
	
		
		
			
				
					
					|  |  |  |       backoff = min(backoff*2, 120) |  |  |  |       backoff = min(backoff*2, 120) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     pm.send("uploaderState", uploader.get_msg()) |  |  |  |     pm.send("uploaderState", uploader.get_msg()) | 
			
		
	
		
		
			
				
					
					|  |  |  |     cloudlog.info("upload done, success=%r", success) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def main(): |  |  |  | def main(): | 
			
		
	
		
		
			
				
					
					|  |  |  |   uploader_fn(threading.Event()) |  |  |  |   uploader_fn(threading.Event()) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |