From b723136f2af14c6da7addecd110c8e7c7e2dafa0 Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Thu, 3 Mar 2022 22:14:48 -0700 Subject: [PATCH] proper ttl syntax on cache entries, begin work for purejs grpc server Signed-off-by: Travis Glenn Hansen --- bin/democratic-csi | 47 ++++++++++++++++++++++-------- package-lock.json | 2 +- package.json | 2 +- src/driver/controller-zfs/index.js | 24 +++++++++++++-- src/driver/freenas/http/api.js | 8 ++--- src/driver/freenas/ssh.js | 8 ++--- src/utils/grpc.js | 5 +++- 7 files changed, 68 insertions(+), 28 deletions(-) diff --git a/bin/democratic-csi b/bin/democratic-csi index 6e3e698..b6853a6 100755 --- a/bin/democratic-csi +++ b/bin/democratic-csi @@ -2,6 +2,7 @@ const yaml = require("js-yaml"); const fs = require("fs"); +const { grpc } = require("../src/utils/grpc"); let options; const args = require("yargs") @@ -78,8 +79,6 @@ if (!args.serverSocket && !args.serverAddress && !args.serverPort) { const package = require("../package.json"); args.version = package.version; -//const grpc = require("grpc"); -const grpc = require("grpc-uds"); const protoLoader = require("@grpc/proto-loader"); const LRU = require("lru-cache"); const cache = new LRU({ max: 500 }); @@ -335,16 +334,6 @@ logger.info( bindSocket ); -if (bindAddress) { - csiServer.bind(bindAddress, grpc.ServerCredentials.createInsecure()); -} - -if (bindSocket) { - csiServer.bind(bindSocket, grpc.ServerCredentials.createInsecure()); -} - -csiServer.start(); - [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`].forEach( (eventType) => { process.on(eventType, (code) => { @@ -359,3 +348,37 @@ csiServer.start(); }); } ); + +if (require.main === module) { + (async function () { + try { + if (bindAddress) { + await new Promise((resolve, reject) => { + csiServer.bindAsync( + bindAddress, + grpc.ServerCredentials.createInsecure(), + () => { + resolve(); + } + ); + }); + } + + if (bindSocket) { + await new Promise((resolve, reject) => { + csiServer.bindAsync( + bindSocket, + grpc.ServerCredentials.createInsecure(), + () => { + resolve(); + } + ); + }); + } + csiServer.start(); + } catch (e) { + console.log(e); + process.exit(1); + } + })(); +} diff --git a/package-lock.json b/package-lock.json index 4f46912..d98c9ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "democratic-csi", - "version": "1.5.3", + "version": "1.5.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6829e15..af7e238 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "democratic-csi", - "version": "1.5.4", + "version": "1.5.5", "description": "kubernetes csi driver framework", "main": "bin/democratic-csi", "scripts": { diff --git a/src/driver/controller-zfs/index.js b/src/driver/controller-zfs/index.js index f4ff64b..dc4fe5d 100644 --- a/src/driver/controller-zfs/index.js +++ b/src/driver/controller-zfs/index.js @@ -29,6 +29,8 @@ const VOLUME_CONTEXT_PROVISIONER_DRIVER_PROPERTY_NAME = const VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME = "democratic-csi:volume_context_provisioner_instance_id"; +const MAX_ZVOL_NAME_LENGTH_CACHE_KEY = "controller-zfs:max_zvol_name_length"; + /** * Base driver to provisin zfs assets using zfs cli commands. * Derived drivers only need to implement: @@ -413,6 +415,14 @@ class ControllerZfsBaseDriver extends CsiBaseDriver { let kernel; let kernel_release; + const cachedValue = await driver.ctx.cache.get( + MAX_ZVOL_NAME_LENGTH_CACHE_KEY + ); + + if (cachedValue) { + return cachedValue; + } + // get kernel command = "uname -s"; driver.ctx.logger.verbose("uname command: %s", command); @@ -423,12 +433,14 @@ class ControllerZfsBaseDriver extends CsiBaseDriver { kernel = response.stdout.trim(); } + let max; switch (kernel.toLowerCase().trim()) { // Linux is 255 (probably larger 4096) but scst may have a 255 limit // https://ngelinux.com/what-is-the-maximum-file-name-length-in-linux-and-how-to-see-this-is-this-really-255-characters-answer-is-no/ // https://github.com/dmeister/scst/blob/master/iscsi-scst/include/iscsi_scst.h#L28 case "linux": - return 255; + max = 255; + break; case "freebsd": // get kernel_release command = "uname -r"; @@ -444,14 +456,20 @@ class ControllerZfsBaseDriver extends CsiBaseDriver { let kernel_release_major = parts[0]; if (kernel_release_major >= 13) { - return 255; + max = 255; } else { - return 63; + max = 63; } } + break; default: throw new Error(`unknown kernel: ${kernel}`); } + + await driver.ctx.cache.set(MAX_ZVOL_NAME_LENGTH_CACHE_KEY, max, { + ttl: 60 * 1000, + }); + return max; } async setFilesystemMode(path, mode) { diff --git a/src/driver/freenas/http/api.js b/src/driver/freenas/http/api.js index 1832928..78db642 100644 --- a/src/driver/freenas/http/api.js +++ b/src/driver/freenas/http/api.js @@ -208,11 +208,9 @@ class Api { } async setVersionInfoCache(versionInfo) { - await this.cache.set( - FREENAS_SYSTEM_VERSION_CACHE_KEY, - versionInfo, - 60 * 1000 - ); + await this.cache.set(FREENAS_SYSTEM_VERSION_CACHE_KEY, versionInfo, { + ttl: 60 * 1000, + }); } async getSystemVersion() { diff --git a/src/driver/freenas/ssh.js b/src/driver/freenas/ssh.js index b15fa2a..11fa593 100644 --- a/src/driver/freenas/ssh.js +++ b/src/driver/freenas/ssh.js @@ -2011,11 +2011,9 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { async setVersionInfoCache(versionInfo) { const driver = this; - await driver.ctx.cache.set( - FREENAS_SYSTEM_VERSION_CACHE_KEY, - versionInfo, - 60 * 1000 - ); + await driver.ctx.cache.set(FREENAS_SYSTEM_VERSION_CACHE_KEY, versionInfo, { + ttl: 60 * 1000, + }); } async getSystemVersion() { diff --git a/src/utils/grpc.js b/src/utils/grpc.js index bf55380..f0eaeb3 100644 --- a/src/utils/grpc.js +++ b/src/utils/grpc.js @@ -7,4 +7,7 @@ class GrpcError { } module.exports.GrpcError = GrpcError; -module.exports.grpc = require("grpc-uds"); + +const grpcImplementation = process.env.GRPC_IMPLEMENTATION || "grpc-uds"; +console.log(`grpc implementation: ${grpcImplementation}`); +module.exports.grpc = require(grpcImplementation);