Rust-rocksdb: Menghubungkan dengan sistem RocksDB

Dibuat pada 31 Mei 2019  ·  22Komentar  ·  Sumber: rust-rocksdb/rust-rocksdb

https://github.com/rust-rocksdb/rust-rocksdb/pull/166 memperkenalkan kemampuan untuk menautkan dengan instance rockdb yang sudah dibuat (seperti satu sistem terinstal di seluruh). Namun, itu mengharuskan Anda secara eksplisit memberikan jalur untuk mencari ( ROCKSDB_LIB_DIR , SNAPPY_LIB_DIR , dll.). Akan sangat rapi jika rocksdb-sys memeriksa apakah rocksdb dan snappy juga tersedia di lokasi OS standar (awalnya disarankan di https://github.com/rust- rockdb/rust-rocksdb/pull/166#issuecomment-389564525). Agak disayangkan harus melewati variabel lingkungan khusus setiap kali kami membangun meskipun pustaka tersebut diinstal di seluruh sistem.

Atau, bahkan hanya ROCKSDB_USE_SYSTEM=1 akan menjadi langkah maju.

Komentar yang paling membantu

Terkait dengan ini, alangkah baiknya jika variabel lingkungan ini didokumentasikan dalam README dan dokumen!

Semua 22 komentar

Terkait dengan ini, alangkah baiknya jika variabel lingkungan ini didokumentasikan dalam README dan dokumen!

Ini akan sangat berguna!

File build untuk openssl-sys mungkin merupakan tempat yang baik untuk mengambil inspirasi dari sini.

Saya sedang mengerjakan ini

@lovesegfault Bagaimana kemajuan Anda dalam hal ini? Membangun rockdb sejauh ini merupakan bagian terbesar dari waktu pembangunan proyek saya saat ini :cry:

Apa masalah menggunakan perpustakaan sistem sekarang? AFAIK, ini berfungsi melalui variabel pkg-config atau env dengan baik.

@aleksuss Nah, saat ini master , jika saya mencoba membangun librocksdb-sys , itu masih menghasilkan banyak contoh kompiler C++, meskipun saya telah menginstal rockdb sebagai perpustakaan seluruh sistem:

$ ls /usr/lib/librocksdb.so*
/usr/lib/librocksdb.so  /usr/lib/librocksdb.so.6  /usr/lib/librocksdb.so.6.5.3

Saya telah berhenti mengerjakan ini karena hal-hal lain diprioritaskan di kantor. Saya akan berlibur selama ~2 minggu ke depan, jadi semoga saya dapat mengambilnya kembali :)

Perhatikan bahwa #354 tidak menambahkan keajaiban penemuan perpustakaan. Sebagian besar karena RocksDB tidak mendukung pkg-config atau alat serupa lainnya.

Di masa depan, klausa sederhana yang mencari perpustakaan di tempat biasa jika envvar yang sesuai tidak disetel dapat dengan mudah ditambahkan.

Ah, begitu, jadi jika peti _currently_ gagal menemukan RocksDB di seluruh sistem, itu akan terus terjadi. Aku bertanya-tanya apa yang membuatnya gagal. Mungkin mencari _ persis_ versi yang sama dari .so , bukan hanya yang kompatibel?

Nah, peti saat ini akan berusaha menemukan sistem dan vendor rockdb jika tidak bisa. #354 berarti Anda memilih, melalui fitur, apakah ke vendor atau tidak. Jika Anda bukan vendor, maka Anda harus menyetel ROCKSDB_LIB_DIR dan jika tidak, Anda akan mendapatkan pesan kesalahan yang berguna.

Saya dapat menambahkan tindak lanjut yang mencoba menemukan lib jika envvar tidak disetel, saya biasanya bukan penggemar perilaku itu.

@lovesegfault Tidak yakin saya membacanya dengan benar? Jadi, Anda mengatakan bahwa saat ini, jika ROCKSDB_LIB_DIR _not_ disetel, lalu rockdb _will_ vendor? Dan cara _only_ untuk menghubungkannya dengan lib seluruh sistem adalah dengan mengatur ROCKSDB_LIB_DIR ?

Saya ingin tahu -- mengapa Anda menentang penggunaan pustaka sistem secara default? Vendor membawa _huge_ waktu kompilasi, dan saya tidak yakin apa keuntungannya?

@jonhoo
Perilaku Saat Ini
librocksdb-sys akan mencari ROCKSDB_LIB_DIR envvar. Jika disetel, ia akan menautkan ke .so di direktori itu. Jika tidak disetel, maka akan vendor rockdb sebagai alternatif. Perilaku _exact_ yang sama juga terjadi untuk pustaka kompresi seperti bzip2 , dengan variabelnya adalah BZIP2_LIB_DIR , misalnya.

Perilaku baru
librocksdb-sys memiliki fitur (default) baru vendor . Jika fitur itu diaktifkan, ia tidak akan mencoba mencari pustaka sistem apa pun, dengan cara apa pun. Sebaliknya itu akan vendor rocksdb dan semua perpustakaan kompresi.

Jika fitur vendor tidak diaktifkan, maka librocksdb-sys tidak akan, dengan cara apa pun, mencoba menjual pustaka apa pun, termasuk lib rockdb dan kompresi. Alih-alih, ia akan mencari envvars yang menginformasikannya tentang di mana menemukan perpustakaan yang diperlukan. Envvars ini dalam bentuk LIBNAME_LIB_DIR . Itu tidak akan mencoba untuk melakukan penemuan pustaka sistem, itu bergantung pada pengguna yang menentukannya, Jika Anda menonaktifkan vendor dan lupa untuk mengatur envvar yang sesuai, maka build akan gagal dengan pesan yang memberitahu Anda untuk mengatur lingkungan.

Kemungkinan perilaku masa depan
Di masa mendatang, ketika vendor dinonaktifkan, kita dapat mencoba melakukan penemuan pustaka sistem, sebagai fallback ketika envvars tidak disetel. Saya belum menerapkan ini, tetapi berencana untuk melakukannya ketika saya punya waktu.

Melakukan ini dengan fitur agak aneh, karena itu berarti jika _any_ crate di pohon ketergantungan Anda menyertakan rocksdb dengan set fitur vendor , maka RocksDB akan di-vendorkan. Itu tidak akan membuat banyak perbedaan untuk peti kecil, tetapi untuk biner besar yang mungkin memiliki banyak ketergantungan transitif pada RocksDB, kemungkinan besar tidak ada cara untuk keluar dari vendor..

@jonhoo Itu benar, bagaimana lagi Anda membayangkan ini bekerja?

IMHO seharusnya tidak ada vendor sama sekali, vendoring adalah akar dari semua kejahatan. Jika @aleksuss dan pengelola lain mengizinkannya, saya lebih suka menyingkirkan vendor bersama-sama.

Saya setuju dengan Anda -- solusinya adalah bukan vendor. Paling tidak, vendoring tidak boleh berada di set fitur default. Salah satu opsinya adalah membuat vendor ikut serta menggunakan variabel lingkungan.

Itu bisa dilakukan, @aleksuss @vitvakatu apa

Fitur memang sulit dikendalikan jika terjadi ketergantungan transitif, dan kompilasi RocksDB dari sumber membutuhkan banyak biaya (untuk proyek kami, peningkatan waktu pembuatan sekitar 30%!). Namun, saya tidak menyukai gagasan untuk menghapus vendor sepenuhnya. Pada beberapa platform kami tidak memiliki versi rockdb terbaru yang tersedia: kami bahkan terpaksa membuat PPA kami sendiri untuk distribusi Ubuntu yang lebih lama.

Jadi, saya lebih suka menyimpan perilaku saat ini, tetapi mungkin memperbaikinya (pencarian perpustakaan otomatis?). Mungkin kita harus memaksa pengguna untuk secara manual mengaktifkan vendoring (melalui env var), tetapi akan sedikit mengganggu untuk dependensi transitif juga.

Nah, pada master saat ini, jika saya mencoba membangun librocksdb-sys, itu masih menghasilkan banyak instance kompiler C++, meskipun saya telah menginstal rockdb sebagai perpustakaan seluruh sistem:

Ini juga terlihat sangat aneh dan mungkin harus diperbaiki.

@vitvakatu Ya, saya pikir "membalikkan" perilaku sehingga pengguna ikut serta ke vendor mungkin adalah cara yang tepat :)

Ini juga terlihat sangat aneh dan mungkin harus diperbaiki.

Perhatikan bahwa saya tidak memiliki set env vars, jadi saya yakin ini adalah perilaku yang dimaksudkan per hari ini?

Baiklah, saya membalikkan perilaku :)

@lovesegfault Saya pikir jika kita membalikkan perilaku, maka mungkin juga perlu build.rs mencari rocksdb di /usr/lib atau sesuatu secara default. Kalau tidak, sekelompok pengguna tiba-tiba akan mendapatkan kesalahan kompilasi karena mereka tidak memiliki set env var.

Baiklah, jadi pekerjaan yang tertunda adalah::

  • Penemuan perpustakaan
  • Ubah fitur vendor menjadi envvar
Apakah halaman ini membantu?
0 / 5 - 0 peringkat