From c358fd8e4ce5f9786a0e8a2ae026327709d6d8af Mon Sep 17 00:00:00 2001 From: aviramd Date: Tue, 15 Oct 2024 10:58:19 +0300 Subject: [PATCH 1/7] Add SAI generate debug dump HLD --- .../SAI_generate_debug_dump.md | 115 ++++++++++++++++++ .../images/generate_dubug_dump_file.png | Bin 0 -> 41798 bytes 2 files changed, 115 insertions(+) create mode 100755 doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md create mode 100644 doc/SAI_generate_debug_dump/images/generate_dubug_dump_file.png diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md new file mode 100755 index 0000000000..8f21600caf --- /dev/null +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -0,0 +1,115 @@ +# SYNCD Optimization for SONiC + +## Table of Contents + +- [SYNCD Optimization for SONiC](#syncd-optimization-for-sonic) + - [Table of Contents](#table-of-contents) + - [Revision](#revision) + - [Scope](#scope) + - [Terminology](#terminology) + - [Overview](#overview) + - [Requirements](#requirements) + - [Architecture Design](#architecture-design) + - [Implementation](#implementation) + - [sonic-utilities](#sonic-utilities) + - [SWSS](#SWSS) + - [SWSS-common](#SWSS-common) + - [SAI-Redis](#SAI-Redis) + - [SAI API](#sai-api) + - [YANG model changes](#yang-model-changes) + - [CLI](#cli) + - [Warmboot and Fastboot Design Impact] + - [Testing Requirements/Design] + - [Unit Test cases] + - [System Test cases] + +### Revision + +| Rev | Date | Author | Change Description | +| :-: | :------: | :-----------------------: | ------------------ | +| 0.1 | 10/15/24 | Aviram Dali (**Marvell**) | Initial Draft | + +### Scope + +The scope of this document is to design the handling of taking a SAI dump during show techsupport call + +### Terminology + +| Term | Definition | +| --------- | --------------------------------------- | +| ASIC | Application Specific Integrated Circuit | +| SYNCD | ASIC Synchronization Service | +| SAI | Switch Abstraction Interface | +| API | Application Programmable Interface | +| SWSS | Switch State Service | + + +### Overview +SAI dump file usually includes, SDK info and configuration , SAI stats, capture of SAI lower layer states like registers vales etc... +Currently, the SAI dump file is generated only during SAI failures by executing a dedicated executable named "saidump", which linkage with the SAI lib during initialization it creates a new switch in redundant mode. This new feature allows users to generate a SAI debug dump file using command such as show tech-support not necessarily during failure, and the dump file will be generated directly from the syncd process. + + +### Requirements +Each vendor can add to its specific implantation part of the `show techsupport` a simple call to a new API to generate the SAI debug dump file. + +### Architecture Design + +1. A user command, such as `show techsupport` triggers the `generate_sai_dump` bash script, which writes the file name to the STATE DB. +2. A new orchestration agent, `DbgGenDumpOrch`, is triggered to handle the request. +3. `DbgGenDumpOrch` writes the file name to the ASIC DB and sets a new operation `REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMP` for syncd. +4. Syncd calls the global SAI API `dbgGenerateDump` to generate the debug dump file, which is saved in syncd's file system. +5. Syncd sends a reply back to `DbgGenDumpOrch`. +6. `DbgGenDumpOrch` analyzes the response. +7. `DbgGenDumpOrch` updates the result in the STATE DB. +8. The user command retrieves the result. +9. The debug dump file is pulled on success. + +The below diagram explains the sequence when a SAI failure happens +![](/images/generate_debug_dump_file.JPG) + + +### Implementation + +#### sonic-utilities +Add a new script to the Debian file system named `gen_sai_dbg_dump_lib.sh`, which includes the `generate_sai_dump` API. This function takes the desired file name as an argument and initiates the generation of a SAI debug dump file by performing the following steps: + +- Set the file name in the STATE DB to trigger the dump generation. +- Poll the STATE DB for the result with timeout of 10 seconds. +- Delete the relevant entries from the STATE DB after triggering the dump file. +- Ensure that the generated file exists. + + +**Show Techsupport** +- Introduced a new generic API, `generate_sai_dbg_dump_file`, in `generate_dump.sh` (invoked by the "show techsupport" command) to create a debug dump file. This change allows each vendor to call this API in their vendor-specific implementation +- After the file is generated, it is moved into the techsupport folder. + +#### SWSS +- A new orchestration agent, `DbgGenDumpOrch`, has been introduced, which is triggered by updates in the STATE DB. +- It updates syncd by writing to the ASIC DB and waits for a response. Once received, it writes the result back to the STATE DB, allowing the calling application to retrieve the file. + +#### SWSS-common +- add new tables name + +#### SAI-Redis +- Implemented a new global API, `dbgGenerateDump`, in the `SaiInterface` class, ensuring that all derived classes provide the corresponding implementation, including the vendor SAI class to call the global API `sai_dbg_generate_dump`. +- Added a new syncd operation, `REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMP`, which invokes the SAI API to generate the debug dump file. + +#### SAI API +There are currently no new SAI APIs required for this feature. + +#### YANG model changes +No Changes. + +#### CLI +No changes. + +### Warmboot and Fastboot Design Impact +There is no impact on warmboot or fastboot + +### Testing Requirements/Design + +#### Unit Test cases + +#### System Test cases +Verify if the dump in techsupport contains the SAI failure dump is collected. + diff --git a/doc/SAI_generate_debug_dump/images/generate_dubug_dump_file.png b/doc/SAI_generate_debug_dump/images/generate_dubug_dump_file.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8b72c28cc2829e5f637ad1bca828ac8160aaaf GIT binary patch literal 41798 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 Date: Tue, 15 Oct 2024 10:58:19 +0300 Subject: [PATCH 2/7] Add SAI generate debug dump HLD --- .../SAI_generate_debug_dump.md | 254 ++++++++++++++---- .../images/generate_debug_dump_file.png | Bin 0 -> 41829 bytes .../images/generate_dubug_dump_file.png | Bin 41798 -> 0 bytes 3 files changed, 199 insertions(+), 55 deletions(-) create mode 100644 doc/SAI_generate_debug_dump/images/generate_debug_dump_file.png delete mode 100644 doc/SAI_generate_debug_dump/images/generate_dubug_dump_file.png diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md index 8f21600caf..0813b1a706 100755 --- a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -1,8 +1,8 @@ -# SYNCD Optimization for SONiC +# Generate SAI Debug Dump ## Table of Contents -- [SYNCD Optimization for SONiC](#syncd-optimization-for-sonic) +- [Generate SAI Debug Dump](#Generate-SAI-Debug-Dump) - [Table of Contents](#table-of-contents) - [Revision](#revision) - [Scope](#scope) @@ -11,88 +11,230 @@ - [Requirements](#requirements) - [Architecture Design](#architecture-design) - [Implementation](#implementation) - - [sonic-utilities](#sonic-utilities) - - [SWSS](#SWSS) - - [SWSS-common](#SWSS-common) - - [SAI-Redis](#SAI-Redis) - - [SAI API](#sai-api) - - [YANG model changes](#yang-model-changes) - - [CLI](#cli) - - [Warmboot and Fastboot Design Impact] - - [Testing Requirements/Design] - - [Unit Test cases] - - [System Test cases] + - [generate_sai_dump bash script](#generate_sai_dump-bash-script) + - [show techsupport](#show-techsupport) + - [gen_sai_dbg_dump.sh](#gen_sai_dbg_dump.sh) + - [DbgGenDump orchestration](#DbgGenDump-orchestration) + - [SAI global API sai_dbg_generate_dump](#SAI-global-API-sai-dbg_generate_dump) + - [syncd extended operation](#syncd-extended-operation) + - [YANG model changes](#yang-model-changes) + - [CLI](#cli) + - [Warmboot and Fastboot Design Impact](#Warmboot-and-Fastboot-Design-Impac) + - [Testing Requirements/Design](#Testing-Requirements/Design) + - [Unit Test cases](#Unit-Test-cases) + - [System Test cases](#System-Test-cases) ### Revision | Rev | Date | Author | Change Description | | :-: | :------: | :-----------------------: | ------------------ | | 0.1 | 10/15/24 | Aviram Dali (**Marvell**) | Initial Draft | - ### Scope -The scope of this document is to design the handling of taking a SAI dump during show techsupport call +The scope of this document is to design the handling of generating a SAI debug dump file by user command , specifically for `show techsupport` command. ### Terminology -| Term | Definition | -| --------- | --------------------------------------- | -| ASIC | Application Specific Integrated Circuit | -| SYNCD | ASIC Synchronization Service | -| SAI | Switch Abstraction Interface | -| API | Application Programmable Interface | -| SWSS | Switch State Service | - - +| Term | Definition | +| ----- | --------------------------------------- | +| ASIC | Application Specific Integrated Circuit | +| SYNCD | ASIC Synchronization Service | +| SAI | Switch Abstraction Interface | +| API | Application Programmable Interface | +| SWSS | Switch State Service | ### Overview -SAI dump file usually includes, SDK info and configuration , SAI stats, capture of SAI lower layer states like registers vales etc... -Currently, the SAI dump file is generated only during SAI failures by executing a dedicated executable named "saidump", which linkage with the SAI lib during initialization it creates a new switch in redundant mode. This new feature allows users to generate a SAI debug dump file using command such as show tech-support not necessarily during failure, and the dump file will be generated directly from the syncd process. +SAI dump file usually includes SDK info and configuration , SAI stats, capture of SAI lower layer states like registers vales etc... +Currently, the SAI dump file is generated only during SAI failures by executing a dedicated executable named "saisdkdump" (which linkage with the SAI lib during initialization and creates a new switch in redundant mode) + +This new feature allows users to generate a SAI debug dump file using `show tech-support` command, not necessarily during failure. ### Requirements -Each vendor can add to its specific implantation part of the `show techsupport` a simple call to a new API to generate the SAI debug dump file. + ++ Add infrastructure to generate a SAI debug dump file upon user request ++ generate a SAI debug dump file from 'show techsupport' command. ++ Generate a SAI debug dump file within the context of Syncd. ++ Maintain the existing mechanism for generating the SAI debug dump file on failure. ### Architecture Design -1. A user command, such as `show techsupport` triggers the `generate_sai_dump` bash script, which writes the file name to the STATE DB. +1. A user command, such as `show techsupport` triggers the `generate_sai_dump`, and creates a new table with the dump file name to create in the APPL DB. 2. A new orchestration agent, `DbgGenDumpOrch`, is triggered to handle the request. 3. `DbgGenDumpOrch` writes the file name to the ASIC DB and sets a new operation `REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMP` for syncd. 4. Syncd calls the global SAI API `dbgGenerateDump` to generate the debug dump file, which is saved in syncd's file system. 5. Syncd sends a reply back to `DbgGenDumpOrch`. 6. `DbgGenDumpOrch` analyzes the response. -7. `DbgGenDumpOrch` updates the result in the STATE DB. +7. `DbgGenDumpOrch` updates the result in the APPL DB. 8. The user command retrieves the result. 9. The debug dump file is pulled on success. -The below diagram explains the sequence when a SAI failure happens -![](/images/generate_debug_dump_file.JPG) - +The below diagram explains the generate debug dump file flow -### Implementation - -#### sonic-utilities -Add a new script to the Debian file system named `gen_sai_dbg_dump_lib.sh`, which includes the `generate_sai_dump` API. This function takes the desired file name as an argument and initiates the generation of a SAI debug dump file by performing the following steps: - -- Set the file name in the STATE DB to trigger the dump generation. -- Poll the STATE DB for the result with timeout of 10 seconds. -- Delete the relevant entries from the STATE DB after triggering the dump file. -- Ensure that the generated file exists. +![Architecture Design](images/generate_debug_dump_file.png) -**Show Techsupport** -- Introduced a new generic API, `generate_sai_dbg_dump_file`, in `generate_dump.sh` (invoked by the "show techsupport" command) to create a debug dump file. This change allows each vendor to call this API in their vendor-specific implementation -- After the file is generated, it is moved into the techsupport folder. - -#### SWSS -- A new orchestration agent, `DbgGenDumpOrch`, has been introduced, which is triggered by updates in the STATE DB. -- It updates syncd by writing to the ASIC DB and waits for a response. Once received, it writes the result back to the STATE DB, allowing the calling application to retrieve the file. - -#### SWSS-common -- add new tables name +### Implementation -#### SAI-Redis -- Implemented a new global API, `dbgGenerateDump`, in the `SaiInterface` class, ensuring that all derived classes provide the corresponding implementation, including the vendor SAI class to call the global API `sai_dbg_generate_dump`. -- Added a new syncd operation, `REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMP`, which invokes the SAI API to generate the debug dump file. +#### generate_sai_dump bash script +Introduced a new script `/usr/local/bin/gen_sai_dbg_dump_lib.sh` that can be invoked from `show techsupport` or any other command + +``` +############################################################################### +# generate_sai_dump +# +# Description: +#  This function +# it ensures that the `syncd` container is running before initiating the dump. +# triggers the generation of a SAI debug dump file through Redis APPL DB. +# it waits for the file by Polling (with timeout) the APPL DB for the result. +# it removes the table from the DB when done. +# +# Arguments: +#  $1 - Filename for the SAI debug dump file. +#  $2 - Optional timeout for file readiness (default: 10 seconds). +# +# Returns: +#  0 - On success +#  1 - On failure +############################################################################### +generate_sai_dump() { + +} +``` + +#### APPL DB +Introduced a new Tables in APPL DB : + +``` +key = DBG_GEN_DUMP_TABLE:DUMP ; Unique identifier for gen dump file. +;field = value +file_name = STRING ; full path file to save the dump file. +``` + +Example: +``` +redis-cli -n 0 HGETALL "DBG_GEN_DUMP_TABLE:DUMP" +1) "file" +2) "/var/log/sai_dump_file.log" +``` + +wait for the dump generation result example: +``` +key = DBG_GEN_DUMP_STAUS_TABLE:DUMP ; Unique identifier for gen dump file result +;field = value +status = SAI_STATUS ; result status of file dump generation +``` + +Example: +``` +redis-cli -n 0 HGETALL "DBG_GEN_DUMP_STATUS_TABLE:DUMP" +1) "status" +2) "0" +``` + + +#### show techsupport +Introduced a new generic API, `generate_sai_dbg_dump_file`, in `generate_dump.sh` (invoked by the `show techsupport` command) to create a debug dump file: + +``` + +# generate_sai_dbg_dump_file +# +# Description: +# This function triggers the generation of a SAI debug dump file and saves the +# dumped file in the show techsupport output directory. +# +# Globals: +#  None +# +# Arguments: +#  $1 - (required) The file name (without path) the SAI debug dump will be saved +# under this name in the show techsupport output directory. +# +# Returns: +#  0 - On success +#  1 - On failure +############################################################################### +generate_sai_dbg_dump_file(){ +... +} +``` + +usage: + +``` +generate_sai_dbg_dump_file "sai_sdk_dump_$(date +"%m_%d_%Y_%I_%M_%p")" +``` + +#### gen_sai_dbg_dump.sh +Introduced a new script `/usr/local/bin/gen_sai_dbg_dump.sh` that can be invoked from the CLI to generate the dump file directly under the given name (without calling `show techsupport` command) + +``` +/usr/local/bin/gen_sai_dbg_dump.sh -f /tmp/my_dump_file.log +``` +#### DbgGenDump orchestration +- A new orchestration agent, `DbgGenDumpOrch`, has been introduced, which is triggered by updates in the APPL DB. + +- It updates syncd by writing to the ASIC DB and waits for a response. Once received, it writes the result back to the APPL DB, allowing the calling application to retrieve the file. + +#### ASIC DB +Introduced a new Tables in ASIC DB: + +``` +key = DBG_GEN_DUMP:DUMP ; Unique identifier for gen dump file result +;field = value +file_name = STRING ; full path file to save the dump file. +``` + +Example: + +``` +redis-cli -n 1 HGETALL "DBG_GEN_DUMP:DUMP" +1) "DBG_GENERATE_DUMP" +2) "/var/log/sai_dump_file.log" +``` + +#### SONIC support global API sai_dbg_generate_dump +`sai_dbg_generate_dump` is already supported in SAI. Similar to other global API that supported in Sonic, add support to the global API `sai_dbg_generate_dump` to the `SaiInterface` class and ensuring that all derived classes provide the corresponding implementation + +``` +    class SaiInterface{ +     ... +            virtual sai_status_t dbgGenerateDump( +                    _In_ const char *dump_file_name) = 0; +     ...           +    } +``` +  +#### syncd extended operation + +Similar to other global API that supported in Sonic, add new operation to the syncd to support SAI debug generate dump + +``` +sai_status_t Syncd::processSingleEvent( +        _In_ const swss::KeyOpFieldsValuesTuple &kco) +{ + ... + +    if (op == REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMP) +        return processDbgGenerateDump(kco); +``` + + +``` +sai_status_t Syncd::processDbgGenerateDump( +        _In_ const swss::KeyOpFieldsValuesTuple &kco) +{ + ... + //call SAI dbgGenerateDump API +    sai_status_t status = m_vendorSai->dbgGenerateDump(file_path); + ... + //update ASIC DB with the result +    m_selectableChannel->set(sai_serialize_status(status), {} , REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMPRESPONSE); +    +    return status; +} +``` #### SAI API There are currently no new SAI APIs required for this feature. @@ -109,7 +251,9 @@ There is no impact on warmboot or fastboot ### Testing Requirements/Design #### Unit Test cases +execute dump file and make sure it exists +/usr/local/bin/gen_sai_dbg_dump.sh -f /tmp/my_dump_file.log #### System Test cases -Verify if the dump in techsupport contains the SAI failure dump is collected. +Verify if the dump in `show techsupport` contains the SAI dump file. diff --git a/doc/SAI_generate_debug_dump/images/generate_debug_dump_file.png b/doc/SAI_generate_debug_dump/images/generate_debug_dump_file.png new file mode 100644 index 0000000000000000000000000000000000000000..3560e28156f40cb557cda758d8a64763507999b5 GIT binary patch literal 41829 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 b(3?9a(Nkl8a^ZRq@S`B3DqZpHMZo_6l2RdI literal 0 HcmV?d00001 diff --git a/doc/SAI_generate_debug_dump/images/generate_dubug_dump_file.png b/doc/SAI_generate_debug_dump/images/generate_dubug_dump_file.png deleted file mode 100644 index 8f8b72c28cc2829e5f637ad1bca828ac8160aaaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41798 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 Date: Mon, 11 Nov 2024 19:20:15 +0200 Subject: [PATCH 3/7] update HLD Fixed Problems/New Changes: Should be Tested: Signed-off-by: aviramd --- .../SAI_generate_debug_dump.md | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md index 0813b1a706..34e8b08b48 100755 --- a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -13,7 +13,6 @@ - [Implementation](#implementation) - [generate_sai_dump bash script](#generate_sai_dump-bash-script) - [show techsupport](#show-techsupport) - - [gen_sai_dbg_dump.sh](#gen_sai_dbg_dump.sh) - [DbgGenDump orchestration](#DbgGenDump-orchestration) - [SAI global API sai_dbg_generate_dump](#SAI-global-API-sai-dbg_generate_dump) - [syncd extended operation](#syncd-extended-operation) @@ -76,7 +75,7 @@ The below diagram explains the generate debug dump file flow ### Implementation #### generate_sai_dump bash script -Introduced a new script `/usr/local/bin/gen_sai_dbg_dump_lib.sh` that can be invoked from `show techsupport` or any other command +Introduced a new script `/usr/local/bin/gen_sai_dbg_dump.sh` ``` ############################################################################### @@ -102,37 +101,11 @@ generate_sai_dump() { } ``` -#### APPL DB -Introduced a new Tables in APPL DB : - -``` -key = DBG_GEN_DUMP_TABLE:DUMP ; Unique identifier for gen dump file. -;field = value -file_name = STRING ; full path file to save the dump file. -``` - -Example: -``` -redis-cli -n 0 HGETALL "DBG_GEN_DUMP_TABLE:DUMP" -1) "file" -2) "/var/log/sai_dump_file.log" -``` - -wait for the dump generation result example: -``` -key = DBG_GEN_DUMP_STAUS_TABLE:DUMP ; Unique identifier for gen dump file result -;field = value -status = SAI_STATUS ; result status of file dump generation + The script also can be invoked from the CLI to generate the dump file directly under the given name (without calling `show techsupport` command): ``` - -Example: -``` -redis-cli -n 0 HGETALL "DBG_GEN_DUMP_STATUS_TABLE:DUMP" -1) "status" -2) "0" +/usr/local/bin/gen_sai_dbg_dump.sh -f /tmp/my_dump_file.log ``` - #### show techsupport Introduced a new generic API, `generate_sai_dbg_dump_file`, in `generate_dump.sh` (invoked by the `show techsupport` command) to create a debug dump file: @@ -166,18 +139,42 @@ usage: generate_sai_dbg_dump_file "sai_sdk_dump_$(date +"%m_%d_%Y_%I_%M_%p")" ``` -#### gen_sai_dbg_dump.sh -Introduced a new script `/usr/local/bin/gen_sai_dbg_dump.sh` that can be invoked from the CLI to generate the dump file directly under the given name (without calling `show techsupport` command) - -``` -/usr/local/bin/gen_sai_dbg_dump.sh -f /tmp/my_dump_file.log -``` #### DbgGenDump orchestration - A new orchestration agent, `DbgGenDumpOrch`, has been introduced, which is triggered by updates in the APPL DB. - It updates syncd by writing to the ASIC DB and waits for a response. Once received, it writes the result back to the APPL DB, allowing the calling application to retrieve the file. -#### ASIC DB +#### DB Enhancements + +Introduced a new Tables in APPL DB : + +``` +key = DBG_GEN_DUMP_TABLE:DUMP ; Unique identifier for gen dump file. +;field = value +file_name = STRING ; full path file to save the dump file. +``` + +Example: +``` +redis-cli -n 0 HGETALL "DBG_GEN_DUMP_TABLE:DUMP" +1) "file" +2) "/var/log/sai_dump_file.log" +``` + +wait for the dump generation result example: +``` +key = DBG_GEN_DUMP_STATUS_TABLE:DUMP ; Unique identifier for gen dump file result +;field = value +status = SAI_STATUS ; result status of file dump generation +``` + +Example: +``` +redis-cli -n 0 HGETALL "DBG_GEN_DUMP_STATUS_TABLE:DUMP" +1) "status" +2) "0" +``` + Introduced a new Tables in ASIC DB: ``` From 18c7d5f26918923a03a7e7fb9a651a62c18e056b Mon Sep 17 00:00:00 2001 From: aviramd <34716041+aviramd@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:16:02 +0200 Subject: [PATCH 4/7] Update SAI_generate_debug_dump.md --- doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md index 34e8b08b48..04100777c6 100755 --- a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -90,7 +90,7 @@ Introduced a new script `/usr/local/bin/gen_sai_dbg_dump.sh` # # Arguments: #  $1 - Filename for the SAI debug dump file. -#  $2 - Optional timeout for file readiness (default: 10 seconds). +#  $2 - Optional timeout for file readiness (default: 60 seconds). # # Returns: #  0 - On success From 0b9675377c98f42e01030dae35e734226fca6315 Mon Sep 17 00:00:00 2001 From: aviramd <34716041+aviramd@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:12:08 +0200 Subject: [PATCH 5/7] Update SAI_generate_debug_dump.md --- doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md index 04100777c6..aa7e78cc3b 100755 --- a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -57,6 +57,8 @@ This new feature allows users to generate a SAI debug dump file using `show tech ### Architecture Design +Adding a new infrastructure without changes in existing Sonic Architecture + 1. A user command, such as `show techsupport` triggers the `generate_sai_dump`, and creates a new table with the dump file name to create in the APPL DB. 2. A new orchestration agent, `DbgGenDumpOrch`, is triggered to handle the request. 3. `DbgGenDumpOrch` writes the file name to the ASIC DB and sets a new operation `REDIS_ASIC_STATE_COMMAND_DBG_GEN_DUMP` for syncd. From 0e9194b93652a2984e8d4da911af813cf46c215c Mon Sep 17 00:00:00 2001 From: aviramd <34716041+aviramd@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:25:52 +0200 Subject: [PATCH 6/7] Update SAI_generate_debug_dump.md --- doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md index aa7e78cc3b..b3ffe15a0b 100755 --- a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -55,6 +55,10 @@ This new feature allows users to generate a SAI debug dump file using `show tech + Generate a SAI debug dump file within the context of Syncd. + Maintain the existing mechanism for generating the SAI debug dump file on failure. +### Assumptions + +The SAI global API `sai_dbg_generate_dump` operates as a blocking function. + ### Architecture Design Adding a new infrastructure without changes in existing Sonic Architecture From 66836299c49f6958cc26dc5f34e72f5acf17dc8f Mon Sep 17 00:00:00 2001 From: aviramd <34716041+aviramd@users.noreply.github.com> Date: Mon, 18 Nov 2024 16:32:11 +0200 Subject: [PATCH 7/7] Update SAI_generate_debug_dump.md --- doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md index b3ffe15a0b..6a2d0936b1 100755 --- a/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md +++ b/doc/SAI_generate_debug_dump/SAI_generate_debug_dump.md @@ -44,7 +44,7 @@ The scope of this document is to design the handling of generating a SAI debug d ### Overview SAI dump file usually includes SDK info and configuration , SAI stats, capture of SAI lower layer states like registers vales etc... -Currently, the SAI dump file is generated only during SAI failures by executing a dedicated executable named "saisdkdump" (which linkage with the SAI lib during initialization and creates a new switch in redundant mode) +Currently, the SAI dump file is generated only during SAI failures by executing a dedicated executable named "saisdkdump" (which linkage with the SAI lib and during initialization it creates a new switch in redundant mode) This new feature allows users to generate a SAI debug dump file using `show tech-support` command, not necessarily during failure.