Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Песнь Хорьков и Гоферов

Песнь Хорьков и Гоферов

Alexey Palazhchenko

February 05, 2022
Tweet

More Decks by Alexey Palazhchenko

Other Decks in Programming

Transcript

  1. MongoDB • Отличное удобство для разработчиков • Рассылали iPad’ы за

    блог посты • Надёжность • Производительность
  2. MongoDB • Отличное удобство для разработчиков • Рассылали iPad’ы за

    блог посты • Надёжность • Производительность • Масштабируемость
  3. MongoDB • Отличное удобство для разработчиков • Рассылали iPad’ы за

    блог посты • Надёжность • Производительность • Масштабируемость
  4. MongoDB • Отличное удобство для разработчиков • Рассылали iPad’ы за

    блог посты • Надёжность • Производительность • Масштабируемость • … пытается делать всё сразу?
  5. MongoDB • Отличное удобство для разработчиков • Рассылали iPad’ы за

    блог посты • Надёжность • Производительность • Масштабируемость • … пытается делать всё сразу? • Изменения лицензии
  6. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» SSPL
  7. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин SSPL
  8. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» SSPL
  9. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» • «Including scripts to control those activities» SSPL
  10. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» • «Including scripts to control those activities» • «If you make the functionality of the Program» SSPL
  11. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» • «Including scripts to control those activities» • «If you make the functionality of the Program» • «available to third parties as a service» SSPL
  12. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» • «Including scripts to control those activities» • «If you make the functionality of the Program» • «available to third parties as a service» • «includes, without limitation, […]» –
 очень широко, не очень ясно SSPL
  13. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» • «Including scripts to control those activities» • «If you make the functionality of the Program» • «available to third parties as a service» • «includes, without limitation, […]» –
 очень широко, не очень ясно • «Service Source Code» SSPL
  14. AGPL v3 • «If you modify the Program» • «All

    users interacting with it remotely through a computer network» • «Interacting» – не термин • «Corresponding Source» • «Including scripts to control those activities» • «If you make the functionality of the Program» • «available to third parties as a service» • «includes, without limitation, […]» –
 очень широко, не очень ясно • «Service Source Code» • «including, without limitation, management software, user interfaces, application program interfaces, […], all such that a user could run an instance of the service using the Service Source Code you make available.» SSPL
  15. FerretDB • Прокси для MongoDB протокола
 для PostgreSQL • Принимает

    подключения от немодифицированных клиентов
  16. FerretDB • Прокси для MongoDB протокола
 для PostgreSQL • Принимает

    подключения от немодифицированных клиентов • Парсит BSON запросы
  17. FerretDB • Прокси для MongoDB протокола
 для PostgreSQL • Принимает

    подключения от немодифицированных клиентов • Парсит BSON запросы • Конвертирует из в SQL
  18. FerretDB • Прокси для MongoDB протокола
 для PostgreSQL • Принимает

    подключения от немодифицированных клиентов • Парсит BSON запросы • Конвертирует из в SQL • Отправляет в PostgreSQL
  19. FerretDB • Прокси для MongoDB протокола
 для PostgreSQL • Принимает

    подключения от немодифицированных клиентов • Парсит BSON запросы • Конвертирует из в SQL • Отправляет в PostgreSQL • Лицензия: Apache 2.0
  20. Generics • Что-то они для нас толком не работают; назад

    интерфейсы • Надо сделать самодостаточный пример для доклада
  21. Generics • Что-то они для нас толком не работают; назад

    интерфейсы • Надо сделать самодостаточный пример для доклада • Хм, а в них что-то есть!
  22. BSON документ • Ассоциативный массив с сохранением порядка (a.k.a. ordered

    map) • Ключи – строки, значения – любые, включая другие документы
  23. BSON документ • Ассоциативный массив с сохранением порядка (a.k.a. ordered

    map) • Ключи – строки, значения – любые, включая другие документы • Главная структура данных в FerretDB
  24. Interfaces type BSONType interface { bsontype() // sealed } type

    Int int func (Int) bsontype() {} type String string func (String) bsontype() {}
  25. Interfaces type BSONType interface { bsontype() // sealed } type

    Int int func (Int) bsontype() {} type String string func (String) bsontype() {} type Document struct { m map[string]BSONType keys []string } func (*Document) bsontype() {}
  26. Interfaces func (d *Document) Set(key string, value BSONType) { if

    _, ok := d.m[key]; !ok { d.keys = append(d.keys, key) } d.m[key] = value }
  27. Generics type BSONType interface { int | string | *Document

    } type Document struct { m map[string]any keys []string }
  28. Generics func (d *Document) Set[T BSONType](key string, value T) {

    if _, ok := d.m[key]; !ok { d.keys = append(d.keys, key) } d.m[key] = value }
  29. Generics func (d *Document) Set[T BSONType](key string, value T) {

    if _, ok := d.m[key]; !ok { d.keys = append(d.keys, key) } d.m[key] = value } syntax error: method must have no type parameters
  30. Generics func DocumentSet[T BSONType](d *Document, key string, value T) {

    if _, ok := d.m[key]; !ok { d.keys = append(d.keys, key) } d.m[key] = value }
  31. Interfaces func MakeDocument(pairs ...BSONType) (*Document, error) { l := len(pairs)

    if l%2 != 0 { return nil, fmt.Errorf("%d arguments", l)
  32. Generics func MakeDocument[T BSONType](key string, value T) *Document func MakeDocument2[T1,

    T2 BSONType](key1 string, value1 T1, key2 string, value2 T2) *Document
  33. Generics func MakeDocument[T BSONType](key string, value T) *Document func MakeDocument2[T1,

    T2 BSONType](key1 string, value1 T1, key2 string, value2 T2) *Document func MakeDocument3[T1, T2, T3 BSONType](key1 string, value1 T1, key2 string, value2 T2, key3 string, value3 T3) *Document
  34. Fuzzing • testing/quick на стероидах • https://go.dev/blog/fuzz-beta • Пакеты для

    парсинга MongoDB протокола • Использовали ещё до unit тестов
  35. Табличные тесты type testCase struct { name string b []byte

    v bsontype err error } • Декодировать b в (v2, err2) • сравнить с v / err • Закодировать v2 в b2 • сравнить с b
  36. Табличные тесты func TestDocument(t *testing.T) { for _, tc :=

    range testCases { tc := tc t.Run(tc.name, func(t *testing.T) {
  37. Fuzzing func FuzzDocument(f *testing.F) { for _, tc := range

    testCases { f.Add(tc.b) } f.Fuzz(func(t *testing.T, b []byte) {
  38. Когда b2 != b • b может быть больше, чем

    надо • Непрочитанную часть b нужно отрезать
  39. Когда b2 != b • b может быть больше, чем

    надо • Непрочитанную часть b нужно отрезать • Некоторые байты могут быть не важны
  40. Когда b2 != b • b может быть больше, чем

    надо • Непрочитанную часть b нужно отрезать • Некоторые байты могут быть не важны • Нужно использовать канонизацию (json.Compact и так далее)
  41. Проблемы fuzzing’а • Нет подтестов (testing.F.Run) • Безымянные значения seed

    corpus’а • Определение «зависания» не очень надёжно
 (с GOMAXPROCS по-умолчанию)
  42. Fuzzing • Нашли несколько багов в самом `go test -fuzz`

    • Нашли много багов в FerretDB • Для парсинга – самое то!
  43. Ссылки • https://github.com/AlekSi/ generics-vs-interfaces • https://github.com/akutz/
 go-generics-the-hard-way • https://go.dev/doc/tutorial/ •

    https://go.dev/doc/fuzz/ • https://www.ferretdb.io • https://github.com/FerretDB ⭐ • https://t.me/HowToGoWrong • https://github.com/AlekSi • @paaleksey