2017-01-14 11 views
13

आज से मैं"चेतावनी conda.gateways.disk: exp_backoff_fn (47): errno 41 के साथ Uncaught backoff" के दौरान "conda स्थापित"

चेतावनी conda.gateways.disk का एक बहुत मिलता है: exp_backoff_fn (47): errno 41

चेतावनी जब मैं को अपडेट करने या conda install या conda update का उपयोग कर संकुल स्थापित करने का प्रयास के साथ Uncaught backoff। उदाहरण के लिए:

(...) C:\Users\...> conda install numba 
Fetching package metadata ........... 
Solving package specifications: . 

Package plan for installation in environment C:\...: 

The following packages will be DOWNGRADED due to dependency conflicts: 

    numba: 0.30.0-np111py35_0 --> 0.30.1-np111py35_0 

Proceed ([y]/n)? y 

numba-0.30.0-np111p35_0 100% |###############################| Time: 0:00:00 2.50 MB/s 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 
WARNING conda.gateways.disk:exp_backoff_fn(47): Uncaught backoff with errno 41 

पैकेज बाद में स्थापित किए गए हैं लेकिन ये सभी चेतावनियां इंगित करती हैं कि कुछ ठीक से काम नहीं करता है।

OS: Windows 10 64 bit 
conda: 4.3.4 

क्या आप बता सकते हैं कि इन चेतावनियों को ठीक करने के लिए मुझे क्या करना है? या मैं उन्हें अनदेखा कर सकता हूं?

उत्तर

13

ये चेतावनियां जो आप देखते हैं वर्तमान कंडो स्रोत पेड़ के अनुसार "सामान्य" हैं। उपर्युक्त चेतावनियों की उत्पत्ति को समझने के लिए, आइए प्रश्नों में स्रोत कोड और कोंडा रिपोजिटरी (https://github.com/conda/conda) में हालिया प्रतिबद्धता देखें।

https://github.com/conda/conda/blob/4.3.4/conda/gateways/disk/init.py

# -*- coding: utf-8 -*- 
from __future__ import absolute_import, division, print_function, unicode_literals 

import sys 
from errno import EACCES, ENOENT, EPERM, EPROTOTYPE 
from logging import getLogger 
from os.path import basename 
from time import sleep 

from ...common.compat import on_win 

log = getLogger(__name__) 

MAX_TRIES = 7 


def exp_backoff_fn(fn, *args, **kwargs): 
    """Mostly for retrying file operations that fail on Windows due to virus scanners""" 
    max_tries = kwargs.pop('max_tries', MAX_TRIES) 
    if not on_win: 
     return fn(*args, **kwargs) 

    import random 
    # with max_tries = 6, max total time ~= 3.2 sec 
    # with max_tries = 7, max total time ~= 6.5 sec 
    for n in range(max_tries): 
     try: 
      result = fn(*args, **kwargs) 
     except (OSError, IOError) as e: 
      log.trace(repr(e)) 
      if e.errno in (EPERM, EACCES): 
       if n == max_tries-1: 
        raise 
       sleep_time = ((2 ** n) + random.random()) * 0.1 
       caller_frame = sys._getframe(1) 
       log.trace("retrying %s/%s %s() in %g sec", 
          basename(caller_frame.f_code.co_filename), 
          caller_frame.f_lineno, 
          fn.__name__, 
          sleep_time) 
       sleep(sleep_time) 
      elif e.errno in (ENOENT, EPROTOTYPE): 
       # errno.ENOENT File not found error/No such file or directory 
       # errno.EPROTOTYPE OSError(41, 'The directory is not empty') 
       raise 
      else: 
       log.warn("Uncaught backoff with errno %d", e.errno) 
       raise 
     else: 
      return result 

ऊपर स्रोत कोड यह एक चेतावनी विंडोज पर फेंक दिया गया लगता है कि दिखाई दे सकते हैं

से: प्रासंगिक स्रोत कोड कि चेतावनी आप देख प्रिंट पीछा कर रहा है

वायरस स्कैनर

के कारण विंडोज़ पर असफल होने वाले फ़ाइल ऑपरेशंस को पुनः प्रयास करना https://msdn.microsoft.com/en-us/library/t3ayayh1.aspx का उपयोग कर बारीकियों में जाने, ऐसा लगता है कि 41 errno को

ENOTEMPTY मेल खाती है: निर्देशिका खाली

नहीं जो यह संकेत देता है कि निर्देशिका निर्दिष्ट खाली नहीं है। क्योंकि वे एक शाखा है कि त्रुटि के इस प्रकार (ENOTEMPTY) के साथ संबंधित है, जबकि उदाहरण के लिए वे मामले में है यह EPERM या EACCES की तरह एक और त्रुटि है की जरूरत नहीं है यह ध्यान में न आया त्रुटि है।
में प्रतिबद्ध https://github.com/conda/conda/commit/fb2a783d9b9371559b5ea82aaf8ae631c2ce0450#diff-3757ed9862260ae3b54768b3e482e3fe
वे स्पष्ट रूप से रिपोर्टिंग EPROTOTYPEOSError(41, 'The directory is not empty') के रूप में निकालते हैं, तो अब आप देखते हैं कि त्रुटि संख्या

log.warn("Uncaught backoff with errno %d", e.errno) 

अन्य भाग वे संशोधित https://github.com/conda/conda/blob/fb2a783d9b9371559b5ea82aaf8ae631c2ce0450/conda/gateways/disk/delete.py में है में एक चेतावनी के रूप में रिपोर्ट, delete_trash() समारोह में है, इसलिए अब, यदि आप जानकारी लॉग सक्षम करेंगे, तो शायद आपको

"ट्रैश निर्देशिका% s \ n पूरी तरह से साफ़ करने में असमर्थ \ n% d शेष फाइलें हैं।"

log.info("Unable to fully clean trash directory %s\nThere are %d remaining file(s).", 
       trash_dir, len(files_remaining)) 

अब से सक्षम, delete_trash() दोनों अपने आदेश दिए गए हैं का हवाला देते हैं (स्थापित करें, अद्यतन) द्वारा कहा जाता है:
https://github.com/conda/conda/blob/f4b386476307e3979679957292d4f6e4c581df03/conda/cli/main_install.py
https://github.com/conda/conda/blob/a26b1eff17dcaf12f03aea5bbe8dee1e01308de7/conda/cli/main_update.py

के रूप में देखा जा सकता है, delete_trash() निम्न कोड खंडों द्वारा क्रमशः क्रमशः उल्लिखित 'इंस्टॉल' और 'अपडेट' फ़ाइलों में क्रमशः ट्रिगर किया गया है:

from ..gateways.disk.delete import delete_trash 

# some other code ... 

def execute(args, parser): 
    install(args, parser, 'install') 
    delete_trash() 

और

from ..gateways.disk.delete import delete_trash 

# some other code ... 

def execute(args, parser): 
    install(args, parser, 'update') 
    delete_trash() 

delete_trash() तो है कि अंततः चेतावनी आप exp_backoff_fn() से देख के रूप में पहले देखा को बढ़ावा मिलेगा backoff_rmdir() या backoff_unlink() के माध्यम से उस कोड पथ ट्रिगर किया जाएगा।
तो, योग करने के लिए, कॉल की मुख्य श्रृंखला

update or install --> delete_trash() --> backoff_rmdir() or backoff_unlink() --> exp_backoff_fn() --> your warning message 

होगा स्रोत कोड भंडार में किया संशोधन के अनुसार, डेवलपर्स का मानना ​​है कि तुलना में इन चेतावनी दे रहे हैं कि आप सुरक्षित रूप से अनदेखा कर सकते हैं क्योंकि इन चेतावनियों हो अद्यतन या स्थापना आदेशों के "सफाई" चरण में, यानी अद्यतन या स्थापित ऑपरेशन के बाद सफलतापूर्वक प्रदर्शन किया गया है।
मैं 100% गीला नहीं कह सकता था कि आप इन चेतावनियों को सुरक्षित रूप से अनदेखा कर सकते हैं। यदि कुछ प्रयासों के बाद ट्रैश निर्देशिका को हटाने के लिए आदेश सफल होता है तो कोई समस्या नहीं है। लेकिन यदि यह सफल नहीं होता है तो आप समस्या को हिट करेंगे कि यह निर्देशिका इसे हटाने के नतीजे के रूप में बड़ी और बड़ी हो जाएगी। इसके लिए रेपो में कुछ समस्याएं खोली गईं और मुझे नहीं पता कि फिक्सेस आपके द्वारा हिट किए गए कोड पथ को कवर करते हैं या नहीं। मेरी धारणा यह है कि शायद नहीं। आगे की जानकारी प्राप्त करने के लिए आप जानकारी लॉग स्तर को सक्रिय कर सकते हैं।


अद्यतन: यह समस्या https://github.com/conda/conda/issues/4164 बिल्कुल चेतावनी आप सूचना का उल्लेख है, क्योंकि लोगों को लंबे समय तक अद्यतन मिल रहे थे और सभी पुनर्प्रयास की वजह से समय स्थापित करें। जैसा कि मैंने उल्लेख किया है कि सभी रीट्रीज़ (घातीय बैक-ऑफ) के बाद डिलीट ऑपरेशन या तो सफल हो सकता है या असफल हो सकता है, वह व्यक्ति अपनी रिपोर्ट में इस पहलू का भी उल्लेख करता है।
तुम यहाँ में देख सकते हैं
https://github.com/conda/conda/issues/3664
वहाँ कुछ हैक्स है कि लोगों क्योंकि पुनर्प्रयास की लंबी प्रतीक्षा समय की समस्या को हल करने को रोजगार और यह भी चेतावनी के बिना अपने आदेश conda install X या conda update X के अगले रन कर देगा रहे हैं। ये सुझाव हैं:

  1. (/ पुनः के लिए समय speedup को हटाने के लिए) conda/gateways/disk/init.py
  2. की अपनी कॉपी में MAX_TRIES = 1 सेट इससे पहले कि आप अगले conda install X या conda update X चलाने .trash निर्देशिका को हटा दें। सरल स्क्रिप्ट का उपयोग करके उस निर्देशिका को हटाने के लिए कुछ लोगों द्वारा नियोजित कार्यवाही के लिए https://github.com/conda/conda/issues/3664 देखें। यह आमतौर पर ऐसा करने के लिए सुरक्षित होना चाहिए।

तो अपने प्रश्नों के उत्तर होगा:
1) आप वैकल्पिक हल https://github.com/conda/conda/issues/3664 में बताया गया है, जो निम्नलिखित powershell स्क्रिप्ट का उपयोग कर रहा है (और एक अन्य लिपि) का उपयोग कर सकते हैं:

$cir = conda info --root 
$trash_dir = "$($cir)\pkgs\.trash" 
if (Test-Path $trash_dir){ 
    Remove-Item -Recurse -Force $trash_dir 
} 
conda --debug update --all --yes --quiet 

मूल रूप से करने के लिए उस .trash निर्देशिका को साफ करें;

2) आप इस अर्थ में चेतावनियों को सुरक्षित रूप से अनदेखा कर सकते हैं कि वे कार्यक्षमता को प्रभावित नहीं करेंगे; समस्या यह है कि अधिक .trash पॉप्युलेट हो जाता है, अधिक समय और रीट्री आइटम को हटाने के लिए आगे बढ़ेंगे ताकि आप प्रदर्शन समस्याओं को प्रभावित कर सकें; जैसा कि आपने बताया है कि यह "रिसाव" है, लेकिन यह कार्यक्षमता को प्रभावित नहीं करता है। उस निर्देशिका को खाली और हटाया जाना चाहिए, क्योंकि इसमें अब ट्रैश शामिल नहीं है। सिस्टम इसे हटाने का प्रयास करेगा, लेकिन ऐसा करने में सक्षम नहीं हो सकता है। तो 1 का उपयोग करें)।


अद्यतन 2: जैसा कि मेरी टिप्पणी से एक में उल्लेख किया है, महत्वपूर्ण परिवर्तन से एक फ़ाइल conda/gateways/disk/__init__.py, जो एक "ठीक" (https://github.com/conda/conda/commit/6cb3be39aec1c738678ae27b3a264941d08c859a) था में है कि यह conda की 4.3.6 संस्करण के लिए किए गए (conda 4.3.6 release info) जो प्रश्न में चेतावनी हल करता है।
उस चेतावनी को देखने का मुख्य बिंदु ऐसी शाखा नहीं है जो पहले बताए गए त्रुटि के साथ स्पष्ट रूप से पकड़ता है और उससे निपटता है। अब, जब ENOTEMPTY प्रकार की त्रुटि होगी (जो त्रुटि है जो इस मामले में चेतावनी की छपाई को ट्रिगर कर रही थी), यह पकड़ा जाएगा और उस शाखा में नहीं जायेगा जो प्रश्न द्वारा जांच की गई चेतावनी को प्रिंट करता है। मुख्य अंतर को समझने के लिए संस्करण में 4.3.4 यह था

elif e.errno in (ENOENT, EPROTOTYPE):     
    raise 
else: 
    log.warn("Uncaught backoff with errno %d", e.errno) 
    raise 

जबकि संस्करण 4.3.6 में यह बन गया:

elif e.errno in (ENOENT, ENOTEMPTY):  
    raise 
else: 
    log.warn("Uncaught backoff with errno %s %d", errorcode[e.errno], e.errno) 
    raise 

और आप स्पष्ट रूप से कहा कि त्रुटि के लिए है कि अब देखना else शाखा में नहीं जाएंगे, इसलिए आपको इस मामले में वह संदेश दिखाई नहीं देगा।

+0

क्या आप स्पष्ट कर सकते हैं कि आप "चेतावनी को सुरक्षित रूप से अनदेखा कर सकते हैं" अगर यह इंस्टॉलेशन के बाद पूरी तरह से सफाई (अप्रयुक्त और अनावश्यक फ़ोल्डरों को हटा दें) में विफल रहता है? यह "स्मृति रिसाव" की तरह लगता है लेकिन रैम के बजाय हार्डड्राइव पर डेटा के साथ। (मुझे नहीं पता कि उस मामले में शब्द क्या है।) – MSeifert

+0

मैंने कहा क्योंकि मैं 100% की गारंटी नहीं दे सकता, अगर आप "जानकारी" लॉग स्तर को सक्रिय कर सकते हैं तो हम गीलेर को देख सकते हैं, हम लाइन को देखते हैं "ट्रैश निर्देशिका% को पूरी तरह से साफ़ करने में असमर्थ एस \ n वहाँ% d शेष फ़ाइल हैं "मुद्रित। मैं मानता हूं कि यह एक समस्या है। क्या आप जानकारी लॉग सक्रिय कर सकते हैं? याद रखें कि उन लोगों को विफल करने का प्रयास किया गया है, इसका मतलब यह नहीं है कि यह कोशिश करने की सभी कोशिशें विफल हो जाएंगी ... – fedepad

+0

यदि मैं कचरे को साफ़ करता हूं तो चेतावनियां अभी भी दिखाई देती हैं।हालांकि कचरा ज्यादातर खाली है इसलिए मुझे लगता है कि यह कुछ बार विफल रहता है और अंत में इसे साफ करने में सफल होता है। हालांकि अगर मैं मैन्युअल रूप से 'MAX_TRIES' बदलता हूं तो कचरा साफ़ नहीं होता है। तो मुझे चेतावनी और एक पूर्ण कचरा है। चेतावनी संदेश को हटाने से अलग कोई अन्य विचार जो मदद कर सकता है? – MSeifert

1

ये चेतावनियां मेरे कंप्यूटर पर कोंडा संस्करण 4.3.4 और 4.3.5 के साथ मौजूद हैं, लेकिन 4.2.x संस्करण में नहीं, और नवीनतम रिलीज (4.3.6) में नहीं।

$ conda update conda 

या डाउनग्रेड करने के लिए 4.2 करने के लिए:

$ conda install conda=4.2 
दोनों संस्करणों चेतावनी गायब हो जाते हैं साथ

मैं सबसे अच्छा तरीका करने के लिए समस्या conda अद्यतन करने के लिए होगा "ठीक" लगता है।

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