Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Issue 1152543002: ServiceWorker: Migrate the script cache backend from BlockFile to Simple (Closed)

Created:
5 years, 7 months ago by nhiroki
Modified:
5 years, 6 months ago
CC:
chromium-reviews, jsbell+serviceworker_chromium.org, tzik, serviceworker-reviews, jam, darin-cc_chromium.org, horo+watch_chromium.org, kinuko+serviceworker, kinuko+watch, falken, yhirano
Base URL:
https://chromium.googlesource.com/chromium/src.git@master
Target Ref:
refs/pending/heads/master
Project:
chromium
Visibility:
Public.

Description

ServiceWorker: Migrate the script cache backend from BlockFile to Simple This CL switches the backend of ServiceWorkerDiskCache from BlockFile to Simple, and migrates cached resources before initializing the diskcache. * DiskCache migration consists of 2 parts: 1) Copying contents into a new diskcache. This should be complete before starting diskcache initialization. 2) Lazily removing an old diskcache after migration is complete. * These migration states are recorded in ServiceWorkerDatabase. If migration is aborted in the middle of the execution, the retry will happen on the next initialization. * If migration fails, DeleteAndStartOver runs and creates a new storage. BUG=487482 TEST=content_unittests --gtest_filter=ServiceWorker* TEST=content_browsertests --gtest_filter=ServiceWorker* TEST=manual (run Chromium with an old diskcache and make sure migration correctly happens) Committed: https://crrev.com/d1c9f9fbe26992894355b68f0445e03c2061908f Cr-Commit-Position: refs/heads/master@{#334811}

Patch Set 1 : #

Patch Set 2 : add uma and error handling (still needs to update histograms.xml) #

Patch Set 3 : update histograms.xml #

Total comments: 14

Patch Set 4 : address review comments #

Patch Set 5 : rebase #

Patch Set 6 : rebase #

Patch Set 7 : rebase #

Patch Set 8 : might fix win builds #

Patch Set 9 : check the old diskcache directory in ReadInitialDataFromDB #

Patch Set 10 : clean up #

Patch Set 11 : delete old disk cache directory on AbortLazyInitialize #

Patch Set 12 : [NOT READY FOR REVIEW] lazily migrate diskcache #

Patch Set 13 : update tests #

Total comments: 8

Patch Set 14 : rebase #

Patch Set 15 : incorporate falken@'s comments #

Total comments: 16

Patch Set 16 : move diskcache initialization from storage to migrator #

Patch Set 17 : NOT READY FOR REVIEW #

Patch Set 18 : introduce purgeable files #

Patch Set 19 : remove needs_disk_cache_migration #

Total comments: 18

Patch Set 20 : rebase on https://codereview.chromium.org/1181573002/ #

Patch Set 21 : remake #

Total comments: 19

Patch Set 22 : rebase #

Patch Set 23 : use PostAfterStartupTask #

Total comments: 4

Patch Set 24 : IsDiskCacheMigrationNeeded() and IsOldDiskCacheDeletionNeeded() #

Patch Set 25 : fix rebase failure #

Total comments: 8

Patch Set 26 : update comment #

Total comments: 12

Patch Set 27 : address falken@'s comments #

Total comments: 2

Patch Set 28 : UMA_HISTOGRAM_COUNTS #

Patch Set 29 : support the case that the old diskcache exists but the database does not #

Total comments: 2

Patch Set 30 : !defined(NDEBUG) #

Patch Set 31 : remove defined(UNIT_TEST) #

Patch Set 32 : rebase #

Unified diffs Side-by-side diffs Delta from patch set Stats (+670 lines, -38 lines) Patch
M base/metrics/histogram_macros.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1 chunk +3 lines, -0 lines 0 comments Download
M content/browser/appcache/appcache_disk_cache.h View 1 2 3 4 5 6 7 8 9 10 11 3 chunks +8 lines, -2 lines 0 comments Download
M content/browser/appcache/appcache_disk_cache.cc View 1 2 3 4 5 6 7 8 9 10 11 5 chunks +5 lines, -4 lines 0 comments Download
M content/browser/service_worker/service_worker_database.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 chunks +20 lines, -0 lines 0 comments Download
M content/browser/service_worker/service_worker_database.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 6 chunks +106 lines, -2 lines 0 comments Download
M content/browser/service_worker/service_worker_database_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 1 chunk +69 lines, -0 lines 0 comments Download
M content/browser/service_worker/service_worker_disk_cache_migrator.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1 chunk +3 lines, -0 lines 0 comments Download
M content/browser/service_worker/service_worker_disk_cache_migrator.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 5 chunks +26 lines, -1 line 0 comments Download
M content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 8 chunks +216 lines, -11 lines 0 comments Download
M content/browser/service_worker/service_worker_metrics.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 2 chunks +8 lines, -0 lines 0 comments Download
M content/browser/service_worker/service_worker_metrics.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 chunk +6 lines, -0 lines 0 comments Download
M content/browser/service_worker/service_worker_storage.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 9 chunks +36 lines, -8 lines 0 comments Download
M content/browser/service_worker/service_worker_storage.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 9 chunks +123 lines, -10 lines 0 comments Download
M content/browser/service_worker/service_worker_storage_unittest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 chunk +2 lines, -0 lines 0 comments Download
M tools/metrics/histograms/histograms.xml View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3 chunks +39 lines, -0 lines 0 comments Download

Messages

Total messages: 88 (35 generated)
nhiroki
Hi michaeln@ and kinuko@, Can you give me your early feedback on this? This is ...
5 years, 6 months ago (2015-05-28 10:14:22 UTC) #13
nhiroki
+falken@ to CC
5 years, 6 months ago (2015-05-29 07:28:17 UTC) #14
nhiroki
This is now ready for review. Removed WIP mark. Can you take a look? Thanks!
5 years, 6 months ago (2015-05-29 09:34:17 UTC) #16
falken
Looks like a good approach and code to me. https://codereview.chromium.org/1152543002/diff/280001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc File content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc (right): https://codereview.chromium.org/1152543002/diff/280001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc#newcode288 content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc:288: ...
5 years, 6 months ago (2015-06-01 04:31:50 UTC) #18
kinuko
(Haven't looked at the all files, but sending some comments) https://codereview.chromium.org/1152543002/diff/280001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc File content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc (right): https://codereview.chromium.org/1152543002/diff/280001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc#newcode278 ...
5 years, 6 months ago (2015-06-02 06:18:52 UTC) #19
nhiroki
Thank you for reviewing! Updated. https://codereview.chromium.org/1152543002/diff/280001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc File content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc (right): https://codereview.chromium.org/1152543002/diff/280001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc#newcode278 content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc:278: LazyInitialize(); On 2015/06/02 06:18:52, ...
5 years, 6 months ago (2015-06-02 09:18:33 UTC) #21
commit-bot: I haz the power
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1152543002/360001
5 years, 6 months ago (2015-06-03 13:33:16 UTC) #23
commit-bot: I haz the power
Dry run: Try jobs failed on following builders: ios_dbg_simulator_ninja on tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/ios_dbg_simulator_ninja/builds/31051) ios_rel_device_ninja on ...
5 years, 6 months ago (2015-06-03 13:36:42 UTC) #25
michaeln
i didn't get to this today, but i'll definitely take a look at this tomorrow
5 years, 6 months ago (2015-06-04 03:02:30 UTC) #26
michaeln
Gating first page load on migration completion has been bugging me. And contributing additional delays ...
5 years, 6 months ago (2015-06-05 01:16:15 UTC) #27
kinuko
On 2015/06/05 01:16:15, michaeln wrote: > Gating first page load on migration completion has been ...
5 years, 6 months ago (2015-06-05 01:42:03 UTC) #28
nhiroki
Thank you for reviewing! Michael's approach looks great. I'll work on it. On 2015/06/05 01:42:03, ...
5 years, 6 months ago (2015-06-05 02:16:22 UTC) #29
nhiroki
> > > **** To accomplish 2: > > > > > > Two parts: ...
5 years, 6 months ago (2015-06-05 03:18:28 UTC) #30
nhiroki
On 2015/06/05 03:18:28, nhiroki wrote: > > > > **** To accomplish 2: > > ...
5 years, 6 months ago (2015-06-05 03:58:24 UTC) #31
nhiroki
Updated! > > **** To accomplish 1: > > > > Store whether migration has ...
5 years, 6 months ago (2015-06-05 05:45:31 UTC) #32
nhiroki
On 2015/06/05 05:45:31, nhiroki wrote: > Updated! > > > > **** To accomplish 1: ...
5 years, 6 months ago (2015-06-05 06:02:17 UTC) #33
michaeln
> Checking in the same task would be feasible. Additional fields in the database > ...
5 years, 6 months ago (2015-06-05 19:35:41 UTC) #34
nhiroki
Thank you for your comments! Replies only. On 2015/06/05 19:35:41, michaeln wrote: > > Checking ...
5 years, 6 months ago (2015-06-06 01:34:29 UTC) #35
nhiroki
Updated! The patchset 13 should accomplish the goal (2). Can you take another look? Thanks!
5 years, 6 months ago (2015-06-08 07:45:41 UTC) #37
falken
Some quick comments. BTW I've started using "git-cl lint" on my patches, you might want ...
5 years, 6 months ago (2015-06-08 09:05:54 UTC) #38
nhiroki
Thank you! Updated. https://codereview.chromium.org/1152543002/diff/510001/content/browser/service_worker/service_worker_disk_cache_migrator.h File content/browser/service_worker/service_worker_disk_cache_migrator.h (right): https://codereview.chromium.org/1152543002/diff/510001/content/browser/service_worker/service_worker_disk_cache_migrator.h#newcode4 content/browser/service_worker/service_worker_disk_cache_migrator.h:4: On 2015/06/08 09:05:54, falken wrote: > ...
5 years, 6 months ago (2015-06-08 09:29:22 UTC) #39
michaeln
This is looking pretty good. I've got some questions when it comes to migration error ...
5 years, 6 months ago (2015-06-08 21:36:34 UTC) #40
nhiroki
Thank you for carefully reviewing! Updated the patchset. https://codereview.chromium.org/1152543002/diff/550001/content/browser/service_worker/service_worker_storage.cc File content/browser/service_worker/service_worker_storage.cc (right): https://codereview.chromium.org/1152543002/diff/550001/content/browser/service_worker/service_worker_storage.cc#newcode1002 content/browser/service_worker/service_worker_storage.cc:1002: needs_disk_cache_migration_ ...
5 years, 6 months ago (2015-06-09 15:41:57 UTC) #47
michaeln
sorry for the delay https://codereview.chromium.org/1152543002/diff/750001/content/browser/service_worker/service_worker_database.cc File content/browser/service_worker/service_worker_database.cc (right): https://codereview.chromium.org/1152543002/diff/750001/content/browser/service_worker/service_worker_database.cc#newcode76 content/browser/service_worker/service_worker_database.cc:76: // key: "INITDATA_DISKCACHE_VERSION" It feels ...
5 years, 6 months ago (2015-06-11 00:52:38 UTC) #48
nhiroki
Thank you for reviewing!! Hmmm... I've kept this as one CL in order to easily ...
5 years, 6 months ago (2015-06-11 02:17:43 UTC) #49
nhiroki
Updated. I hope this version works well...! https://codereview.chromium.org/1152543002/diff/750001/content/browser/service_worker/service_worker_database.cc File content/browser/service_worker/service_worker_database.cc (right): https://codereview.chromium.org/1152543002/diff/750001/content/browser/service_worker/service_worker_database.cc#newcode76 content/browser/service_worker/service_worker_database.cc:76: // key: ...
5 years, 6 months ago (2015-06-11 21:04:50 UTC) #50
michaeln
This is shaping up pretty good. https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h (right): https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_database.h#newcode106 content/browser/service_worker/service_worker_database.h:106: DISKCACHE_MIGRATED, Can MIGRATED ...
5 years, 6 months ago (2015-06-12 01:55:46 UTC) #51
nhiroki
Thanks! I have a question about the NOT_NEEDED case (see my comment) https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_storage.cc File content/browser/service_worker/service_worker_storage.cc ...
5 years, 6 months ago (2015-06-12 03:12:14 UTC) #52
nhiroki
https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_storage.cc File content/browser/service_worker/service_worker_storage.cc (right): https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_storage.cc#newcode1447 content/browser/service_worker/service_worker_storage.cc:1447: case ServiceWorkerDatabase::DISKCACHE_NOT_USED: { On 2015/06/12 03:12:14, nhiroki wrote: > ...
5 years, 6 months ago (2015-06-12 03:32:34 UTC) #53
michaeln
i was having a hard time reasoning about it, so i tried to dumb it ...
5 years, 6 months ago (2015-06-12 20:47:58 UTC) #54
nhiroki
Thank you! Updated. https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_database.cc File content/browser/service_worker/service_worker_database.cc (right): https://codereview.chromium.org/1152543002/diff/790001/content/browser/service_worker/service_worker_database.cc#newcode5 content/browser/service_worker/service_worker_database.cc:5: #include "content/browser/service_worker/service_worker_database.h" On 2015/06/12 20:47:57, michaeln ...
5 years, 6 months ago (2015-06-15 16:43:27 UTC) #56
michaeln
lgtm, maybe ping matt or kinuko want to take another look too https://codereview.chromium.org/1152543002/diff/890001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h ...
5 years, 6 months ago (2015-06-15 23:03:25 UTC) #57
nhiroki
Thank you for patiently reviewing! https://codereview.chromium.org/1152543002/diff/890001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h (right): https://codereview.chromium.org/1152543002/diff/890001/content/browser/service_worker/service_worker_database.h#newcode380 content/browser/service_worker/service_worker_database.h:380: // kOldDiskCacheDeletionNotNeededKey when initializing ...
5 years, 6 months ago (2015-06-16 03:46:25 UTC) #58
nhiroki
falken@, kinuko@: This CL was drastically changed after you reviewed. Can you take a second ...
5 years, 6 months ago (2015-06-16 03:55:53 UTC) #59
nhiroki
+asvitkine@ for histograms.xml owner
5 years, 6 months ago (2015-06-16 03:57:55 UTC) #61
falken
lgtm https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h (right): https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_database.h#newcode380 content/browser/service_worker/service_worker_database.h:380: void set_skip_writing_diskcache_migration_state_on_init() { nit: can you add "_for_testing" ...
5 years, 6 months ago (2015-06-16 04:28:11 UTC) #62
nhiroki
Thank you! Updated. https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h (right): https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_database.h#newcode380 content/browser/service_worker/service_worker_database.h:380: void set_skip_writing_diskcache_migration_state_on_init() { On 2015/06/16 04:28:10, ...
5 years, 6 months ago (2015-06-16 07:12:16 UTC) #63
Alexei Svitkine (slow)
https://codereview.chromium.org/1152543002/diff/930001/content/browser/service_worker/service_worker_disk_cache_migrator.cc File content/browser/service_worker/service_worker_disk_cache_migrator.cc (right): https://codereview.chromium.org/1152543002/diff/930001/content/browser/service_worker/service_worker_disk_cache_migrator.cc#newcode54 content/browser/service_worker/service_worker_disk_cache_migrator.cc:54: migrated_resources, 1, 1000, 50); This looks like an UMA_HISTOGRAM_COUNTS_1000, ...
5 years, 6 months ago (2015-06-16 15:31:15 UTC) #64
nhiroki
Thanks! Updated. https://codereview.chromium.org/1152543002/diff/930001/content/browser/service_worker/service_worker_disk_cache_migrator.cc File content/browser/service_worker/service_worker_disk_cache_migrator.cc (right): https://codereview.chromium.org/1152543002/diff/930001/content/browser/service_worker/service_worker_disk_cache_migrator.cc#newcode54 content/browser/service_worker/service_worker_disk_cache_migrator.cc:54: migrated_resources, 1, 1000, 50); On 2015/06/16 15:31:15, ...
5 years, 6 months ago (2015-06-16 16:32:26 UTC) #65
Alexei Svitkine (slow)
lgtm
5 years, 6 months ago (2015-06-16 18:07:00 UTC) #66
michaeln
https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc File content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc (right): https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc#newcode498 content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc:498: EXPECT_TRUE(base::DirectoryExists(storage()->GetOldDiskCachePath())); On 2015/06/16 07:12:16, nhiroki wrote: > On 2015/06/16 ...
5 years, 6 months ago (2015-06-16 20:50:24 UTC) #67
nhiroki
https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc File content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc (right): https://codereview.chromium.org/1152543002/diff/910001/content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc#newcode498 content/browser/service_worker/service_worker_disk_cache_migrator_unittest.cc:498: EXPECT_TRUE(base::DirectoryExists(storage()->GetOldDiskCachePath())); On 2015/06/16 20:50:24, michaeln wrote: > On 2015/06/16 ...
5 years, 6 months ago (2015-06-17 01:01:53 UTC) #68
nhiroki
https://codereview.chromium.org/1152543002/diff/970001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h (right): https://codereview.chromium.org/1152543002/diff/970001/content/browser/service_worker/service_worker_database.h#newcode379 content/browser/service_worker/service_worker_database.h:379: #if defined(UNIT_TEST) Hmmm... only win_chromium_compile_dbg_ng fails to link this ...
5 years, 6 months ago (2015-06-17 02:17:55 UTC) #69
nhiroki
https://codereview.chromium.org/1152543002/diff/970001/content/browser/service_worker/service_worker_database.h File content/browser/service_worker/service_worker_database.h (right): https://codereview.chromium.org/1152543002/diff/970001/content/browser/service_worker/service_worker_database.h#newcode379 content/browser/service_worker/service_worker_database.h:379: #if defined(UNIT_TEST) On 2015/06/17 02:17:55, nhiroki wrote: > Hmmm... ...
5 years, 6 months ago (2015-06-17 05:41:06 UTC) #70
commit-bot: I haz the power
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1152543002/1010001
5 years, 6 months ago (2015-06-17 05:42:13 UTC) #73
nhiroki
On 2015/06/17 05:41:06, nhiroki wrote: > (yhirano@ kindly helped me investigate, thank you!) +yhirano@ to ...
5 years, 6 months ago (2015-06-17 05:43:23 UTC) #74
commit-bot: I haz the power
Dry run: Try jobs failed on following builders: chromium_presubmit on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/chromium_presubmit/builds/71524)
5 years, 6 months ago (2015-06-17 05:50:55 UTC) #76
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1152543002/1030001
5 years, 6 months ago (2015-06-17 07:30:39 UTC) #79
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1152543002/1030001
5 years, 6 months ago (2015-06-17 07:33:43 UTC) #82
commit-bot: I haz the power
Try jobs failed on following builders: linux_chromium_gn_rel on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_gn_rel/builds/100202)
5 years, 6 months ago (2015-06-17 09:43:16 UTC) #84
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1152543002/1030001
5 years, 6 months ago (2015-06-17 11:06:56 UTC) #86
commit-bot: I haz the power
Committed patchset #32 (id:1030001)
5 years, 6 months ago (2015-06-17 11:45:37 UTC) #87
commit-bot: I haz the power
5 years, 6 months ago (2015-06-17 11:46:34 UTC) #88
Message was sent while issue was closed.
Patchset 32 (id:??) landed as
https://crrev.com/d1c9f9fbe26992894355b68f0445e03c2061908f
Cr-Commit-Position: refs/heads/master@{#334811}

Powered by Google App Engine
This is Rietveld 408576698