2013-10-15 12 views
8

मेरे पास कई डिमोन हैं जो बोटो का उपयोग करके अमेज़ॅन एस 3 से कई फाइलें पढ़ते हैं। एक बार हर दो बार, मैं एक ऐसी स्थिति में दौड़ रहा हूं जहां एक httplib.IncompleteRead गहरे अंदर बोटो से बाहर फेंक दिया जाता है। अगर मैं अनुरोध का प्रयास करता हूं और पुनः प्रयास करता हूं, तो यह तुरंत एक और अपूर्णता के साथ विफल रहता है। यहां तक ​​कि अगर मैं bucket.connection.close() पर कॉल करता हूं, तो सभी और अनुरोध अभी भी त्रुटिग्रस्त हो जाएंगे।बोटो एस 3 fansplib फेंक देता है। इनकंपलेट कभी-कभी

मुझे लगता है कि मैं यहां बोटो में एक बग में ठोकर खा सकता हूं, लेकिन किसी और ने इसे मारा नहीं है। क्या मुझसे कुछ गलत हो रही है? सभी डिमोन एकल-थ्रेडेड हैं, और मैंने is_secure दोनों तरीकों को सेट करने का प्रयास किया है।

Traceback (most recent call last): 
    ... 
    File "<file_wrapper.py",> line 22, in next 
    line = self.readline() 
    File "<file_wrapper.py",> line 37, in readline 
    data = self.fh.read(self.buffer_size) 
    File "<virtualenv/lib/python2.6/site-packages/boto/s3/key.py",> line 378, in read 
    self.close() 
    File "<virtualenv/lib/python2.6/site-packages/boto/s3/key.py",> line 349, in close 
    self.resp.read() 
    File "<virtualenv/lib/python2.6/site-packages/boto/connection.py",> line 411, in read 
    self._cached_response = httplib.HTTPResponse.read(self) 
    File "/usr/lib/python2.6/httplib.py", line 529, in read 
    s = self._safe_read(self.length) 
    File "/usr/lib/python2.6/httplib.py", line 621, in _safe_read 
    raise IncompleteRead(''.join(s), amt) 

पर्यावरण:

  • अमेज़न EC2
  • उबंटू 11.10
  • अजगर 2.6.7
  • Boto 2.12.0

उत्तर

2

यह अच्छी तरह से Boto में एक बग हो सकता है , लेकिन आपके द्वारा वर्णित लक्षण इसके लिए अद्वितीय नहीं हैं।

IncompleteRead using httplib

https://dev.twitter.com/discussions/9554

देखें httplib अपने ट्रैसबैक में प्रकट होता है के बाद से, एक समाधान यहाँ का प्रस्ताव है:

http://bobrochel.blogspot.in/2010/11/bad-servers-chunked-encoding-and.html?showComment=1358777800048

अस्वीकरण: मैं Boto के साथ कोई अनुभव नहीं है। यह केवल शोध पर आधारित है और पोस्ट किया गया है क्योंकि कोई अन्य प्रतिक्रिया नहीं मिली है।

+0

प्रयास के लिए धन्यवाद कर रही पर यहाँ एक अच्छा उदाहरण है। मुझे अभी भी इसका कोई अच्छा समाधान नहीं मिला है, लेकिन आप किसी और से अधिक बक्षीस के लायक हैं;) – shx2

+0

धन्यवाद।:) अगर मैं और जानूं तो मैं वापस पोस्ट करूंगा। – Glenn

+0

अद्यतन: https://groups.google.com/forum/?fromgroups#!topic/boto-users/YiPAOvxIrUY – Glenn

2

मैं थोड़ी देर के लिए इस समस्या से जूझ रहा हूं, लंबी चल रही प्रक्रियाओं को चला रहा हूं जो एस 3 से बड़ी मात्रा में डेटा पढ़ते हैं। मैंने यहां पोस्टरिटी के लिए अपना समाधान पोस्ट करने का फैसला किया।

सबसे पहले, मुझे यकीन है कि हैक द्वारा @Glenn काम करता है की ओर इशारा कर रहा हूँ, लेकिन मैं इसे उपयोग करने के लिए नहीं है, क्योंकि मैं विचार यह घुसपैठ (हैकिंग httplib) और असुरक्षित (यह आँख बंद करके देता है यह क्या हो गया, यानी return e.partial चुना है, तथ्य के बावजूद यह वास्तविक-त्रुटि-मामला हो सकता है)।

यहां समाधान है जो मैं आखिरकार आया था, जो काम करता प्रतीत होता है।

मैं इस सामान्य प्रयोजन पुन: प्रयास समारोह का उपयोग कर रहा:

import time, logging, httplib, socket 

def run_with_retries(func, num_retries, sleep = None, exception_types = Exception, on_retry = None): 
    for i in range(num_retries): 
     try: 
      return func() # call the function 
     except exception_types, e: 
      # failed on the known exception 
      if i == num_retries - 1: 
       raise # this was the last attempt. reraise 
      logging.warning('operation failed (%s) with error [%s]. will retry %d more times', func, e, num_retries - i - 1) 
      if on_retry is not None: 
       on_retry() 
      if sleep is not None: 
       time.sleep(sleep) 
    assert 0 # should not reach this point 

अब, जब S3 से एक फ़ाइल को पढ़ने, मैं इस समारोह है, जो आंतरिक रूप से IncompleteRead त्रुटि के मामले में पुनः प्रदर्शन उपयोग कर रहा हूँ। एक त्रुटि पर, पुनः प्रयास करने से पहले, मैं key.close(fast = True) पर कॉल करता हूं।

def read_s3_file(key): 
    """ 
    Reads the entire contents of a file on S3. 
    @param key: a boto.s3.key.Key instance 
    """ 
    return run_with_retries(
     key.read, num_retries = 3, sleep = 0.5, 
     exception_types = (httplib.IncompleteRead, socket.error), 
     # close the connection before retrying (fast=True so it doesn't attempt to read remaining) 
     on_retry = lambda: key.close(fast = True) 
    ) 
+1

बस fyi, https://github.com/boto/boto/issues/2204 पर उठाए गए मुद्दे – Glenn

संबंधित मुद्दे