Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "kodo-browser",
"version": "2.3.1",
"version": "2.3.2",
"license": "Apache-2.0",
"author": {
"name": "Rong Zhou",
Expand Down Expand Up @@ -111,7 +111,7 @@
"form-data": "^4.0.0",
"js-base64": "^3.4.5",
"js-md5": "^0.7.3",
"kodo-s3-adapter-sdk": "0.6.1",
"kodo-s3-adapter-sdk": "0.7.0",
"lockfile": "^1.0.4",
"lodash": "^4.17.21",
"mime": "^2.3.1",
Expand Down
16 changes: 16 additions & 0 deletions src/common/ipc-actions/upload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export interface DestInfo {
}

export interface UploadOptions {
accelerateUploading: boolean,
isOverwrite: boolean,
storageClassName: StorageClass["kodoName"],
storageClasses: StorageClass[],
Expand All @@ -36,6 +37,7 @@ export enum UploadAction {
StopJobsByOffline = "StopJobsByOffline",
StartJobsByOnline = "StartJobsByOnline",
RemoveAllJobs = "RemoveAllJobs",
ClearRegionsCache = "ClearRegionsCache",

// common
UpdateUiData = "UpdateUiData",
Expand Down Expand Up @@ -177,6 +179,11 @@ export interface RemoveAllJobsMessage {
data?: {},
}

export interface ClearRegionsCacheMessage {
action: UploadAction.ClearRegionsCache,
data?: {},
}

export interface JobCompletedReplyMessage {
action: UploadAction.JobCompleted,
data: {
Expand Down Expand Up @@ -207,6 +214,7 @@ export type UploadMessage = UpdateConfigMessage
| StopJobsByOfflineMessage
| StartJobsByOnlineMessage
| RemoveAllJobsMessage
| ClearRegionsCacheMessage

export type UploadReplyMessage = UpdateUiDataReplyMessage
| AddedJobsReplyMessage
Expand Down Expand Up @@ -318,4 +326,12 @@ export class UploadActionFns {
data: {},
});
}

clearRegionsCache() {
// if only ucUrl and s3RegionId are provided,
// it will clear all regions cache
this.sender.send(this.channel, {
action: UploadAction.ClearRegionsCache,
});
}
}
17 changes: 17 additions & 0 deletions src/common/models/job/upload-job.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ interface RequiredOptions {
}

interface UploadOptions {
accelerateUploading: boolean,
multipartUploadThreshold: number, // Bytes
multipartUploadSize: number, // Bytes
multipartUploadConcurrency: number,
Expand Down Expand Up @@ -65,6 +66,7 @@ export type Options = RequiredOptions & Partial<OptionalOptions>
const DEFAULT_OPTIONS: OptionalOptions = {
id: "",

accelerateUploading: false,
multipartUploadThreshold: 10 * ByteSize.MB,
multipartUploadSize: 4 * ByteSize.MB,
multipartUploadConcurrency: 1,
Expand Down Expand Up @@ -100,6 +102,7 @@ type PersistInfo = {
// But It's also a risk, if business logic changes. Because we may get errors
// when restart job from break point with different backendMode.
backendMode: RequiredOptions["clientOptions"]["backendMode"],
accelerateUploading: OptionalOptions["accelerateUploading"],
prog: OptionalOptions["prog"],
status: Exclude<OptionalOptions["status"], Status.Waiting | Status.Running>,
message: OptionalOptions["message"],
Expand Down Expand Up @@ -137,6 +140,7 @@ export default class UploadJob extends TransferJob {
prog: persistInfo.prog,

clientOptions,
accelerateUploading: persistInfo.accelerateUploading,
storageClasses: persistInfo.storageClasses,

overwrite: persistInfo.overwrite,
Expand All @@ -162,6 +166,9 @@ export default class UploadJob extends TransferJob {
protected readonly options: Readonly<RequiredOptions & OptionalOptions>
private isForceOverwrite: boolean = false

// - for accelerate uploading
accelerateUploading: boolean = false

// - for resume from break point -
uploadedId: string
uploadedParts: UploadedPart[]
Expand All @@ -174,6 +181,7 @@ export default class UploadJob extends TransferJob {

this.options = lodash.merge({}, DEFAULT_OPTIONS, config);

this.accelerateUploading = this.options.accelerateUploading;
this.uploadedId = this.options.uploadedId;
this.uploadedParts = [
...this.options.uploadedParts,
Expand All @@ -193,6 +201,7 @@ export default class UploadJob extends TransferJob {
...super.uiData,
from: this.options.from,
to: this.options.to,
accelerateUploading: this.accelerateUploading,
};
}

Expand Down Expand Up @@ -276,6 +285,7 @@ export default class UploadJob extends TransferJob {
header: {
contentType: mime.getType(this.options.from.path),
},
accelerateUploading: this.accelerateUploading,
recovered: this.uploadedId && this.uploadedParts
? {
uploadId: this.uploadedId,
Expand Down Expand Up @@ -419,6 +429,7 @@ export default class UploadJob extends TransferJob {
overwrite: this.options.overwrite,
storageClassName: this.options.storageClassName,
backendMode: this.options.clientOptions.backendMode,
accelerateUploading: this.options.accelerateUploading,

// real-time info
prog: {
Expand Down Expand Up @@ -480,6 +491,12 @@ export default class UploadJob extends TransferJob {
this.uploadedId = "";
this.uploadedParts = [];
}
// handle accelerate uploading is not available
if (err.toString().includes("transfer acceleration is not configured")) {
this.accelerateUploading = false;
await this.retry();
return;
}

this._status = Status.Failed;
this.message = err.toString();
Expand Down
1 change: 1 addition & 0 deletions src/common/qiniu/_mock-helpers_/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Region } from "kodo-s3-adapter-sdk";

const mockDataOfRegionBase = {
upUrls: [],
upAccUrls: [],
ucUrls: [],
rsUrls: [],
rsfUrls: [],
Expand Down
6 changes: 6 additions & 0 deletions src/main/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,9 @@ ipcMain.on("UploaderManager", (event, message) => {
{
cwd: root,
silent: false,
execArgv: process.env.NODE_ENV === "development"
? ["--inspect=9222"]
: [],
},
);
forkedWorkers.set(processName, uploaderProcess);
Expand Down Expand Up @@ -294,6 +297,9 @@ ipcMain.on("DownloaderManager", (event, message) => {
{
cwd: root,
silent: false,
execArgv: process.env.NODE_ENV === "development"
? ["--inspect=9223"]
: [],
},
);
forkedWorkers.set(processName, downloaderProcess);
Expand Down
6 changes: 3 additions & 3 deletions src/main/kv-store/data-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ export class DataStore<T> {

constructor({
workingDirectory,
thresholdDuration,
thresholdSize,
thresholdChangesSize,
thresholdDuration, // ms, trigger compact when thresholdDuration elapsed after last compact
thresholdSize, // trigger compact when memTable size exceeds thresholdSize
thresholdChangesSize, // trigger compact when memTable changes size exceeds thresholdChangesSize

memTable,
memTableReadOnly,
Expand Down
1 change: 1 addition & 0 deletions src/main/transfer-managers/upload-manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ describe("test createUploadJobs", () => {
};

const MOCKED_UPLOAD_OPTIONS: UploadOptions = {
accelerateUploading: false,
isOverwrite: true,
storageClassName: "Standard",
storageClasses: [
Expand Down
1 change: 1 addition & 0 deletions src/main/transfer-managers/upload-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ export default class UploadManager extends TransferManager<UploadJob, Config> {
},

clientOptions,
accelerateUploading: uploadOptions.accelerateUploading,
storageClasses: uploadOptions.storageClasses,

overwrite: uploadOptions.isOverwrite,
Expand Down
5 changes: 5 additions & 0 deletions src/main/upload-worker.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {Region} from "kodo-s3-adapter-sdk";
import {KodoHttpClient} from "kodo-s3-adapter-sdk/dist/kodo-http-client";

import {
AddedJobsReplyMessage,
Expand Down Expand Up @@ -139,6 +140,10 @@ process.on("message", (message: UploadMessage) => {
uploadManager.removeAllJobs();
break;
}
case UploadAction.ClearRegionsCache: {
KodoHttpClient.clearCache();
break;
}
default: {
console.warn("Upload Manager received unknown action, message:", message);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ const ChangeStorageClassForm: React.FC<ChangeStorageClassFormProps> = ({

useEffect(() => {
reset({
storageClassKodoName: availableStorageClasses[0].kodoName,
storageClassKodoName: availableStorageClasses[0].kodoName ?? "Standard",
});
}, []);

Expand Down
25 changes: 13 additions & 12 deletions src/renderer/components/modals/file/create-dir-share-link/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,20 +115,23 @@ const CreateDirShareLink: React.FC<ModalProps & CreateDirShareLinkProps> = (prop
return;
}

let apiUrls: string[] = [];
let shareURL = new URL(`${DEFAULT_PORTAL_URL}/kodo-shares/verify`);
let portalOrigin = shareURL.origin;
const customShareUrl = currentUser.endpointType === EndpointType.Private
? DefaultDict.get("BASE_SHARE_URL")
: undefined;
if (customShareUrl) {
const parsedShareUrl = new URL(customShareUrl);
let customApiUrls: string[] = [];
try {
customApiUrls = await getShareApiHosts([parsedShareUrl.origin]);
} catch (err: any) {
toast.error(err.toString());
return;

let apiUrls: string[] = [];
try {
if (customShareUrl) {
shareURL = new URL(customShareUrl);
}
apiUrls = apiUrls.concat(customApiUrls);

portalOrigin = shareURL.origin;
apiUrls = await getShareApiHosts([portalOrigin]);
} catch (err: any) {
toast.error(err.toString());
return;
}

const p = createShare(
Expand All @@ -148,8 +151,6 @@ const CreateDirShareLink: React.FC<ModalProps & CreateDirShareLinkProps> = (prop
);

p.then(shareInfo => {
const baseShareUrl = customShareUrl || `${DEFAULT_PORTAL_URL}/kodo-shares/verify`;
const shareURL = new URL(baseShareUrl);
shareURL.searchParams.set("id", shareInfo.id);
shareURL.searchParams.set("token", shareInfo.token);
setShareLink(shareURL.toString());
Expand Down
Loading
Loading