Skip to content

SettingsService#Merge and SettingsService#Write work incorrectly between daemon sessions #2275

Closed
@kittaakos

Description

@kittaakos

Describe the problem

Originally from arduino/arduino-ide#2185 (review).

When IDE2 sets the network#proxy to manual proxy settings, then unsets it in another daemon session, it does not work. It works perfectly when setting and then unsetting network#proxy within the same daemon session.

To reproduce

You need two shells.

In shell #1:

./arduino-cli version
arduino-cli  Version: 0.34.0 Commit: 304d48cd Date: 2023-08-23T08:01:50Z
cat ./my-cli-config.yaml
board_manager:
  additional_urls:
  - https://www.pjrc.com/teensy/package_issue1588_index.json
build_cache:
  compilations_before_purge: 10
  ttl: 720h0m0s
daemon:
  port: "50051"
directories:
  builtin:
    libraries: /Users/a.kitta/Library/Arduino15/libraries
  data: /Users/a.kitta/Library/Arduino15
  downloads: /Users/a.kitta/Library/Arduino15/staging
  user: /Users/a.kitta/Documents/Arduino
library:
  enable_unsafe_install: false
locale: en
logging:
  file: ""
  format: text
  level: info
metrics:
  addr: :9090
  enabled: true
output:
  no_color: false
sketch:
  always_export_binaries: false
updater:
  enable_notification: true
./arduino-cli daemon --config-file ./my-cli-config.yaml
Daemon is now listening on 127.0.0.1:50051
{"IP":"127.0.0.1","Port":"50051"}

In shell 2:

  1. Get all config values
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.GetAll | jq -r .jsonData | jq .
{
  "board_manager": {
    "additional_urls": [
      "https://www.pjrc.com/teensy/package_issue1588_index.json"
    ]
  },
  "build_cache": {
    "compilations_before_purge": 10,
    "ttl": "720h0m0s"
  },
  "daemon": {
    "port": "50051"
  },
  "directories": {
    "builtin": {
      "libraries": "/Users/a.kitta/Library/Arduino15/libraries"
    },
    "data": "/Users/a.kitta/Library/Arduino15",
    "downloads": "/Users/a.kitta/Library/Arduino15/staging",
    "user": "/Users/a.kitta/Documents/Arduino"
  },
  "library": {
    "enable_unsafe_install": false
  },
  "locale": "en",
  "logging": {
    "file": "",
    "format": "text",
    "level": "info"
  },
  "metrics": {
    "addr": ":9090",
    "enabled": true
  },
  "network": {
    "user_agent_ext": "daemon"
  },
  "output": {
    "no_color": false
  },
  "sketch": {
    "always_export_binaries": false
  },
  "updater": {
    "enable_notification": true
  }
}
  1. Compare with content on disk:
cat ./my-cli-config.yaml
board_manager:
  additional_urls:
   - https://www.pjrc.com/teensy/package_issue1588_index.json
build_cache:
  compilations_before_purge: 10
  ttl: 720h0m0s
daemon:
  port: "50051"
directories:
  builtin:
    libraries: /Users/a.kitta/Library/Arduino15/libraries
  data: /Users/a.kitta/Library/Arduino15
  downloads: /Users/a.kitta/Library/Arduino15/staging
  user: /Users/a.kitta/Documents/Arduino
library:
  enable_unsafe_install: false
locale: en
logging:
  file: ""
  format: text
  level: info
metrics:
  addr: :9090
  enabled: true
output:
  no_color: false
sketch:
  always_export_binaries: false
updater:
  enable_notification: true
  1. Update network#proxy config value with manual proxy settings
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  -d '{"jsonData": "{\n  \"board_manager\": {\n    \"additional_urls\": [\n      \"https://www.pjrc.com/teensy/package_issue1588_index.json\"\n    ]\n  },\n  \"build_cache\": {\n    \"compilations_before_purge\": 10,\n    \"ttl\": \"720h0m0s\"\n  },\n  \"daemon\": {\n    \"port\": \"50051\"\n  },\n  \"directories\": {\n    \"data\": \"/Users/a.kitta/Library/Arduino15\",\n    \"user\": \"/Users/a.kitta/Documents/Arduino\"\n  },\n  \"library\": {\n    \"enable_unsafe_install\": false\n  },\n  \"locale\": \"en\",\n  \"logging\": {\n    \"file\": \"\",\n    \"format\": \"text\",\n    \"level\": \"info\"\n  },\n  \"metrics\": {\n    \"addr\": \":9090\",\n    \"enabled\": true\n  },\n  \"output\": {\n    \"no_color\": false\n  },\n  \"sketch\": {\n    \"always_export_binaries\": false\n  },\n  \"updater\": {\n    \"enable_notification\": true\n  },\n  \"network\": {\n    \"proxy\": \"http://username:secret@hostename:1234/\"\n  }\n}"}' \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.Merge
{
  
}
  1. Write config state to disk
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  -d '{"filePath": "/Users/a.kitta/dev/git/arduino-cli/my-cli-config.yaml"}' \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.Write
{
  
}
  1. Verify network#proxy, manual proxy settings are configured
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.GetAll | jq -r .jsonData | jq .
{
  "board_manager": {
    "additional_urls": [
      "https://www.pjrc.com/teensy/package_issue1588_index.json"
    ]
  },
  "build_cache": {
    "compilations_before_purge": 10,
    "ttl": "720h0m0s"
  },
  "daemon": {
    "port": "50051"
  },
  "directories": {
    "builtin": {
      "libraries": "/Users/a.kitta/Library/Arduino15/libraries"
    },
    "data": "/Users/a.kitta/Library/Arduino15",
    "downloads": "/Users/a.kitta/Library/Arduino15/staging",
    "user": "/Users/a.kitta/Documents/Arduino"
  },
  "library": {
    "enable_unsafe_install": false
  },
  "locale": "en",
  "logging": {
    "file": "",
    "format": "text",
    "level": "info"
  },
  "metrics": {
    "addr": ":9090",
    "enabled": true
  },
  "network": {
    "proxy": "http://username:secret@hostename:1234/",
    "user_agent_ext": "daemon"
  },
  "output": {
    "no_color": false
  },
  "sketch": {
    "always_export_binaries": false
  },
  "updater": {
    "enable_notification": true
  }
}
cat ./my-cli-config.yaml
board_manager:
  additional_urls:
  - https://www.pjrc.com/teensy/package_issue1588_index.json
build_cache:
  compilations_before_purge: 10
  ttl: 720h0m0s
daemon:
  port: "50051"
directories:
  builtin:
    libraries: /Users/a.kitta/Library/Arduino15/libraries
  data: /Users/a.kitta/Library/Arduino15
  downloads: /Users/a.kitta/Library/Arduino15/staging
  user: /Users/a.kitta/Documents/Arduino
library:
  enable_unsafe_install: false
locale: en
logging:
  file: ""
  format: text
  level: info
metrics:
  addr: :9090
  enabled: true
network:
  proxy: http://username:secret@hostename:1234/
  user_agent_ext: daemon
output:
  no_color: false
sketch:
  always_export_binaries: false
updater:
  enable_notification: true

Terminate the CLI daemon process in shell 1 and restart it with ./arduino-cli daemon --config-file ./my-cli-config.yaml.
❗ The bug does not happen if you do not restart the daemon process but continue with the grpcurl commands in shell 2.


In shell 2:

  1. Unset network#proxy manual proxy configuration (using an empty object ({}))
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  -d '{"jsonData": "{\n  \"board_manager\": {\n    \"additional_urls\": [\n      \"https://www.pjrc.com/teensy/package_issue1588_index.json\"\n    ]\n  },\n  \"build_cache\": {\n    \"compilations_before_purge\": 10,\n    \"ttl\": \"720h0m0s\"\n  },\n  \"daemon\": {\n    \"port\": \"50051\"\n  },\n  \"directories\": {\n    \"data\": \"/Users/a.kitta/Library/Arduino15\",\n    \"user\": \"/Users/a.kitta/Documents/Arduino\"\n  },\n  \"library\": {\n    \"enable_unsafe_install\": false\n  },\n  \"locale\": \"en\",\n  \"logging\": {\n    \"file\": \"\",\n    \"format\": \"text\",\n    \"level\": \"info\"\n  },\n  \"metrics\": {\n    \"addr\": \":9090\",\n    \"enabled\": true\n  },\n  \"output\": {\n    \"no_color\": false\n  },\n  \"sketch\": {\n    \"always_export_binaries\": false\n  },\n  \"updater\": {\n    \"enable_notification\": true\n  },\n  \"network\": {}\n}"}' \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.Merge
{
  
}
  1. Write config state to disk
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  -d '{"filePath": "/Users/a.kitta/dev/git/arduino-cli/my-cli-config.yaml"}' \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.Write
{
  
}
  1. Verify network#proxy, manual proxy is not set (it is 🐛)
grpcurl \
  -plaintext \
  -import-path ./rpc \
  -proto cc/arduino/cli/settings/v1/settings.proto \
  127.0.0.1:50051 \
  cc.arduino.cli.settings.v1.SettingsService.GetAll | jq -r .jsonData | jq .
{
  "board_manager": {
    "additional_urls": [
      "https://www.pjrc.com/teensy/package_issue1588_index.json"
    ]
  },
  "build_cache": {
    "compilations_before_purge": 10,
    "ttl": "720h0m0s"
  },
  "daemon": {
    "port": "50051"
  },
  "directories": {
    "builtin": {
      "libraries": "/Users/a.kitta/Library/Arduino15/libraries"
    },
    "data": "/Users/a.kitta/Library/Arduino15",
    "downloads": "/Users/a.kitta/Library/Arduino15/staging",
    "user": "/Users/a.kitta/Documents/Arduino"
  },
  "library": {
    "enable_unsafe_install": false
  },
  "locale": "en",
  "logging": {
    "file": "",
    "format": "text",
    "level": "info"
  },
  "metrics": {
    "addr": ":9090",
    "enabled": true
  },
  "network": {
    "proxy": "http://username:secret@hostename:1234/",
    "user_agent_ext": "daemon"
  },
  "output": {
    "no_color": false
  },
  "sketch": {
    "always_export_binaries": false
  },
  "updater": {
    "enable_notification": true
  }
}
  1. Verify network#proxy by reading the CLI config from the disk, manual proxy is not set (it is 🐛)
cat ./my-cli-config.yaml
board_manager:
  additional_urls:
  - https://www.pjrc.com/teensy/package_issue1588_index.json
build_cache:
  compilations_before_purge: 10
  ttl: 720h0m0s
daemon:
  port: "50051"
directories:
  builtin:
    libraries: /Users/a.kitta/Library/Arduino15/libraries
  data: /Users/a.kitta/Library/Arduino15
  downloads: /Users/a.kitta/Library/Arduino15/staging
  user: /Users/a.kitta/Documents/Arduino
library:
  enable_unsafe_install: false
locale: en
logging:
  file: ""
  format: text
  level: info
metrics:
  addr: :9090
  enabled: true
network:
  proxy: http://username:secret@hostename:1234/
  user_agent_ext: daemon
output:
  no_color: false
sketch:
  always_export_binaries: false
updater:
  enable_notification: true

Expected behavior

SettingsService#Merge and SettingsService#Write behaves deterministically independently how many daemon session I start.

Arduino CLI version

0.34.0

Operating system

macOS

Operating system version

13.5

Additional context

Downstream ref: arduino/arduino-ide#2184

Issue checklist

  • I searched for previous reports in the issue tracker
  • I verified the problem still occurs when using the nightly build
  • My report contains all necessary details

Metadata

Metadata

Labels

topic: CLIRelated to the command line interfacetopic: gRPCRelated to the gRPC interfacetype: imperfectionPerceived defect in any part of project

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions