ההגדרה של שגיאת הפריסה נכשלה

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

תיאור הבעיה

הפריסה של שרת proxy ל-API או תיקונים של תהליך משותף דרך ממשק המשתמש של Edge או הניהול API נכשלה ומופיעה שגיאת ההגדרה נכשלה.

הודעת שגיאה

הודעת השגיאה תופיע בממשק המשתמש של Edge כמו בדוגמה הבאה:

The revision is deployed, but traffic cannot flow.
com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}

צילום מסך של הודעת שגיאה לדוגמה שמופיעה בממשק המשתמש של Edge:

סיבות אפשריות

הפריסה של שרת Proxy ל-API עלולה להיכשל עם "ההגדרה נכשלה" בגלל סיבות רבות ושונות. בטבלה הבאה מפורטות כמה סיבות נפוצות לשגיאה הזו :

הסיבה תיאור הוראות לפתרון בעיות שרלוונטיות
חסרה מחלקת Java במדיניות JavaCallout חסרה מחלקה של Java בקובץ ה-JAR שאליו מפנה מדיניות JavaCallout. משתמשי Edge בענן פרטי
אופרנדים שגויים משמשים בתנאים בתהליך התנאים ביטויים או רכיבים זמניים שנמצאים בשימוש באחד מהצדדים של האופרטורים או בשניהם לא תקינים.
שם מארח לא חוקי במדיניות רישום הודעות לא ניתן לפענח את שם המארח המשמש במדיניות MessageLogging או להכיל תווים מיוחדים לא רצויים.
שם KeyValueMap לא חוקי השדה KeyValueMap לא חוקי או ריק במדיניות KeyValueMapOperations בשרת ה-proxy של ה-API.

שלבים לאבחון נפוץ

  1. קבלת סטטוס הפריסות של הגרסה הספציפית של ה-Proxy ל-API שבה נתקלת בשגיאת הפריסה באמצעות ממשק ה-API הבא:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. לפניכם פלט לדוגמה מה-API שלמעלה:

    "server" : [ { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "0a20926c-f4bf-401b-af84-05fd84b9f492" 
    }, { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "f2ee6ab4-a108-4465-a7ba-b56530d8e3fc" 
    }, { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "0f41991e-b310-4e77-aac5-5fdb150ef9f6" 
    },
    
  3. הודעת השגיאה "ההגדרה נכשלה" מופיעה בכל אחד ממעבדי ההודעות בפלט של סטטוס הפריסה.

  4. צריך להתחבר לאחד ממעבדי ההודעות ולבדוק את היומן /opt/apigee/var/log/edge-message-processor/logs/system.log. בודקים אם יש שגיאות במהלך הפריסה של ה-API Proxy.

  5. בהתאם לשגיאה/לחריגה שזוהו ביומן מעבד ההודעות, עליכם לפעול לפי השלבים המתאימים לפתרון הבעיה ולפתרון הבעיה.

  6. בקטעים שבהמשך מתוארות כמה מהחריגות הנפוצות ביותר שגורמות לשגיאת הפריסה 'ההגדרה נכשלה', ומפורטים שלבים לפתרון בעיות ולפתרון שלהן.

הסיבה: חסר שיעור Java במדיניות JavaCallout

אבחון

  1. ביומני מעבד ההודעות, אם מופיעה הודעה כלשהי עם ההודעה "נכשלה ההפעלה של JavaCallout Class" במהלך הפריסה של שרת Proxy ל-API (DeployEvent) כפי שמוצג בהמשך, ממשיכים לשלב 2. אם לא, עוברים למאמר אופרנדים שגויים שנמצאים בשימוש בתנאים בתהליך התנאי.
  2. במעבד ההודעות מוצג החריג הבא במהלך הפריסה של ה-API Proxy:

    2017-10-10 05:02:42,330 Apigee-Main-5 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='oauth2', applicationRevision='14', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class com.something.apigee.callout.crypto.main.SecretCallout 
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:89) ~[javacallout-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:230) ~[message-processor-1.0.0.jar:na] 
    …
    <snipped>
    
  3. הודעת השגיאה לחריגה שלמעלה מציינת שלא ניתן ליצור מופע של מחלקת JavaCallout com.something.apigee.callout.crypto.main.SecretCallout. שגיאה זו בדרך כלל מתרחשת כשהמחלקה הספציפית לא זמינה בקובץ ה-JAR שצוין במדיניות JavaCallout או בכל אחד מקובצי ה-JAR התלויים שלו.

  4. בודקים את קובץ ה-JAR שמכיל את כל המחלקות של החבילה com.something.apigee.callout.crypto.main ומוודאים שהמחלקה הספציפית com.something.apigee.callout.crypto.main.SecretCallout חסרה.

רזולוציה

  1. מוסיפים את המחלקה החסרה לקובץ ה-JAR הספציפי ומעלים את קובץ ה-JAR.
  2. לפרוס מחדש את ה-API Proxy.
  3. בדוגמה שלמעלה פתרנו את הבעיה על ידי:
    1. מתבצעת הוספה של הכיתה החסרה com.something.apigee.callout.crypto.main.SecretCallout לקובץ ה-JAR.
    2. העלאת קובץ ה-JAR המעודכן ופריסה מחדש של ה-API Proxy.

הסיבה: שימוש באופרנדים שגויים עם אופרטורים בתהליך התנאים

אבחון

  1. ביומני מעבד ההודעות, אם מופיע com.apigee.expressions.parser.ParseException במהלך הפריסה של שרת proxy ל-API או של תהליך משותף כפי שמוצג בהודעות לדוגמה שלמטה, ממשיכים לשלב 2. אם לא, עוברים לגורם הבא: שם מארח לא חוקי במדיניות רישום הודעות.

    דוגמה להודעת שגיאה

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. נבחן דוגמה כדי להבין איך לאבחן את הבעיה.

    דוגמה : Operands עבור <Operator> הביטוי צריך להיות ביטויי נתונים

  3. מעבד ההודעות מציג את החריג הבא במהלך הפריסה של תהליך משותף:

    2017-11-23 09:11:04,498  Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.loadXMLConfigurations() : Unable to Load default for path /organizations/myorg/apiproxies/Introspection/revisions/12/sharedflows/default
    2017-11-23 09:11:04,499  Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() :  sync error for Introspection and revision 12
    2017-11-23 09:11:04,499  Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() :  Actual Error
    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
        at com.apigee.expressions.parser.ExpressionParser.buildExpressionTree(ExpressionParser.java:337) ~[expressions-1.0.0.jar:na]
        at com.apigee.expressions.parser.ExpressionParser.parse(ExpressionParser.java:24) ~[expressions-1.0.0.jar:na]
        at com.apigee.expressions.parser.ExpressionParser.parseLogicExpression(ExpressionParser.java:28) ~[expressions-1.0.0.jar:na]
        at com.apigee.messaging.runtime.Step.getExpression(Step.java:67) ~[message-processor-1.0.0.jar:na]
        at com.apigee.messaging.runtime.Step.handleAdd(Step.java:58) ~[message-processor-1.0.0.jar:na]
        at com.apigee.messaging.runtime.SharedFlowRuntime.addStep(SharedFlowRuntime.java:81) ~[message-processor-1.0.0.jar:na] … <snipped>
    
  4. הודעת השגיאה ב-Parse במיוחד – 'Both the operands for EQUALS expression should be data expressions' מציין שיש בעיה בתנאי שכולל בעיה של 'שווה ל-' (=), 'לא שווה ל-' (!=) או 'נתונים סטטיסטיים עם האופרטור (=|)'.

    .
  5. עליך לבחון את התנאים בכל זרמי התנאים הקשורים לאופרטור הספציפי שצוין בהודעת השגיאה ולבדוק אם יש בעיות כלשהן:

    1. הביטויים בכל אחד מצידי האופרטור הם מאותו סוג. לדוגמה, אם יש משתנה מחרוזת בצד שמאל של האופרטור, אתם צריכים משתנה מחרוזת או ערך מחרוזת נוסף בצד שמאל.
    2. המערכת משתמשת במשתנים חוקיים בין האופרטורים.
    3. יש רווח בין האופרטור לכל אחד מהביטויים.

  6. אם אחד מהקריטריונים שצוינו למעלה לא מתקיים, מקבלים את Parse קונים – 'Both the operands for EQUALS expression should be data expressions'.

  7. נבחן דוגמה כדי להבין את הבעיה. הנה דוגמה למצב שגיאה שכאן

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. בדוגמה הזו, ניתן לראות שאין רווח בין הסימן 'או' ואז את התנאי הבא. כך שכשמנתחים את התנאי השני, הביטוי הראשון נלקח בתור "or(fault.name" לאופרטור EQUALS. שם משתנה זה אינו חוקי, ולכן הוא לא נחשב כביטוי נתונים חוקי. כתוצאה מכך, תקבלו את החריגה הבאה:

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    

רזולוציה

  1. חשוב לוודא שתמיד יש לכם ביטויי נתונים מתאימים בכל אחד מהצדדים של האופרטורים.
  2. בדוגמה שצוינה למעלה, הפתרון היה להבטיח שיש רווח אחרי "או" כפי שמתואר בקטע הקוד:

    <Condition>
               (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved")
    </Condition>
    
    

שם המארח לא תקין במדיניות MessageLogging

אבחון

  1. ביומני מעבד ההודעות, אם מופיעה הודעה כלשהי עם ההודעה "שם מארח לא חוקי" במהלך הפריסה של שרת proxy ל-API או 'תהליך משותף', כפי שמוצג בהמשך, ממשיכים לשלב 2. אם לא, עוברים לסיבה הבאה שם KeyValueMap לא חוקי.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. נבחן שתי דוגמאות כדי להבין איך לפתור את הבעיה ולפתור אותה.

דוגמה 1: שם המארח מכיל תו מיוחד לא רצוי

  1. במעבד ההודעות מוצג החריג הבא במהלך הפריסה של ה-API Proxy:

      2018-01-20 02:12:13,535 Apigee-Main-3 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='providersearch', applicationRevision='4', deploymentSpec=basepath=/;env=prod;, deploymentID=null}] 
      com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler 
      at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] 
      at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na]
      at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] 
      ...<snipped>
    
  2. החריג שלמעלה מראה שהפריסה נכשלת עקב 'שם המארח '<hostname>' לא חוקי' עבור Syslog handler". ההגדרה הזו מציינת ששם המארח שנעשה בו שימוש במדיניות MessageLogging הוא שם מארח לא חוקי.

  3. בדיקת החריגה ביומן של מעבד ההודעות מראה בקפידה שיש תו מיוחד לא רצוי "/" בסוף שם המארח 'splunkprod.myorg.com/'.

  4. התו המיוחד הלא רצוי הזה היה הסיבה לשגיאת הפריסה.

רזולוציה

  1. כדי לפתור את הבעיה, משנים את המדיניות של MessageLogging כדי להסיר תווים מיוחדים לא רצויים.
  2. בדוגמה שלמעלה, התו המיוחד "/" הוסר ממדיניות MessageLogging. הבעיה נפתרה.

דוגמה 2: שם מארח לא ניתן לפתרון

  1. יומן מעבד ההודעות כלל כמה שורות שמראות את אירוע הפריסה עבור שרת Proxy של API מופעל, ואחריה מופיעה חריגה שמתרחשת במהלך פריסת ה-Proxy של ה-API:

    2017-12-22 00:13:49,057 Apigee-Main-87446 INFO MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : configuring [DeployEvent{organization='myorg', application='myapi', applicationRevision='42', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 
    
    2017-12-22 00:13:49,318 Apigee-Main-87446 ERROR c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.refresh() : Unable to resolve host : input-prd.cloud.splunk.com: Name or service not known 
    
    2017-12-22 00:13:49,323 Apigee-Main-87446 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {} 
    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'input-prd.cloud.splunk.com' for Syslog handler 
    at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.populateDestinations(MessageLoggingStepDefinition.java:118) ~[message-logging-1.0.0.jar:na] 
    at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.handleAdd(MessageLoggingStepDefinition.java:99) ~[message-logging-1.0.0.jar:na] 
    …
    <snipped> 
    
  2. החריג שלמעלה מראה שהפריסה נכשלת עקב 'שם המארח '<hostname>' לא חוקי' עבור Syslog handler".

  3. אם קוראים את השורה שמעל החריגה, רואים שמעבד ההודעות לא יכול לפענח את שם המארח 'input-prd.cloud.splunk.com' שצוין במדיניות MessageLogging.

  4. כדי לוודא זאת, אפשר לנסות לבצע telnet לשם המארח ולמספר היציאה שצוינו במדיניות רישום ההודעות.

    1. צריך לבדוק את מדיניות MessageLogging בגרסה הספציפית של ה-proxy ל-API, ולאמת את שם המארח ואת מספר היציאה שבשימוש. בדוגמה שלמעלה, שם ה-API של שרת ה-proxy: myapi, גרסה: 42.

      המדיניות בנושא MessageLogging

        <MessageLogging async="false" continueOnError="false" enabled="true" name="Log-To-Splunk">
            <DisplayName>Log-To-Splunk</DisplayName>
            <Syslog>
                <Message>Message.id = {request.header.id}</Message>
                <Host>input-prd.cloud.splunk.com</Host>
                <Port>2900</Port>
                <Protocol>TCP</Protocol>
                <SSLInfo>
                    <Enabled>true</Enabled>
                </SSLInfo>
            </Syslog>
        </MessageLogging>
      
    2. Telnet למארח עם יציאה ספציפית. בדוגמה הזו, ניסינו את telnet וקיבלנו את אותה השגיאה שמופיעה ביומן מעבד ההודעות:

      telnet input-prd.cloud.splunk.com 2900 
      telnet: input-prd.cloud.splunk.com: Name or service not known 
      input-prd.cloud.splunk.com: Host name lookup failure
      
  5. הוכח בבירור שלא ניתן לפענח את שם המארח.

רזולוציה

  1. צריך לשנות את המדיניות של MessageLogging כדי להשתמש בשם המארח החוקי.

אם הבעיה עדיין נמשכת, עוברים אל פרטי האבחון שחובה לאסוף.

הסיבה: שם לא תקין של KeyValueMap

אבחון

  1. ביומנים של מעבד ההודעות, אם מופיעה חריגה עם ההודעה "KeyValueMap name is invalid" במהלך הפריסה של שרת Proxy ל-API או תהליך משותף כמו שמתואר בהמשך, ממשיכים לשלב 2. אם לא, עוברים למאמר נדרש איסוף של פרטי האבחון.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. נבחן דוגמה כדי להבין איך לפתור את הבעיה.

  3. יומן לדוגמה של מעבד הודעות שבו מוצגת החריגה עם ההודעה "KeyValueMap name is invalid" שמובילה לשגיאה במהלך פריסת ה-API של ה-Proxy

    2018-02-27 14:14:50,318  Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {}
    com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name  is invalid
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) [config-entities-1.0.0.jar:na]
            at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) [message-processor-1.0.0.jar:na]
    
    2018-02-27 14:14:50,344  Apigee-Main-6 ERROR BOOTSTRAP - RuntimeConfigurationServiceImpl.dispatchToListeners() : RuntimeConfigurationServiceImpl.dispatchToListeners : Error occurred while dispatching the request DeployEvent{organization='myorg', application='CustomerAPI', applicationRevision='1', deploymentSpec=basepath=/;env=test;, deploymentID=null} to com.apigee.application.bootstrap.listeners.MessageProcessorBootstrapListener@5009d06e
    com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name  is invalid
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) ~[config-entities-1.0.0.jar:na]
            at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) ~[message-processor-1.0.0.jar:na]
    
  4. החריג השני שלמעלה מציין שאירעה שגיאת הפריסה עבור שרת ה-proxy ל-API: CustomerAPI, גרסה: 1.

  5. בזמן בדיקת ה-Stacktrace, תראו ששגיאה זו משודרת במהלך ביצוע מדיניות KeyValuMapOperations.

  6. בדקתי את חבילת ה-proxy ל-API, וגיליתי שיש מדיניות KeyValuMapOperations אחת שכוללת את הקוד הבא:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="">
     <DisplayName>Pulling Keys</DisplayName>
     <Properties/>
     <ExclusiveCache>false</ExclusiveCache>
    
    
  7. כפי שמתואר למעלה, ה-mapIdentifier, שמציין את השם של KeyValueMap, מכיל מחרוזת ריקה. השם של KeyValueMap לא יכול להיות מחרוזת ריקה. זו הייתה הסיבה לשגיאה בפריסה.

רזולוציה

  1. יש לשנות את מדיניות KeyValueMapOperations כך שיהיה שם חוקי וחוקי ל-KeyValueMap.
  2. בדוגמה שלמעלה, פתרנו את הבעיה על ידי שינוי השם KeyValueMapOperations כך ששם KeyValueMap ייקרא "MyKeyValueMap". כפי שמוצג בהמשך:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="MyKeyValueMap">
        <DisplayName>Pulling Keys</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
    

חובה לאסוף את פרטי האבחון

אם הבעיה נמשכת גם לאחר ביצוע ההוראות שלמעלה, יש לאסוף את פרטי האבחון הבאים. עליכם לפנות לתמיכה של Apigee Edge ולספק להם את המידע שנאסף.

  1. הפלט של הפקודה

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. יומני מעבד ההודעות

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. פרטים על הקטעים במדריך הזה שכבר ניסו למצוא, ועל כל תובנות אחרות שיעזרו לנו לפתור את הבעיה במהירות.